3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
6 /* ====================================================================
7 * Copyright (c) 2005,2007 The OpenSSL Project. All rights reserved.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
21 * 3. All advertising materials mentioning features or use of this
22 * software must display the following acknowledgment:
23 * "This product includes software developed by the OpenSSL Project
24 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
26 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27 * endorse or promote products derived from this software without
28 * prior written permission. For written permission, please contact
29 * licensing@OpenSSL.org.
31 * 5. Products derived from this software may not be called "OpenSSL"
32 * nor may "OpenSSL" appear in their names without prior written
33 * permission of the OpenSSL Project.
35 * 6. Redistributions of any form whatsoever must retain the following
37 * "This product includes software developed by the OpenSSL Project
38 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
40 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51 * OF THE POSSIBILITY OF SUCH DAMAGE.
52 * ====================================================================
54 * This product includes cryptographic software written by Eric Young
55 * (eay@cryptsoft.com). This product includes software written by Tim
56 * Hudson (tjh@cryptsoft.com).
63 #include <openssl/bio.h>
64 #include <openssl/evp.h>
65 #include <openssl/hmac.h>
66 #include <openssl/err.h>
67 #include <openssl/bn.h>
68 #include <openssl/x509v3.h>
72 int main(int argc, char *argv[])
74 printf("No FIPS RSA support\n");
80 # include <openssl/rsa.h>
81 # include "fips_utl.h"
83 int rsa_test(FILE *out, FILE *in);
84 static int rsa_printkey1(FILE *out, RSA *rsa,
85 BIGNUM *Xp1, BIGNUM *Xp2, BIGNUM *Xp, BIGNUM *e);
86 static int rsa_printkey2(FILE *out, RSA *rsa,
87 BIGNUM *Xq1, BIGNUM *Xq2, BIGNUM *Xq);
89 int main(int argc, char **argv)
91 FILE *in = NULL, *out = NULL;
95 if (!FIPS_mode_set(1)) {
103 in = fopen(argv[1], "r");
108 out = fopen(argv[2], "w");
111 fprintf(stderr, "FATAL input initialization error\n");
116 fprintf(stderr, "FATAL output initialization error\n");
120 if (!rsa_test(out, in)) {
121 fprintf(stderr, "FATAL RSAGTEST file processing error\n");
131 if (in && (in != stdin))
133 if (out && (out != stdout))
140 # define RSA_TEST_MAXLINELEN 10240
142 int rsa_test(FILE *out, FILE *in)
144 char *linebuf, *olinebuf, *p, *q;
145 char *keyword, *value;
147 BIGNUM *Xp1 = NULL, *Xp2 = NULL, *Xp = NULL;
148 BIGNUM *Xq1 = NULL, *Xq2 = NULL, *Xq = NULL;
153 olinebuf = OPENSSL_malloc(RSA_TEST_MAXLINELEN);
154 linebuf = OPENSSL_malloc(RSA_TEST_MAXLINELEN);
156 if (!linebuf || !olinebuf)
159 while (fgets(olinebuf, RSA_TEST_MAXLINELEN, in)) {
161 strcpy(linebuf, olinebuf);
163 /* Skip leading space */
164 while (isspace((unsigned char)*keyword))
167 /* Look for = sign */
168 p = strchr(linebuf, '=');
171 * If no = or starts with [ (for [foo = bar] line) just copy
173 if (!p || *keyword == '[') {
174 if (fputs(olinebuf, out) < 0)
181 /* Remove trailing space */
182 while (isspace((unsigned char)*q))
188 /* Remove leading space from value */
189 while (isspace((unsigned char)*value))
192 /* Remove trailing space from value */
193 p = value + strlen(value) - 1;
195 while (*p == '\n' || isspace((unsigned char)*p))
198 if (!strcmp(keyword, "xp1")) {
199 if (Xp1 || !do_hex2bn(&Xp1, value))
201 } else if (!strcmp(keyword, "xp2")) {
202 if (Xp2 || !do_hex2bn(&Xp2, value))
204 } else if (!strcmp(keyword, "Xp")) {
205 if (Xp || !do_hex2bn(&Xp, value))
207 } else if (!strcmp(keyword, "xq1")) {
208 if (Xq1 || !do_hex2bn(&Xq1, value))
210 } else if (!strcmp(keyword, "xq2")) {
211 if (Xq2 || !do_hex2bn(&Xq2, value))
213 } else if (!strcmp(keyword, "Xq")) {
214 if (Xq || !do_hex2bn(&Xq, value))
216 } else if (!strcmp(keyword, "e")) {
217 if (e || !do_hex2bn(&e, value))
219 } else if (!strcmp(keyword, "p1"))
221 else if (!strcmp(keyword, "p2"))
223 else if (!strcmp(keyword, "p"))
225 else if (!strcmp(keyword, "q1"))
227 else if (!strcmp(keyword, "q2"))
229 else if (!strcmp(keyword, "q"))
231 else if (!strcmp(keyword, "n"))
233 else if (!strcmp(keyword, "d"))
238 fputs(olinebuf, out);
240 if (e && Xp1 && Xp2 && Xp) {
241 rsa = FIPS_rsa_new();
244 if (!rsa_printkey1(out, rsa, Xp1, Xp2, Xp, e))
256 if (rsa && Xq1 && Xq2 && Xq) {
257 if (!rsa_printkey2(out, rsa, Xq1, Xq2, Xq))
275 OPENSSL_free(olinebuf);
277 OPENSSL_free(linebuf);
302 fprintf(stderr, "FATAL parse error processing line %d\n", lnum);
308 static int rsa_printkey1(FILE *out, RSA *rsa,
309 BIGNUM *Xp1, BIGNUM *Xp2, BIGNUM *Xp, BIGNUM *e)
312 BIGNUM *p1 = NULL, *p2 = NULL;
318 if (!RSA_X931_derive_ex(rsa, p1, p2, NULL, NULL, Xp1, Xp2, Xp,
319 NULL, NULL, NULL, e, NULL))
322 do_bn_print_name(out, "p1", p1);
323 do_bn_print_name(out, "p2", p2);
324 do_bn_print_name(out, "p", rsa->p);
337 static int rsa_printkey2(FILE *out, RSA *rsa,
338 BIGNUM *Xq1, BIGNUM *Xq2, BIGNUM *Xq)
341 BIGNUM *q1 = NULL, *q2 = NULL;
347 if (!RSA_X931_derive_ex(rsa, NULL, NULL, q1, q2, NULL, NULL, NULL,
348 Xq1, Xq2, Xq, NULL, NULL))
351 do_bn_print_name(out, "q1", q1);
352 do_bn_print_name(out, "q2", q2);
353 do_bn_print_name(out, "q", rsa->q);
354 do_bn_print_name(out, "n", rsa->n);
355 do_bn_print_name(out, "d", rsa->d);