Imported Upstream version 3.13.6
[platform/upstream/nss.git] / mozilla / security / nss / lib / freebl / mpi / utils / isprime.c
1 /*
2  *  isprime.c
3  *
4  *  Probabilistic primality tester command-line tool
5  *
6  * ***** BEGIN LICENSE BLOCK *****
7  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
8  *
9  * The contents of this file are subject to the Mozilla Public License Version
10  * 1.1 (the "License"); you may not use this file except in compliance with
11  * the License. You may obtain a copy of the License at
12  * http://www.mozilla.org/MPL/
13  *
14  * Software distributed under the License is distributed on an "AS IS" basis,
15  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16  * for the specific language governing rights and limitations under the
17  * License.
18  *
19  * The Original Code is the MPI Arbitrary Precision Integer Arithmetic library.
20  *
21  * The Initial Developer of the Original Code is
22  * Michael J. Fromberger.
23  * Portions created by the Initial Developer are Copyright (C) 1998
24  * the Initial Developer. All Rights Reserved.
25  *
26  * Contributor(s):
27  *
28  * Alternatively, the contents of this file may be used under the terms of
29  * either the GNU General Public License Version 2 or later (the "GPL"), or
30  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31  * in which case the provisions of the GPL or the LGPL are applicable instead
32  * of those above. If you wish to allow use of your version of this file only
33  * under the terms of either the GPL or the LGPL, and not to allow others to
34  * use your version of this file under the terms of the MPL, indicate your
35  * decision by deleting the provisions above and replace them with the notice
36  * and other provisions required by the GPL or the LGPL. If you do not delete
37  * the provisions above, a recipient may use your version of this file under
38  * the terms of any one of the MPL, the GPL or the LGPL.
39  *
40  * ***** END LICENSE BLOCK ***** */
41 /* $Id: isprime.c,v 1.3 2004/04/27 23:04:37 gerv%gerv.net Exp $ */
42
43 #include <stdio.h>
44 #include <stdlib.h>
45 #include <string.h>
46
47 #include "mpi.h"
48 #include "mpprime.h"
49
50 #define  RM_TESTS       15   /* how many iterations of Rabin-Miller? */
51 #define  MINIMUM        1024 /* don't bother us with a < this        */
52
53 int      g_tests = RM_TESTS;
54 char    *g_prog = NULL;
55
56 int main(int argc, char *argv[])
57 {
58   mp_int   a;
59   mp_digit np = prime_tab_size; /* from mpprime.h */
60   int      res = 0;
61
62   g_prog = argv[0];
63
64   if(argc < 2) {
65     fprintf(stderr, "Usage: %s <a>, where <a> is a decimal integer\n"
66             "Use '0x' prefix for a hexadecimal value\n", g_prog);
67     return 1;
68   }
69
70   /* Read number of tests from environment, if present */
71   {
72     char *tmp;
73
74     if((tmp = getenv("RM_TESTS")) != NULL) {
75       if((g_tests = atoi(tmp)) <= 0)
76         g_tests = RM_TESTS;
77     }
78   }
79
80   mp_init(&a);
81   if(argv[1][0] == '0' && argv[1][1] == 'x')
82     mp_read_radix(&a, argv[1] + 2, 16);
83   else
84     mp_read_radix(&a, argv[1], 10);
85
86   if(mp_cmp_d(&a, MINIMUM) <= 0) {
87     fprintf(stderr, "%s: please use a value greater than %d\n", 
88             g_prog, MINIMUM);
89     mp_clear(&a);
90     return 1;
91   }
92
93   /* Test for divisibility by small primes */
94   if(mpp_divis_primes(&a, &np) != MP_NO) {
95     printf("Not prime (divisible by small prime %d)\n", np);
96     res = 2;
97     goto CLEANUP;
98   }
99
100   /* Test with Fermat's test, using 2 as a witness */
101   if(mpp_fermat(&a, 2) != MP_YES) {
102     printf("Not prime (failed Fermat test)\n");
103     res = 2;
104     goto CLEANUP;
105   }
106  
107   /* Test with Rabin-Miller probabilistic test */
108   if(mpp_pprime(&a, g_tests) == MP_NO) {
109       printf("Not prime (failed pseudoprime test)\n");
110       res = 2;
111       goto CLEANUP;
112   }
113
114   printf("Probably prime, 1 in 4^%d chance of false positive\n", g_tests);
115
116 CLEANUP:
117   mp_clear(&a);
118   
119   return res;
120
121 }