Update error codes.
[openssl.git] / fips / fips_test_suite.c
1 /* ====================================================================
2  * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
3  *
4  *
5  * This command is intended as a test driver for the FIPS-140 testing
6  * lab performing FIPS-140 validation.  It demonstrates the use of the
7  * OpenSSL library ito perform a variety of common cryptographic
8  * functions.  A power-up self test is demonstrated by deliberately
9  * pointing to an invalid executable hash
10  *
11  * Contributed by Steve Marquess.
12  *
13  */
14
15 #define OPENSSL_FIPSAPI
16
17 #include <stdio.h>
18 #include <assert.h>
19 #include <ctype.h>
20 #include <string.h>
21 #include <stdlib.h>
22 #include <openssl/evp.h>
23 #include <openssl/hmac.h>
24 #include <openssl/cmac.h>
25 #include <openssl/sha.h>
26 #include <openssl/err.h>
27
28 #include <openssl/bn.h>
29 #include <openssl/rand.h>
30
31 #ifndef OPENSSL_FIPS
32 int main(int argc, char *argv[])
33     {
34     printf("No FIPS support\n");
35     return(0);
36     }
37 #else
38
39 #define ERR_clear_error() while(0)
40
41 #include <openssl/rsa.h>
42 #include <openssl/dsa.h>
43 #include <openssl/dh.h>
44
45 #include <openssl/fips.h>
46 #include "fips_utl.h"
47
48 /* AES: encrypt and decrypt known plaintext, verify result matches original plaintext
49 */
50 static int FIPS_aes_test(void)
51         {
52         int ret = 0;
53         unsigned char pltmp[16];
54         unsigned char citmp[16];
55         unsigned char key[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
56         unsigned char plaintext[16] = "etaonrishdlcu";
57         EVP_CIPHER_CTX ctx;
58         FIPS_cipher_ctx_init(&ctx);
59         if (FIPS_cipherinit(&ctx, EVP_aes_128_ecb(), key, NULL, 1) <= 0)
60                 goto err;
61         FIPS_cipher(&ctx, citmp, plaintext, 16);
62         if (FIPS_cipherinit(&ctx, EVP_aes_128_ecb(), key, NULL, 0) <= 0)
63                 goto err;
64         FIPS_cipher(&ctx, pltmp, citmp, 16);
65         if (memcmp(pltmp, plaintext, 16))
66                 goto err;
67         ret = 1;
68         err:
69         FIPS_cipher_ctx_cleanup(&ctx);
70         return ret;
71         }
72
73 static int FIPS_aes_gcm_test(void)
74         {
75         int ret = 0;
76         unsigned char pltmp[16];
77         unsigned char citmp[16];
78         unsigned char tagtmp[16];
79         unsigned char key[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
80         unsigned char iv[16] = {21,22,23,24,25,26,27,28,29,30,31,32};
81         unsigned char aad[] = "Some text AAD";
82         unsigned char plaintext[16] = "etaonrishdlcu";
83         EVP_CIPHER_CTX ctx;
84         FIPS_cipher_ctx_init(&ctx);
85         if (FIPS_cipherinit(&ctx, EVP_aes_128_gcm(), key, iv, 1) <= 0)
86                 goto err;
87         FIPS_cipher(&ctx, NULL, aad, sizeof(aad));
88         FIPS_cipher(&ctx, citmp, plaintext, 16);
89         FIPS_cipher(&ctx, NULL, NULL, 0);
90         if (!FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, 16, tagtmp))
91                 goto err;
92
93         if (FIPS_cipherinit(&ctx, EVP_aes_128_gcm(), key, iv, 0) <= 0)
94                 goto err;
95         if (!FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, 16, tagtmp))
96                 goto err;
97
98         FIPS_cipher(&ctx, NULL, aad, sizeof(aad));
99
100         FIPS_cipher(&ctx, pltmp, citmp, 16);
101
102         if (FIPS_cipher(&ctx, NULL, NULL, 0) < 0)
103                 goto err;
104
105         if (memcmp(pltmp, plaintext, 16))
106                 goto err;
107
108         ret = 1;
109         err:
110         FIPS_cipher_ctx_cleanup(&ctx);
111         return ret;
112         }
113
114 static int FIPS_des3_test(void)
115         {
116         int ret = 0;
117         unsigned char pltmp[8];
118         unsigned char citmp[8];
119         unsigned char key[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
120                               19,20,21,22,23,24};
121         unsigned char plaintext[] = { 'e', 't', 'a', 'o', 'n', 'r', 'i', 's' };
122         EVP_CIPHER_CTX ctx;
123         FIPS_cipher_ctx_init(&ctx);
124         if (FIPS_cipherinit(&ctx, EVP_des_ede3_ecb(), key, NULL, 1) <= 0)
125                 goto err;
126         FIPS_cipher(&ctx, citmp, plaintext, 8);
127         if (FIPS_cipherinit(&ctx, EVP_des_ede3_ecb(), key, NULL, 0) <= 0)
128                 goto err;
129         FIPS_cipher(&ctx, pltmp, citmp, 8);
130         if (memcmp(pltmp, plaintext, 8))
131                 goto err;
132         ret = 1;
133         err:
134         FIPS_cipher_ctx_cleanup(&ctx);
135         return ret;
136         }
137
138 /*
139  * DSA: generate keys and sign, verify input plaintext.
140  */
141 static int FIPS_dsa_test(int bad)
142     {
143     DSA *dsa = NULL;
144     unsigned char dgst[] = "etaonrishdlc";
145     int r = 0;
146     EVP_MD_CTX mctx;
147     DSA_SIG *sig = NULL;
148
149     ERR_clear_error();
150     FIPS_md_ctx_init(&mctx);
151     dsa = FIPS_dsa_new();
152     if (!dsa)
153         goto end;
154     if (!DSA_generate_parameters_ex(dsa, 1024,NULL,0,NULL,NULL,NULL))
155         goto end;
156     if (!DSA_generate_key(dsa))
157         goto end;
158     if (bad)
159             BN_add_word(dsa->pub_key, 1);
160
161     if (!FIPS_digestinit(&mctx, EVP_sha256()))
162         goto end;
163     if (!FIPS_digestupdate(&mctx, dgst, sizeof(dgst) - 1))
164         goto end;
165     sig = FIPS_dsa_sign_ctx(dsa, &mctx);
166     if (!sig)
167         goto end;
168
169     if (!FIPS_digestinit(&mctx, EVP_sha256()))
170         goto end;
171     if (!FIPS_digestupdate(&mctx, dgst, sizeof(dgst) - 1))
172         goto end;
173     r = FIPS_dsa_verify_ctx(dsa, &mctx, sig);
174     end:
175     if (sig)
176         FIPS_dsa_sig_free(sig);
177     FIPS_md_ctx_cleanup(&mctx);
178     if (dsa)
179           FIPS_dsa_free(dsa);
180     if (r != 1)
181         return 0;
182     return 1;
183     }
184
185 /*
186  * RSA: generate keys and sign, verify input plaintext.
187  */
188 static int FIPS_rsa_test(int bad)
189     {
190     RSA *key;
191     unsigned char input_ptext[] = "etaonrishdlc";
192     unsigned char buf[256];
193     unsigned int slen;
194     BIGNUM *bn;
195     EVP_MD_CTX mctx;
196     int r = 0;
197
198     ERR_clear_error();
199     FIPS_md_ctx_init(&mctx);
200     key = FIPS_rsa_new();
201     bn = BN_new();
202     if (!key || !bn)
203         return 0;
204     BN_set_word(bn, 65537);
205     if (!RSA_generate_key_ex(key, 2048,bn,NULL))
206         return 0;
207     BN_free(bn);
208     if (bad)
209             BN_add_word(key->n, 1);
210
211     if (!FIPS_digestinit(&mctx, EVP_sha256()))
212         goto end;
213     if (!FIPS_digestupdate(&mctx, input_ptext, sizeof(input_ptext) - 1))
214         goto end;
215     if (!FIPS_rsa_sign_ctx(key, &mctx, RSA_PKCS1_PADDING, 0, NULL, buf, &slen))
216         goto end;
217
218     if (!FIPS_digestinit(&mctx, EVP_sha256()))
219         goto end;
220     if (!FIPS_digestupdate(&mctx, input_ptext, sizeof(input_ptext) - 1))
221         goto end;
222     r = FIPS_rsa_verify_ctx(key, &mctx, RSA_PKCS1_PADDING, 0, NULL, buf, slen);
223     end:
224     FIPS_md_ctx_cleanup(&mctx);
225     if (key)
226           FIPS_rsa_free(key);
227     if (r != 1)
228         return 0;
229     return 1;
230     }
231
232 /* SHA1: generate hash of known digest value and compare to known
233    precomputed correct hash
234 */
235 static int FIPS_sha1_test()
236     {
237     unsigned char digest[SHA_DIGEST_LENGTH] =
238         { 0x11, 0xf1, 0x9a, 0x3a, 0xec, 0x1a, 0x1e, 0x8e, 0x65, 0xd4, 0x9a, 0x38, 0x0c, 0x8b, 0x1e, 0x2c, 0xe8, 0xb3, 0xc5, 0x18 };
239     unsigned char str[] = "etaonrishd";
240
241     unsigned char md[SHA_DIGEST_LENGTH];
242
243     ERR_clear_error();
244     if (!FIPS_digest(str,sizeof(str) - 1,md, NULL, EVP_sha1())) return 0;
245     if (memcmp(md,digest,sizeof(md)))
246         return 0;
247     return 1;
248     }
249
250 /* SHA256: generate hash of known digest value and compare to known
251    precomputed correct hash
252 */
253 static int FIPS_sha256_test()
254     {
255     unsigned char digest[SHA256_DIGEST_LENGTH] =
256         {0xf5, 0x53, 0xcd, 0xb8, 0xcf, 0x1, 0xee, 0x17, 0x9b, 0x93, 0xc9, 0x68, 0xc0, 0xea, 0x40, 0x91,
257          0x6, 0xec, 0x8e, 0x11, 0x96, 0xc8, 0x5d, 0x1c, 0xaf, 0x64, 0x22, 0xe6, 0x50, 0x4f, 0x47, 0x57};
258     unsigned char str[] = "etaonrishd";
259
260     unsigned char md[SHA256_DIGEST_LENGTH];
261
262     ERR_clear_error();
263     if (!FIPS_digest(str,sizeof(str) - 1,md, NULL, EVP_sha256())) return 0;
264     if (memcmp(md,digest,sizeof(md)))
265         return 0;
266     return 1;
267     }
268
269 /* SHA512: generate hash of known digest value and compare to known
270    precomputed correct hash
271 */
272 static int FIPS_sha512_test()
273     {
274     unsigned char digest[SHA512_DIGEST_LENGTH] =
275         {0x99, 0xc9, 0xe9, 0x5b, 0x88, 0xd4, 0x78, 0x88, 0xdf, 0x88, 0x5f, 0x94, 0x71, 0x64, 0x28, 0xca,
276          0x16, 0x1f, 0x3d, 0xf4, 0x1f, 0xf3, 0x0f, 0xc5, 0x03, 0x99, 0xb2, 0xd0, 0xe7, 0x0b, 0x94, 0x4a,
277          0x45, 0xd2, 0x6c, 0x4f, 0x20, 0x06, 0xef, 0x71, 0xa9, 0x25, 0x7f, 0x24, 0xb1, 0xd9, 0x40, 0x22,
278          0x49, 0x54, 0x10, 0xc2, 0x22, 0x9d, 0x27, 0xfe, 0xbd, 0xd6, 0xd6, 0xeb, 0x2d, 0x42, 0x1d, 0xa3};
279     unsigned char str[] = "etaonrishd";
280
281     unsigned char md[SHA512_DIGEST_LENGTH];
282
283     ERR_clear_error();
284     if (!FIPS_digest(str,sizeof(str) - 1,md, NULL, EVP_sha512())) return 0;
285     if (memcmp(md,digest,sizeof(md)))
286         return 0;
287     return 1;
288     }
289
290 /* HMAC-SHA1: generate hash of known digest value and compare to known
291    precomputed correct hash
292 */
293 static int FIPS_hmac_sha1_test()
294     {
295     unsigned char key[] = "etaonrishd";
296     unsigned char iv[] = "Sample text";
297     unsigned char kaval[EVP_MAX_MD_SIZE] =
298         {0x73, 0xf7, 0xa0, 0x48, 0xf8, 0x94, 0xed, 0xdd, 0x0a, 0xea, 0xea, 0x56, 0x1b, 0x61, 0x2e, 0x70,
299          0xb2, 0xfb, 0xec, 0xc6};
300
301     unsigned char out[EVP_MAX_MD_SIZE];
302     unsigned int outlen;
303
304     ERR_clear_error();
305     if (!HMAC(EVP_sha1(),key,sizeof(key)-1,iv,sizeof(iv)-1,out,&outlen)) return 0;
306     if (memcmp(out,kaval,outlen))
307         return 0;
308     return 1;
309     }
310
311 /* HMAC-SHA224: generate hash of known digest value and compare to known
312    precomputed correct hash
313 */
314 static int FIPS_hmac_sha224_test()
315     {
316     unsigned char key[] = "etaonrishd";
317     unsigned char iv[] = "Sample text";
318     unsigned char kaval[EVP_MAX_MD_SIZE] =
319         {0x75, 0x58, 0xd5, 0xbd, 0x55, 0x6d, 0x87, 0x0f, 0x75, 0xff, 0xbe, 0x1c, 0xb2, 0xf0, 0x20, 0x35,
320          0xe5, 0x62, 0x49, 0xb6, 0x94, 0xb9, 0xfc, 0x65, 0x34, 0x33, 0x3a, 0x19};
321
322     unsigned char out[EVP_MAX_MD_SIZE];
323     unsigned int outlen;
324
325     ERR_clear_error();
326     if (!HMAC(EVP_sha224(),key,sizeof(key)-1,iv,sizeof(iv)-1,out,&outlen)) return 0;
327     if (memcmp(out,kaval,outlen))
328         return 0;
329     return 1;
330     }
331
332 /* HMAC-SHA256: generate hash of known digest value and compare to known
333    precomputed correct hash
334 */
335 static int FIPS_hmac_sha256_test()
336     {
337     unsigned char key[] = "etaonrishd";
338     unsigned char iv[] = "Sample text";
339     unsigned char kaval[EVP_MAX_MD_SIZE] =
340         {0xe9, 0x17, 0xc1, 0x7b, 0x4c, 0x6b, 0x77, 0xda, 0xd2, 0x30, 0x36, 0x02, 0xf5, 0x72, 0x33, 0x87,
341          0x9f, 0xc6, 0x6e, 0x7b, 0x7e, 0xa8, 0xea, 0xaa, 0x9f, 0xba, 0xee, 0x51, 0xff, 0xda, 0x24, 0xf4};
342
343     unsigned char out[EVP_MAX_MD_SIZE];
344     unsigned int outlen;
345
346     ERR_clear_error();
347     if (!HMAC(EVP_sha256(),key,sizeof(key)-1,iv,sizeof(iv)-1,out,&outlen)) return 0;
348     if (memcmp(out,kaval,outlen))
349         return 0;
350     return 1;
351     }
352
353 /* HMAC-SHA384: generate hash of known digest value and compare to known
354    precomputed correct hash
355 */
356 static int FIPS_hmac_sha384_test()
357     {
358     unsigned char key[] = "etaonrishd";
359     unsigned char iv[] = "Sample text";
360     unsigned char kaval[EVP_MAX_MD_SIZE] =
361         {0xb2, 0x9d, 0x40, 0x58, 0x32, 0xc4, 0xe3, 0x31, 0xb6, 0x63, 0x08, 0x26, 0x99, 0xef, 0x3b, 0x10,
362          0xe2, 0xdf, 0xf8, 0xff, 0xc6, 0xe1, 0x03, 0x29, 0x81, 0x2a, 0x1b, 0xac, 0xb0, 0x07, 0x39, 0x08,
363          0xf3, 0x91, 0x35, 0x11, 0x76, 0xd6, 0x4c, 0x20, 0xfb, 0x4d, 0xc3, 0xf3, 0xb8, 0x9b, 0x88, 0x1c};
364
365     unsigned char out[EVP_MAX_MD_SIZE];
366     unsigned int outlen;
367
368     ERR_clear_error();
369     if (!HMAC(EVP_sha384(),key,sizeof(key)-1,iv,sizeof(iv)-1,out,&outlen)) return 0;
370     if (memcmp(out,kaval,outlen))
371         return 0;
372     return 1;
373     }
374
375 /* HMAC-SHA512: generate hash of known digest value and compare to known
376    precomputed correct hash
377 */
378 static int FIPS_hmac_sha512_test()
379     {
380     unsigned char key[] = "etaonrishd";
381     unsigned char iv[] = "Sample text";
382     unsigned char kaval[EVP_MAX_MD_SIZE] =
383         {0xcd, 0x3e, 0xb9, 0x51, 0xb8, 0xbc, 0x7f, 0x9a, 0x23, 0xaf, 0xf3, 0x77, 0x59, 0x85, 0xa9, 0xe6,
384          0xf7, 0xd1, 0x51, 0x96, 0x17, 0xe0, 0x92, 0xd8, 0xa6, 0x3b, 0xc1, 0xad, 0x7e, 0x24, 0xca, 0xb1,
385          0xd7, 0x79, 0x0a, 0xa5, 0xea, 0x2c, 0x02, 0x58, 0x0b, 0xa6, 0x52, 0x6b, 0x61, 0x7f, 0xeb, 0x9c,
386          0x47, 0x86, 0x5d, 0x74, 0x2b, 0x88, 0xdf, 0xee, 0x46, 0x69, 0x96, 0x3d, 0xa6, 0xd9, 0x2a, 0x53};
387
388     unsigned char out[EVP_MAX_MD_SIZE];
389     unsigned int outlen;
390
391     ERR_clear_error();
392     if (!HMAC(EVP_sha512(),key,sizeof(key)-1,iv,sizeof(iv)-1,out,&outlen)) return 0;
393     if (memcmp(out,kaval,outlen))
394         return 0;
395     return 1;
396     }
397
398 /* CMAC-AES128: generate hash of known digest value and compare to known
399    precomputed correct hash
400 */
401 static int FIPS_cmac_aes128_test()
402     {
403     unsigned char key[16] = { 0x2b,0x7e,0x15,0x16, 0x28,0xae,0xd2,0xa6,
404                               0xab,0xf7,0x15,0x88, 0x09,0xcf,0x4f,0x3c, };
405     unsigned char data[] = "Sample text";
406     unsigned char kaval[EVP_MAX_MD_SIZE] =
407             { 0x16,0x83,0xfe,0xac, 0x52,0x9b,0xae,0x23,
408               0xd7,0xd5,0x66,0xf5, 0xd2,0x8d,0xbd,0x2a, };
409
410     unsigned char *out = NULL;
411     size_t outlen;
412     CMAC_CTX *ctx = CMAC_CTX_new();
413     int r = 0;
414
415     ERR_clear_error();
416
417     if (!ctx)
418             goto end;
419     if (!CMAC_Init(ctx,key,sizeof(key),EVP_aes_128_cbc(),NULL))
420             goto end;
421     if (!CMAC_Update(ctx,data,sizeof(data)-1))
422             goto end;
423     /* This should return 1.  If not, there's a programming error... */
424     if (!CMAC_Final(ctx, out, &outlen))
425             goto end;
426     out = OPENSSL_malloc(outlen);
427     if (!CMAC_Final(ctx, out, &outlen))
428             goto end;
429 #if 0
430     {
431     char *hexout = OPENSSL_malloc(outlen * 2 + 1);
432     bin2hex(out, outlen, hexout);
433     printf("CMAC-AES128: res = %s\n", hexout);
434     OPENSSL_free(hexout);
435     }
436     r = 1;
437 #else
438     if (!memcmp(out,kaval,outlen))
439             r = 1;
440 #endif
441     end:
442     CMAC_CTX_free(ctx);
443     if (out)
444           OPENSSL_free(out);
445     return r;
446     }
447
448 /* CMAC-AES192: generate hash of known digest value and compare to known
449    precomputed correct hash
450 */
451 static int FIPS_cmac_aes192_test()
452     {
453     unsigned char key[] = { 0x8e,0x73,0xb0,0xf7, 0xda,0x0e,0x64,0x52,
454                             0xc8,0x10,0xf3,0x2b, 0x80,0x90,0x79,0xe5,
455                             0x62,0xf8,0xea,0xd2, 0x52,0x2c,0x6b,0x7b, };
456     unsigned char data[] = "Sample text";
457     unsigned char kaval[] =
458             { 0xd6,0x99,0x19,0x25, 0xe5,0x1d,0x95,0x48,
459               0xb1,0x4a,0x0b,0xf2, 0xc6,0x3c,0x47,0x1f, };
460
461     unsigned char *out = NULL;
462     size_t outlen;
463     CMAC_CTX *ctx = CMAC_CTX_new();
464     int r = 0;
465
466     ERR_clear_error();
467
468     if (!ctx)
469             goto end;
470     if (!CMAC_Init(ctx,key,sizeof(key),EVP_aes_192_cbc(),NULL))
471             goto end;
472     if (!CMAC_Update(ctx,data,sizeof(data)-1))
473             goto end;
474     /* This should return 1.  If not, there's a programming error... */
475     if (!CMAC_Final(ctx, out, &outlen))
476             goto end;
477     out = OPENSSL_malloc(outlen);
478     if (!CMAC_Final(ctx, out, &outlen))
479             goto end;
480 #if 0
481     {
482     char *hexout = OPENSSL_malloc(outlen * 2 + 1);
483     bin2hex(out, outlen, hexout);
484     printf("CMAC-AES192: res = %s\n", hexout);
485     OPENSSL_free(hexout);
486     }
487     r = 1;
488 #else
489     if (!memcmp(out,kaval,outlen))
490             r = 1;
491 #endif
492     end:
493     CMAC_CTX_free(ctx);
494     if (out)
495           OPENSSL_free(out);
496     return r;
497     }
498
499 /* CMAC-AES256: generate hash of known digest value and compare to known
500    precomputed correct hash
501 */
502 static int FIPS_cmac_aes256_test()
503     {
504     unsigned char key[] = { 0x60,0x3d,0xeb,0x10, 0x15,0xca,0x71,0xbe,
505                             0x2b,0x73,0xae,0xf0, 0x85,0x7d,0x77,0x81,
506                             0x1f,0x35,0x2c,0x07, 0x3b,0x61,0x08,0xd7,
507                             0x2d,0x98,0x10,0xa3, 0x09,0x14,0xdf,0xf4, };
508     unsigned char data[] = "Sample text";
509     unsigned char kaval[] =
510             { 0xec,0xc2,0xcf,0x63, 0xc7,0xce,0xfc,0xa4,
511               0xb0,0x86,0x37,0x5f, 0x15,0x60,0xba,0x1f, };
512
513     unsigned char *out = NULL;
514     size_t outlen;
515     CMAC_CTX *ctx = CMAC_CTX_new();
516     int r = 0;
517
518     ERR_clear_error();
519
520     if (!ctx)
521             goto end;
522     if (!CMAC_Init(ctx,key,sizeof(key),EVP_aes_256_cbc(),NULL))
523             goto end;
524     if (!CMAC_Update(ctx,data,sizeof(data)-1))
525             goto end;
526     /* This should return 1.  If not, there's a programming error... */
527     if (!CMAC_Final(ctx, out, &outlen))
528             goto end;
529     out = OPENSSL_malloc(outlen);
530     if (!CMAC_Final(ctx, out, &outlen))
531             goto end;
532 #if 0
533     {
534     char *hexout = OPENSSL_malloc(outlen * 2 + 1);
535     bin2hex(out, outlen, hexout);
536     printf("CMAC-AES256: res = %s\n", hexout);
537     OPENSSL_free(hexout);
538     }
539     r = 1;
540 #else
541     if (!memcmp(out,kaval,outlen))
542             r = 1;
543 #endif
544     end:
545     CMAC_CTX_free(ctx);
546     if (out)
547           OPENSSL_free(out);
548     return r;
549     }
550
551 /* CMAC-TDEA3: generate hash of known digest value and compare to known
552    precomputed correct hash
553 */
554 static int FIPS_cmac_tdea3_test()
555     {
556     unsigned char key[] = { 0x8a,0xa8,0x3b,0xf8, 0xcb,0xda,0x10,0x62,
557                             0x0b,0xc1,0xbf,0x19, 0xfb,0xb6,0xcd,0x58,
558                             0xbc,0x31,0x3d,0x4a, 0x37,0x1c,0xa8,0xb5, };
559     unsigned char data[] = "Sample text";
560     unsigned char kaval[EVP_MAX_MD_SIZE] =
561             { 0xb4,0x06,0x4e,0xbf, 0x59,0x89,0xba,0x68, };
562
563     unsigned char *out = NULL;
564     size_t outlen;
565     CMAC_CTX *ctx = CMAC_CTX_new();
566     int r = 0;
567
568     ERR_clear_error();
569
570     if (!ctx)
571             goto end;
572     if (!CMAC_Init(ctx,key,sizeof(key),EVP_des_ede3_cbc(),NULL))
573             goto end;
574     if (!CMAC_Update(ctx,data,sizeof(data)-1))
575             goto end;
576     /* This should return 1.  If not, there's a programming error... */
577     if (!CMAC_Final(ctx, out, &outlen))
578             goto end;
579     out = OPENSSL_malloc(outlen);
580     if (!CMAC_Final(ctx, out, &outlen))
581             goto end;
582 #if 0
583     {
584     char *hexout = OPENSSL_malloc(outlen * 2 + 1);
585     bin2hex(out, outlen, hexout);
586     printf("CMAC-TDEA3: res = %s\n", hexout);
587     OPENSSL_free(hexout);
588     }
589     r = 1;
590 #else
591     if (!memcmp(out,kaval,outlen))
592             r = 1;
593 #endif
594     end:
595     CMAC_CTX_free(ctx);
596     if (out)
597           OPENSSL_free(out);
598     return r;
599     }
600
601
602 /* DH: generate shared parameters
603 */
604 static int dh_test()
605     {
606     DH *dh;
607     ERR_clear_error();
608     dh = FIPS_dh_new();
609     if (!dh)
610         return 0;
611     if (!DH_generate_parameters_ex(dh, 1024, 2, NULL))
612         return 0;
613     FIPS_dh_free(dh);
614     return 1;
615     }
616
617 /* Zeroize
618 */
619 static int Zeroize()
620     {
621     RSA *key;
622     BIGNUM *bn;
623     unsigned char userkey[16] = 
624         { 0x48, 0x50, 0xf0, 0xa3, 0x3a, 0xed, 0xd3, 0xaf, 0x6e, 0x47, 0x7f, 0x83, 0x02, 0xb1, 0x09, 0x68 };
625     size_t i;
626     int n;
627
628     key = FIPS_rsa_new();
629     bn = BN_new();
630     if (!key || !bn)
631         return 0;
632     BN_set_word(bn, 65537);
633     if (!RSA_generate_key_ex(key, 1024,bn,NULL))
634         return 0;
635     BN_free(bn);
636     
637     n = BN_num_bytes(key->d);
638     printf(" Generated %d byte RSA private key\n", n);
639     printf("\tBN key before overwriting:\n");
640     do_bn_print(stdout, key->d);
641     BN_rand(key->d,n*8,-1,0);
642     printf("\tBN key after overwriting:\n");
643     do_bn_print(stdout, key->d);
644
645     printf("\tchar buffer key before overwriting: \n\t\t");
646     for(i = 0; i < sizeof(userkey); i++) printf("%02x", userkey[i]);
647         printf("\n");
648     RAND_bytes(userkey, sizeof userkey);
649     printf("\tchar buffer key after overwriting: \n\t\t");
650     for(i = 0; i < sizeof(userkey); i++) printf("%02x", userkey[i]);
651         printf("\n");
652
653     return 1;
654     }
655
656 static int Error;
657 static const char * Fail(const char *msg)
658     {
659     Error++;
660     return msg; 
661     }
662
663 static void test_msg(const char *msg, int result)
664         {
665         printf("%s...%s\n", msg, result ? "successful" : Fail("Failed!"));
666         }
667
668 /* Table of IDs for POST translating between NIDs and names */
669
670 typedef struct 
671         {
672         int id;
673         const char *name;
674         } POST_ID;
675
676 POST_ID id_list[] = {
677         {NID_sha1, "SHA1"},
678         {NID_sha224, "SHA224"},
679         {NID_sha256, "SHA256"},
680         {NID_sha384, "SHA384"},
681         {NID_sha512, "SHA512"},
682         {NID_hmacWithSHA1, "HMAC-SHA1"},
683         {NID_hmacWithSHA224, "HMAC-SHA224"},
684         {NID_hmacWithSHA256, "HMAC-SHA256"},
685         {NID_hmacWithSHA384, "HMAC-SHA384"},
686         {NID_hmacWithSHA512, "HMAC-SHA512"},
687         {EVP_PKEY_RSA, "RSA"},
688         {EVP_PKEY_DSA, "DSA"},
689         {EVP_PKEY_EC, "ECDSA"},
690         {NID_aes_128_cbc, "AES-128-CBC"},
691         {NID_aes_192_cbc, "AES-192-CBC"},
692         {NID_aes_256_cbc, "AES-256-CBC"},
693         {NID_aes_128_ctr, "AES-128-CTR"},
694         {NID_aes_192_ctr, "AES-192-CTR"},
695         {NID_aes_256_ctr, "AES-256-CTR"},
696         {NID_aes_128_ecb, "AES-128-ECB"},
697         {NID_aes_128_xts, "AES-128-XTS"},
698         {NID_aes_256_xts, "AES-256-XTS"},
699         {NID_des_ede3_cbc, "DES-EDE3-CBC"},
700         {NID_des_ede3_ecb, "DES-EDE3-ECB"},
701         {NID_X9_62_prime256v1, "P-256"},
702         {NID_secp384r1, "P-384"},
703         {NID_secp521r1, "P-521"},
704         {0, NULL}
705 };
706
707 static const char *lookup_id(int id)
708         {
709         POST_ID *n;
710         static char out[40];
711         for (n = id_list; n->name; n++)
712                 {
713                 if (n->id == id)
714                         return n->name;
715                 }
716         sprintf(out, "ID=%d", id);
717         return out;
718         }
719
720 static int fail_id = -1;
721 static int fail_sub = -1;
722 static int fail_key = -1;
723
724 static int post_cb(int op, int id, int subid, void *ex)
725         {
726         const char *idstr, *exstr = "";
727         char asctmp[20];
728         int keytype = -1;
729 #ifdef FIPS_POST_TIME
730         static struct timespec start, end, tstart, tend;
731 #endif
732         switch(id)
733                 {
734                 case FIPS_TEST_INTEGRITY:
735                 idstr = "Integrity";
736                 break;
737
738                 case FIPS_TEST_DIGEST:
739                 idstr = "Digest";
740                 exstr = lookup_id(subid);
741                 break;
742
743                 case FIPS_TEST_CIPHER:
744                 exstr = lookup_id(subid);
745                 idstr = "Cipher";
746                 break;
747
748                 case FIPS_TEST_SIGNATURE:
749                 if (ex)
750                         {
751                         EVP_PKEY *pkey = ex;
752                         keytype = pkey->type;
753                         exstr = lookup_id(keytype);
754                         }
755                 idstr = "Signature";
756                 break;
757
758                 case FIPS_TEST_HMAC:
759                 exstr = lookup_id(subid);
760                 idstr = "HMAC";
761                 break;
762
763                 case FIPS_TEST_CMAC:
764                 idstr = "CMAC";
765                 exstr = lookup_id(subid);
766                 break;
767
768                 case FIPS_TEST_GCM:
769                 idstr = "GCM";
770                 break;
771
772                 case FIPS_TEST_XTS:
773                 idstr = "XTS";
774                 exstr = lookup_id(subid);
775                 break;
776
777                 case FIPS_TEST_CCM:
778                 idstr = "CCM";
779                 break;
780
781                 case FIPS_TEST_X931:
782                 idstr = "X9.31 PRNG";
783                 sprintf(asctmp, "keylen=%d", subid);
784                 exstr = asctmp;
785                 break;
786
787                 case FIPS_TEST_DRBG:
788                 idstr = "DRBG";
789                 if (*(int *)ex & DRBG_FLAG_CTR_USE_DF)
790                         {
791                         sprintf(asctmp, "%s DF", lookup_id(subid));
792                         exstr = asctmp;
793                         }
794                 else if (subid >> 16)
795                         {
796                         sprintf(asctmp, "%s %s",
797                                         lookup_id(subid >> 16),
798                                         lookup_id(subid & 0xFFFF));
799                         exstr = asctmp;
800                         }
801                 else
802                         exstr = lookup_id(subid);
803                 break;
804
805                 case FIPS_TEST_PAIRWISE:
806                 if (ex)
807                         {
808                         EVP_PKEY *pkey = ex;
809                         keytype = pkey->type;
810                         exstr = lookup_id(keytype);
811                         }
812                 idstr = "Pairwise Consistency";
813                 break;
814
815                 case FIPS_TEST_CONTINUOUS:
816                 idstr = "Continuous PRNG";
817                 break;
818
819                 default:
820                 idstr = "Unknown";
821                 break;
822
823                 }
824
825         switch(op)
826                 {
827                 case FIPS_POST_BEGIN:
828 #ifdef FIPS_POST_TIME
829                 clock_getres(CLOCK_REALTIME, &tstart);
830                 printf("\tTimer resolution %ld s, %ld ns\n",
831                                 (long)tstart.tv_sec, (long)tstart.tv_nsec);
832                 clock_gettime(CLOCK_REALTIME, &tstart);
833 #endif
834                 printf("\tPOST started\n");
835                 break;
836
837                 case FIPS_POST_END:
838                 printf("\tPOST %s\n", id ? "Success" : "Failed");
839 #ifdef FIPS_POST_TIME
840                 clock_gettime(CLOCK_REALTIME, &tend);
841                 printf("\t\tTook %f seconds\n",
842                         (double)((tend.tv_sec+tend.tv_nsec*1e-9)
843                         - (tstart.tv_sec+tstart.tv_nsec*1e-9)));
844 #endif
845                 break;
846
847                 case FIPS_POST_STARTED:
848                 printf("\t\t%s %s test started\n", idstr, exstr);
849 #ifdef FIPS_POST_TIME
850                 clock_gettime(CLOCK_REALTIME, &start);
851 #endif
852                 break;
853
854                 case FIPS_POST_SUCCESS:
855                 printf("\t\t%s %s test OK\n", idstr, exstr);
856 #ifdef FIPS_POST_TIME
857                 clock_gettime(CLOCK_REALTIME, &end);
858                 printf("\t\t\tTook %f seconds\n",
859                         (double)((end.tv_sec+end.tv_nsec*1e-9)
860                         - (start.tv_sec+start.tv_nsec*1e-9)));
861 #endif
862                 break;
863
864                 case FIPS_POST_FAIL:
865                 printf("\t\t%s %s test FAILED!!\n", idstr, exstr);
866                 break;
867
868                 case FIPS_POST_CORRUPT:
869                 if (fail_id == id
870                         && (fail_key == -1 || fail_key == keytype)
871                         && (fail_sub == -1 || fail_sub == subid))
872                         {
873                         printf("\t\t%s %s test failure induced\n", idstr, exstr);
874                         return 0;
875                         }
876                 break;
877
878                 }
879         return 1;
880         }
881
882 int main(int argc,char **argv)
883     {
884     int bad_rsa = 0, bad_dsa = 0;
885     int do_rng_stick = 0;
886     int do_drbg_stick = 0;
887     int no_exit = 0;
888
889
890     FIPS_post_set_callback(post_cb);
891
892     printf("\tFIPS-mode test application\n");
893
894     printf("\t%s\n\n", FIPS_module_version_text());
895
896     if (argv[1]) {
897         /* Corrupted KAT tests */
898         if (!strcmp(argv[1], "integrity")) {
899             fail_id = FIPS_TEST_INTEGRITY;
900         } else if (!strcmp(argv[1], "aes")) {
901             fail_id = FIPS_TEST_CIPHER;
902             fail_sub = NID_aes_128_ecb; 
903         } else if (!strcmp(argv[1], "aes-ccm")) {
904             fail_id = FIPS_TEST_CCM;
905         } else if (!strcmp(argv[1], "aes-gcm")) {
906             fail_id = FIPS_TEST_GCM;
907         } else if (!strcmp(argv[1], "aes-xts")) {
908             fail_id = FIPS_TEST_XTS;
909         } else if (!strcmp(argv[1], "des")) {
910             fail_id = FIPS_TEST_CIPHER;
911             fail_sub = NID_des_ede3_ecb;        
912         } else if (!strcmp(argv[1], "dsa")) {
913             fail_id = FIPS_TEST_SIGNATURE;
914             fail_key = EVP_PKEY_DSA;    
915         } else if (!strcmp(argv[1], "ecdsa")) {
916             fail_id = FIPS_TEST_SIGNATURE;
917             fail_key = EVP_PKEY_EC;     
918         } else if (!strcmp(argv[1], "rsa")) {
919             fail_id = FIPS_TEST_SIGNATURE;
920             fail_key = EVP_PKEY_RSA;    
921         } else if (!strcmp(argv[1], "rsakey")) {
922             printf("RSA key generation and signature validation with corrupted key...\n");
923             bad_rsa = 1;
924             no_exit = 1;
925         } else if (!strcmp(argv[1], "rsakeygen")) {
926             fail_id = FIPS_TEST_PAIRWISE;
927             fail_key = EVP_PKEY_RSA;
928             no_exit = 1;
929         } else if (!strcmp(argv[1], "dsakey")) {
930             printf("DSA key generation and signature validation with corrupted key...\n");
931             bad_dsa = 1;
932             no_exit = 1;
933         } else if (!strcmp(argv[1], "dsakeygen")) {
934             fail_id = FIPS_TEST_PAIRWISE;
935             fail_key = EVP_PKEY_DSA;
936             no_exit = 1;
937         } else if (!strcmp(argv[1], "sha1")) {
938             fail_id = FIPS_TEST_DIGEST;
939         } else if (!strcmp(argv[1], "hmac")) {
940             fail_id = FIPS_TEST_HMAC;
941         } else if (!strcmp(argv[1], "cmac")) {
942             fail_id = FIPS_TEST_CMAC;
943         } else if (!strcmp(argv[1], "drbg")) {
944             fail_id = FIPS_TEST_DRBG;
945         } else if (!strcmp(argv[1], "rng")) {
946             fail_id = FIPS_TEST_X931;
947         } else if (!strcmp(argv[1], "post")) {
948             fail_id = -1;
949         } else if (!strcmp(argv[1], "rngstick")) {
950             do_rng_stick = 1;
951             no_exit = 1;
952             printf("RNG test with stuck continuous test...\n");
953         } else if (!strcmp(argv[1], "drbgentstick")) {
954                 do_entropy_stick();
955         } else if (!strcmp(argv[1], "drbgstick")) {
956             do_drbg_stick = 1;
957             no_exit = 1;
958             printf("DRBG test with stuck continuous test...\n");
959         } else {
960             printf("Bad argument \"%s\"\n", argv[1]);
961             exit(1);
962         }
963         if (!no_exit) {
964                 fips_algtest_init_nofips();
965                 if (!FIPS_module_mode_set(1)) {
966                     printf("Power-up self test failed\n");
967                     exit(1);
968                 }
969                 printf("Power-up self test successful\n");
970                 exit(0);
971         }
972     }
973
974     fips_algtest_init_nofips();
975
976     /* Non-Approved cryptographic operation
977     */
978     printf("1. Non-Approved cryptographic operation test...\n");
979     test_msg("\ta. Included algorithm (D-H)...", dh_test());
980
981     /* Power-up self test
982     */
983     ERR_clear_error();
984     test_msg("2. Automatic power-up self test", FIPS_module_mode_set(1));
985     if (!FIPS_module_mode())
986         exit(1);
987     if (do_drbg_stick)
988             FIPS_drbg_stick();
989     if (do_rng_stick)
990             FIPS_x931_stick();
991
992     /* AES encryption/decryption
993     */
994     test_msg("3a. AES encryption/decryption", FIPS_aes_test());
995     /* AES GCM encryption/decryption
996     */
997     test_msg("3b. AES-GCM encryption/decryption", FIPS_aes_gcm_test());
998
999     /* RSA key generation and encryption/decryption
1000     */
1001     test_msg("4. RSA key generation and encryption/decryption",
1002                                                 FIPS_rsa_test(bad_rsa));
1003
1004     /* DES-CBC encryption/decryption
1005     */
1006     test_msg("5. DES-ECB encryption/decryption", FIPS_des3_test());
1007
1008     /* DSA key generation and signature validation
1009     */
1010     test_msg("6. DSA key generation and signature validation",
1011                                                 FIPS_dsa_test(bad_dsa));
1012
1013     /* SHA-1 hash
1014     */
1015     test_msg("7a. SHA-1 hash", FIPS_sha1_test());
1016
1017     /* SHA-256 hash
1018     */
1019     test_msg("7b. SHA-256 hash", FIPS_sha256_test());
1020
1021     /* SHA-512 hash
1022     */
1023     test_msg("7c. SHA-512 hash", FIPS_sha512_test());
1024
1025     /* HMAC-SHA-1 hash
1026     */
1027     test_msg("7d. HMAC-SHA-1 hash", FIPS_hmac_sha1_test());
1028
1029     /* HMAC-SHA-224 hash
1030     */
1031     test_msg("7e. HMAC-SHA-224 hash", FIPS_hmac_sha224_test());
1032
1033     /* HMAC-SHA-256 hash
1034     */
1035     test_msg("7f. HMAC-SHA-256 hash", FIPS_hmac_sha256_test());
1036
1037     /* HMAC-SHA-384 hash
1038     */
1039     test_msg("7g. HMAC-SHA-384 hash", FIPS_hmac_sha384_test());
1040
1041     /* HMAC-SHA-512 hash
1042     */
1043     test_msg("7h. HMAC-SHA-512 hash", FIPS_hmac_sha512_test());
1044
1045     /* CMAC-AES-128 hash
1046     */
1047     test_msg("8a. CMAC-AES-128 hash", FIPS_cmac_aes128_test());
1048
1049     /* CMAC-AES-192 hash
1050     */
1051     test_msg("8b. CMAC-AES-192 hash", FIPS_cmac_aes192_test());
1052
1053     /* CMAC-AES-256 hash
1054     */
1055     test_msg("8c. CMAC-AES-256 hash", FIPS_cmac_aes256_test());
1056
1057 # if 0                          /* Not a FIPS algorithm */
1058     /* CMAC-TDEA-2 hash
1059     */
1060     test_msg("8d. CMAC-TDEA-2 hash", FIPS_cmac_tdea2_test());
1061 #endif
1062
1063     /* CMAC-TDEA-3 hash
1064     */
1065     test_msg("8e. CMAC-TDEA-3 hash", FIPS_cmac_tdea3_test());
1066
1067     /* Non-Approved cryptographic operation
1068     */
1069     printf("9. Non-Approved cryptographic operation test...\n");
1070     printf("\ta. Included algorithm (D-H)...%s\n",
1071                 dh_test() ? "successful as expected"
1072                                                 : Fail("failed INCORRECTLY!") );
1073
1074     /* Zeroization
1075     */
1076     printf("10. Zero-ization...\n\t%s\n",
1077                 Zeroize() ? "successful as expected"
1078                                         : Fail("failed INCORRECTLY!") );
1079
1080     printf("11. Complete DRBG health check...\n\t%s\n",
1081                 FIPS_selftest_drbg_all() ? "successful as expected"
1082                                         : Fail("failed INCORRECTLY!") );
1083
1084     printf("\nAll tests completed with %d errors\n", Error);
1085     return Error ? 1 : 0;
1086     }
1087
1088 #endif