~ubuntu-branches/ubuntu/lucid/openssl/lucid-proposed

« back to all changes in this revision

Viewing changes to fips/rsa/fips_rsavtest.c

  • Committer: Bazaar Package Importer
  • Author(s): Kurt Roeckx
  • Date: 2009-06-13 18:15:46 UTC
  • mto: (11.1.5 squeeze)
  • mto: This revision was merged to the branch mainline in revision 34.
  • Revision ID: james.westby@ubuntu.com-20090613181546-vbfntai3b009dl1u
Tags: upstream-0.9.8k
ImportĀ upstreamĀ versionĀ 0.9.8k

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* fips_rsavtest.c */
 
2
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 
3
 * project 2005.
 
4
 */
 
5
/* ====================================================================
 
6
 * Copyright (c) 2005 The OpenSSL Project.  All rights reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 *
 
12
 * 1. Redistributions of source code must retain the above copyright
 
13
 *    notice, this list of conditions and the following disclaimer. 
 
14
 *
 
15
 * 2. Redistributions in binary form must reproduce the above copyright
 
16
 *    notice, this list of conditions and the following disclaimer in
 
17
 *    the documentation and/or other materials provided with the
 
18
 *    distribution.
 
19
 *
 
20
 * 3. All advertising materials mentioning features or use of this
 
21
 *    software must display the following acknowledgment:
 
22
 *    "This product includes software developed by the OpenSSL Project
 
23
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 
24
 *
 
25
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 
26
 *    endorse or promote products derived from this software without
 
27
 *    prior written permission. For written permission, please contact
 
28
 *    licensing@OpenSSL.org.
 
29
 *
 
30
 * 5. Products derived from this software may not be called "OpenSSL"
 
31
 *    nor may "OpenSSL" appear in their names without prior written
 
32
 *    permission of the OpenSSL Project.
 
33
 *
 
34
 * 6. Redistributions of any form whatsoever must retain the following
 
35
 *    acknowledgment:
 
36
 *    "This product includes software developed by the OpenSSL Project
 
37
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 
38
 *
 
39
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 
40
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
41
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
42
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 
43
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 
44
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
45
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
46
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
47
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 
48
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
49
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 
50
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 
51
 * ====================================================================
 
52
 *
 
53
 * This product includes cryptographic software written by Eric Young
 
54
 * (eay@cryptsoft.com).  This product includes software written by Tim
 
55
 * Hudson (tjh@cryptsoft.com).
 
56
 *
 
57
 */
 
58
 
 
59
#include <stdio.h>
 
60
#include <ctype.h>
 
61
#include <string.h>
 
62
#include <openssl/bio.h>
 
63
#include <openssl/evp.h>
 
64
#include <openssl/hmac.h>
 
65
#include <openssl/err.h>
 
66
#include <openssl/x509v3.h>
 
67
#include <openssl/bn.h>
 
68
#include <openssl/rsa.h>
 
69
 
 
70
#ifndef OPENSSL_FIPS
 
71
 
 
72
int main(int argc, char *argv[])
 
73
{
 
74
    printf("No FIPS RSA support\n");
 
75
    return(0);
 
76
}
 
77
 
 
78
#else
 
79
 
 
80
#include "fips_utl.h"
 
81
 
 
82
int rsa_test(FILE *out, FILE *in, int saltlen);
 
83
static int rsa_printver(FILE *out,
 
84
                BIGNUM *n, BIGNUM *e,
 
85
                const EVP_MD *dgst,
 
86
                unsigned char *Msg, long Msglen,
 
87
                unsigned char *S, long Slen, int Saltlen);
 
88
 
 
89
int main(int argc, char **argv)
 
90
        {
 
91
        FILE *in = NULL, *out = NULL;
 
92
 
 
93
        int ret = 1;
 
94
        int Saltlen = -1;
 
95
 
 
96
        if(!FIPS_mode_set(1))
 
97
                {
 
98
                do_print_errors();
 
99
                goto end;
 
100
                }
 
101
 
 
102
        if ((argc > 2) && !strcmp("-saltlen", argv[1]))
 
103
                {
 
104
                Saltlen = atoi(argv[2]);
 
105
                if (Saltlen < 0)
 
106
                        {
 
107
                        fprintf(stderr, "FATAL: Invalid salt length\n");
 
108
                        goto end;
 
109
                        }
 
110
                argc -= 2;
 
111
                argv += 2;
 
112
                }
 
113
        else if ((argc > 1) && !strcmp("-x931", argv[1]))
 
114
                {
 
115
                Saltlen = -2;
 
116
                argc--;
 
117
                argv++;
 
118
                }
 
119
 
 
120
        if (argc == 1)
 
121
                in = stdin;
 
122
        else
 
123
                in = fopen(argv[1], "r");
 
124
 
 
125
        if (argc < 2)
 
126
                out = stdout;
 
127
        else
 
128
                out = fopen(argv[2], "w");
 
129
 
 
130
        if (!in)
 
131
                {
 
132
                fprintf(stderr, "FATAL input initialization error\n");
 
133
                goto end;
 
134
                }
 
135
 
 
136
        if (!out)
 
137
                {
 
138
                fprintf(stderr, "FATAL output initialization error\n");
 
139
                goto end;
 
140
                }
 
141
 
 
142
        if (!rsa_test(out, in, Saltlen))
 
143
                {
 
144
                fprintf(stderr, "FATAL RSAVTEST file processing error\n");
 
145
                goto end;
 
146
                }
 
147
        else
 
148
                ret = 0;
 
149
 
 
150
        end:
 
151
 
 
152
        if (ret)
 
153
                do_print_errors();
 
154
 
 
155
        if (in && (in != stdin))
 
156
                fclose(in);
 
157
        if (out && (out != stdout))
 
158
                fclose(out);
 
159
 
 
160
        return ret;
 
161
 
 
162
        }
 
163
 
 
164
#define RSA_TEST_MAXLINELEN     10240
 
165
 
 
166
int rsa_test(FILE *out, FILE *in, int Saltlen)
 
167
        {
 
168
        char *linebuf, *olinebuf, *p, *q;
 
169
        char *keyword, *value;
 
170
        const EVP_MD *dgst = NULL;
 
171
        BIGNUM *n = NULL, *e = NULL;
 
172
        unsigned char *Msg = NULL, *S = NULL;
 
173
        long Msglen, Slen;
 
174
        int ret = 0;
 
175
        int lnum = 0;
 
176
 
 
177
        olinebuf = OPENSSL_malloc(RSA_TEST_MAXLINELEN);
 
178
        linebuf = OPENSSL_malloc(RSA_TEST_MAXLINELEN);
 
179
 
 
180
        if (!linebuf || !olinebuf)
 
181
                goto error;
 
182
 
 
183
        while (fgets(olinebuf, RSA_TEST_MAXLINELEN, in))
 
184
                {
 
185
                lnum++;
 
186
                strcpy(linebuf, olinebuf);
 
187
                keyword = linebuf;
 
188
                /* Skip leading space */
 
189
                while (isspace((unsigned char)*keyword))
 
190
                        keyword++;
 
191
 
 
192
                /* Look for = sign */
 
193
                p = strchr(linebuf, '=');
 
194
 
 
195
                /* If no = or starts with [ (for [foo = bar] line) just copy */
 
196
                if (!p || *keyword=='[')
 
197
                        {
 
198
                        if (fputs(olinebuf, out) < 0)
 
199
                                goto error;
 
200
                        continue;
 
201
                        }
 
202
 
 
203
                q = p - 1;
 
204
 
 
205
                /* Remove trailing space */
 
206
                while (isspace((unsigned char)*q))
 
207
                        *q-- = 0;
 
208
 
 
209
                *p = 0;
 
210
                value = p + 1;
 
211
 
 
212
                /* Remove leading space from value */
 
213
                while (isspace((unsigned char)*value))
 
214
                        value++;
 
215
 
 
216
                /* Remove trailing space from value */
 
217
                p = value + strlen(value) - 1;
 
218
 
 
219
                while (*p == '\n' || isspace((unsigned char)*p))
 
220
                        *p-- = 0;
 
221
 
 
222
                if (!strcmp(keyword, "n"))
 
223
                        {
 
224
                        if (!do_hex2bn(&n,value))
 
225
                                goto parse_error;
 
226
                        }
 
227
                else if (!strcmp(keyword, "e"))
 
228
                        {
 
229
                        if (!do_hex2bn(&e,value))
 
230
                                goto parse_error;
 
231
                        }
 
232
                else if (!strcmp(keyword, "SHAAlg"))
 
233
                        {
 
234
                        if (!strcmp(value, "SHA1"))
 
235
                                dgst = EVP_sha1();
 
236
                        else if (!strcmp(value, "SHA224"))
 
237
                                dgst = EVP_sha224();
 
238
                        else if (!strcmp(value, "SHA256"))
 
239
                                dgst = EVP_sha256();
 
240
                        else if (!strcmp(value, "SHA384"))
 
241
                                dgst = EVP_sha384();
 
242
                        else if (!strcmp(value, "SHA512"))
 
243
                                dgst = EVP_sha512();
 
244
                        else
 
245
                                {
 
246
                                fprintf(stderr,
 
247
                                        "FATAL: unsupported algorithm \"%s\"\n",
 
248
                                                                value);
 
249
                                goto parse_error;
 
250
                                }
 
251
                        }
 
252
                else if (!strcmp(keyword, "Msg"))
 
253
                        {
 
254
                        if (Msg)
 
255
                                goto parse_error;
 
256
                        if (strlen(value) & 1)
 
257
                                *(--value) = '0';
 
258
                        Msg = hex2bin_m(value, &Msglen);
 
259
                        if (!Msg)
 
260
                                goto parse_error;
 
261
                        }
 
262
                else if (!strcmp(keyword, "S"))
 
263
                        {
 
264
                        if (S)
 
265
                                goto parse_error;
 
266
                        if (strlen(value) & 1)
 
267
                                *(--value) = '0';
 
268
                        S = hex2bin_m(value, &Slen);
 
269
                        if (!S)
 
270
                                goto parse_error;
 
271
                        }
 
272
                else if (!strcmp(keyword, "Result"))
 
273
                        continue;
 
274
                else
 
275
                        goto parse_error;
 
276
 
 
277
                fputs(olinebuf, out);
 
278
 
 
279
                if (n && e && Msg && S && dgst)
 
280
                        {
 
281
                        if (!rsa_printver(out, n, e, dgst,
 
282
                                        Msg, Msglen, S, Slen, Saltlen))
 
283
                                goto error;
 
284
                        OPENSSL_free(Msg);
 
285
                        Msg = NULL;
 
286
                        OPENSSL_free(S);
 
287
                        S = NULL;
 
288
                        }
 
289
 
 
290
                }
 
291
 
 
292
 
 
293
        ret = 1;
 
294
 
 
295
 
 
296
        error:
 
297
 
 
298
        if (olinebuf)
 
299
                OPENSSL_free(olinebuf);
 
300
        if (linebuf)
 
301
                OPENSSL_free(linebuf);
 
302
        if (n)
 
303
                BN_free(n);
 
304
        if (e)
 
305
                BN_free(e);
 
306
 
 
307
        return ret;
 
308
 
 
309
        parse_error:
 
310
 
 
311
        fprintf(stderr, "FATAL parse error processing line %d\n", lnum);
 
312
 
 
313
        goto error;
 
314
 
 
315
        }
 
316
 
 
317
static int rsa_printver(FILE *out,
 
318
                BIGNUM *n, BIGNUM *e,
 
319
                const EVP_MD *dgst,
 
320
                unsigned char *Msg, long Msglen,
 
321
                unsigned char *S, long Slen, int Saltlen)
 
322
        {
 
323
        int ret = 0, r;
 
324
        /* Setup RSA and EVP_PKEY structures */
 
325
        RSA *rsa_pubkey = NULL;
 
326
        EVP_PKEY pk;
 
327
        EVP_MD_CTX ctx;
 
328
        unsigned char *buf = NULL;
 
329
        rsa_pubkey = FIPS_rsa_new();
 
330
        if (!rsa_pubkey)
 
331
                goto error;
 
332
        rsa_pubkey->n = BN_dup(n);
 
333
        rsa_pubkey->e = BN_dup(e);
 
334
        if (!rsa_pubkey->n || !rsa_pubkey->e)
 
335
                goto error;
 
336
        pk.type = EVP_PKEY_RSA;
 
337
        pk.pkey.rsa = rsa_pubkey;
 
338
 
 
339
        EVP_MD_CTX_init(&ctx);
 
340
 
 
341
        if (Saltlen >= 0)
 
342
                {
 
343
                M_EVP_MD_CTX_set_flags(&ctx,
 
344
                        EVP_MD_CTX_FLAG_PAD_PSS | (Saltlen << 16));
 
345
                }
 
346
        else if (Saltlen == -2)
 
347
                M_EVP_MD_CTX_set_flags(&ctx, EVP_MD_CTX_FLAG_PAD_X931);
 
348
        if (!EVP_VerifyInit_ex(&ctx, dgst, NULL))
 
349
                goto error;
 
350
        if (!EVP_VerifyUpdate(&ctx, Msg, Msglen))
 
351
                goto error;
 
352
 
 
353
        r = EVP_VerifyFinal(&ctx, S, Slen, &pk);
 
354
 
 
355
 
 
356
        EVP_MD_CTX_cleanup(&ctx);
 
357
 
 
358
        if (r < 0)
 
359
                goto error;
 
360
        ERR_clear_error();
 
361
 
 
362
        if (r == 0)
 
363
                fputs("Result = F\n", out);
 
364
        else
 
365
                fputs("Result = P\n", out);
 
366
 
 
367
        ret = 1;
 
368
 
 
369
        error:
 
370
        if (rsa_pubkey)
 
371
                FIPS_rsa_free(rsa_pubkey);
 
372
        if (buf)
 
373
                OPENSSL_free(buf);
 
374
 
 
375
        return ret;
 
376
        }
 
377
#endif