From 445aa1c44a8de72015c71804b7bdddedf50f0a32 Mon Sep 17 00:00:00 2001 From: Ben Laurie Date: Sat, 27 Sep 2003 20:07:17 +0000 Subject: [PATCH] DSA self-test. --- fips/dsa/Makefile.ssl | 4 +- fips/dsa/fingerprint.sha1 | 1 + fips/dsa/fips_dsa_selftest.c | 162 +++++++++++++++++++++++++++++++++++ fips/fingerprint.sha1 | 6 +- fips/fips.c | 5 +- fips/fips.h | 2 + fips/fips_err.h | 3 +- fips/fips_make_sha1 | 2 +- fips/rsa/fingerprint.sha1 | 2 +- fips/rsa/fips_rsa_selftest.c | 1 - 10 files changed, 178 insertions(+), 10 deletions(-) create mode 100644 fips/dsa/fips_dsa_selftest.c diff --git a/fips/dsa/Makefile.ssl b/fips/dsa/Makefile.ssl index edd6b4444c..a544570c54 100644 --- a/fips/dsa/Makefile.ssl +++ b/fips/dsa/Makefile.ssl @@ -23,8 +23,8 @@ TEST=fips_dsatest.c APPS= LIB=$(TOP)/libcrypto.a -LIBSRC=fips_dsa_ossl.c fips_dsa_gen.c -LIBOBJ=fips_dsa_ossl.o fips_dsa_gen.o +LIBSRC=fips_dsa_ossl.c fips_dsa_gen.c fips_dsa_selftest.c +LIBOBJ=fips_dsa_ossl.o fips_dsa_gen.o fips_dsa_selftest.o SRC= $(LIBSRC) diff --git a/fips/dsa/fingerprint.sha1 b/fips/dsa/fingerprint.sha1 index ed1eae4a0e..7919d4f99c 100644 --- a/fips/dsa/fingerprint.sha1 +++ b/fips/dsa/fingerprint.sha1 @@ -1,2 +1,3 @@ SHA1(fips_dsa_ossl.c)= 7902d159932771d749ecba2ebf78995240356990 SHA1(fips_dsa_gen.c)= 37549c7769084e9989a3a26f7732557d3b691812 +SHA1(fips_dsa_selftest.c)= d638e2d13912befe42e0ed6efa8a27719b6689d5 diff --git a/fips/dsa/fips_dsa_selftest.c b/fips/dsa/fips_dsa_selftest.c new file mode 100644 index 0000000000..bca7c37faf --- /dev/null +++ b/fips/dsa/fips_dsa_selftest.c @@ -0,0 +1,162 @@ +/* crypto/dsa/dsatest.c */ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +#include +#include +#include +#include + +#ifdef OPENSSL_FIPS + +/* seed, out_p, out_q, out_g are taken from the updated Appendix 5 to + * FIPS PUB 186 and also appear in Appendix 5 to FIPS PIB 186-1 */ +static unsigned char seed[20]={ + 0xd5,0x01,0x4e,0x4b,0x60,0xef,0x2b,0xa8,0xb6,0x21,0x1b,0x40, + 0x62,0xba,0x32,0x24,0xe0,0x42,0x7d,0xd3, + }; + +static unsigned char out_p[]={ + 0x8d,0xf2,0xa4,0x94,0x49,0x22,0x76,0xaa, + 0x3d,0x25,0x75,0x9b,0xb0,0x68,0x69,0xcb, + 0xea,0xc0,0xd8,0x3a,0xfb,0x8d,0x0c,0xf7, + 0xcb,0xb8,0x32,0x4f,0x0d,0x78,0x82,0xe5, + 0xd0,0x76,0x2f,0xc5,0xb7,0x21,0x0e,0xaf, + 0xc2,0xe9,0xad,0xac,0x32,0xab,0x7a,0xac, + 0x49,0x69,0x3d,0xfb,0xf8,0x37,0x24,0xc2, + 0xec,0x07,0x36,0xee,0x31,0xc8,0x02,0x91, + }; + +static unsigned char out_q[]={ + 0xc7,0x73,0x21,0x8c,0x73,0x7e,0xc8,0xee, + 0x99,0x3b,0x4f,0x2d,0xed,0x30,0xf4,0x8e, + 0xda,0xce,0x91,0x5f, + }; + +static unsigned char out_g[]={ + 0x62,0x6d,0x02,0x78,0x39,0xea,0x0a,0x13, + 0x41,0x31,0x63,0xa5,0x5b,0x4c,0xb5,0x00, + 0x29,0x9d,0x55,0x22,0x95,0x6c,0xef,0xcb, + 0x3b,0xff,0x10,0xf3,0x99,0xce,0x2c,0x2e, + 0x71,0xcb,0x9d,0xe5,0xfa,0x24,0xba,0xbf, + 0x58,0xe5,0xb7,0x95,0x21,0x92,0x5c,0x9c, + 0xc4,0x2e,0x9f,0x6f,0x46,0x4b,0x08,0x8c, + 0xc5,0x72,0xaf,0x53,0xe6,0xd7,0x88,0x02, + }; + +static const unsigned char str1[]="12345678901234567890"; + +int FIPS_selftest_dsa() + { + DSA *dsa=NULL; + int counter,i,j; + unsigned char buf[256]; + unsigned long h; + unsigned char sig[256]; + unsigned int siglen; + + dsa=DSA_generate_parameters(512,seed,20,&counter,&h,NULL,NULL); + + if(dsa == NULL) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + if (counter != 105) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + if (h != 2) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + i=BN_bn2bin(dsa->q,buf); + j=sizeof(out_q); + if (i != j || memcmp(buf,out_q,i) != 0) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + + i=BN_bn2bin(dsa->p,buf); + j=sizeof(out_p); + if (i != j || memcmp(buf,out_p,i) != 0) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + + i=BN_bn2bin(dsa->g,buf); + j=sizeof(out_g); + if (i != j || memcmp(buf,out_g,i) != 0) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + DSA_generate_key(dsa); + DSA_sign(0, str1, 20, sig, &siglen, dsa); + if(DSA_verify(0, str1, 20, sig, siglen, dsa) != 1) + { + FIPSerr(FIPS_F_FIPS_SELFTEST_DSA,FIPS_R_SELFTEST_FAILED); + return 0; + } + DSA_free(dsa); + return 1; + } +#endif diff --git a/fips/fingerprint.sha1 b/fips/fingerprint.sha1 index a930af3e2e..04bcd27bcd 100644 --- a/fips/fingerprint.sha1 +++ b/fips/fingerprint.sha1 @@ -1,4 +1,4 @@ -SHA1(fips.c)= 8b4edd549ed66fff15c26ef9977c2d47a67f31e8 +SHA1(fips.c)= 6331570426ef9f1cd6622c3ae7f6db7326c8809c SHA1(fips_err_wrapper.c)= ad4a2ffa18743c83827de398c811eb6124ba0b27 -SHA1(fips.h)= 1a8bf37b0fb3131640b8dfbf3dcfa6d5fd5ce4a4 -SHA1(fips_err.h)= 90926739cc5aa4fa4a3e4746b83783bb079ea248 +SHA1(fips.h)= cef56e132e951f416f598141e9b71f54a080b0b7 +SHA1(fips_err.h)= d56d682b246db2aa10cd51de8659bd06b1be78d9 diff --git a/fips/fips.c b/fips/fips.c index 16280fbc95..b55abd4eb3 100644 --- a/fips/fips.c +++ b/fips/fips.c @@ -63,10 +63,13 @@ int FIPS_md5_allowed; int FIPS_selftest() { + ERR_load_crypto_strings(); + return FIPS_selftest_sha1() && FIPS_selftest_aes() && FIPS_selftest_des() - && FIPS_selftest_rsa(); + && FIPS_selftest_rsa() + && FIPS_selftest_dsa(); } static int FIPS_check_exe(const char *path) diff --git a/fips/fips.h b/fips/fips.h index 278678f33c..84bd11b5c4 100644 --- a/fips/fips.h +++ b/fips/fips.h @@ -63,6 +63,7 @@ int FIPS_selftest_sha1(void); int FIPS_selftest_aes(void); int FIPS_selftest_des(void); int FIPS_selftest_rsa(void); +int FIPS_selftest_dsa(void); /* The following lines are auto generated by the script mkerr.pl. Any changes * made after this point may be overwritten when the script is next run. @@ -83,6 +84,7 @@ void ERR_load_FIPS_strings(void); #define FIPS_F_FIPS_MODE_SET 105 #define FIPS_F_FIPS_SELFTEST_AES 104 #define FIPS_F_FIPS_SELFTEST_DES 107 +#define FIPS_F_FIPS_SELFTEST_DSA 109 #define FIPS_F_FIPS_SELFTEST_RSA 108 #define FIPS_F_FIPS_SELFTEST_SHA1 103 #define FIPS_F_HASH_FINAL 100 diff --git a/fips/fips_err.h b/fips/fips_err.h index a41f1f5505..79a8bcb430 100644 --- a/fips/fips_err.h +++ b/fips/fips_err.h @@ -71,7 +71,8 @@ static ERR_STRING_DATA FIPS_str_functs[]= {ERR_PACK(0,FIPS_F_FIPS_MODE_SET,0), "FIPS_mode_set"}, {ERR_PACK(0,FIPS_F_FIPS_SELFTEST_AES,0), "FIPS_selftest_aes"}, {ERR_PACK(0,FIPS_F_FIPS_SELFTEST_DES,0), "FIPS_selftest_des"}, -{ERR_PACK(0,FIPS_F_FIPS_SELFTEST_RSA,0), "FIPS_SELFTEST_RSA"}, +{ERR_PACK(0,FIPS_F_FIPS_SELFTEST_DSA,0), "FIPS_SELFTEST_DSA"}, +{ERR_PACK(0,FIPS_F_FIPS_SELFTEST_RSA,0), "FIPS_selftest_rsa"}, {ERR_PACK(0,FIPS_F_FIPS_SELFTEST_SHA1,0), "FIPS_selftest_sha1"}, {ERR_PACK(0,FIPS_F_HASH_FINAL,0), "HASH_FINAL"}, {ERR_PACK(0,FIPS_F_SSLEAY_RAND_BYTES,0), "SSLEAY_RAND_BYTES"}, diff --git a/fips/fips_make_sha1 b/fips/fips_make_sha1 index 7ff94fc807..2953175b95 100755 --- a/fips/fips_make_sha1 +++ b/fips/fips_make_sha1 @@ -18,7 +18,7 @@ cd ../aes $S fips_aes_core.c fips_aes_selftest.c fips_aes_locl.h > fingerprint.sha1 cd ../dsa -$S fips_dsa_ossl.c fips_dsa_gen.c > fingerprint.sha1 +$S fips_dsa_ossl.c fips_dsa_gen.c fips_dsa_selftest.c > fingerprint.sha1 cd ../des $S fips_des_enc.c fips_des_selftest.c fips_des_locl.h > fingerprint.sha1 diff --git a/fips/rsa/fingerprint.sha1 b/fips/rsa/fingerprint.sha1 index 8b361278ca..0e6dc8462a 100644 --- a/fips/rsa/fingerprint.sha1 +++ b/fips/rsa/fingerprint.sha1 @@ -1,3 +1,3 @@ SHA1(fips_rsa_eay.c)= 945cac757aecfad5a3c6bfcd4db7c384e51342f5 SHA1(fips_rsa_gen.c)= 4367cb3840db0df5b50846a198c33911c28ab2f4 -SHA1(fips_rsa_selftest.c)= 1b7884479dd0d86cff13cb3467b5aa7b9d0c91e3 +SHA1(fips_rsa_selftest.c)= b77290943c00293b1671d098a219763dcfa7f6d8 diff --git a/fips/rsa/fips_rsa_selftest.c b/fips/rsa/fips_rsa_selftest.c index f883c0152b..2af2a7999c 100644 --- a/fips/rsa/fips_rsa_selftest.c +++ b/fips/rsa/fips_rsa_selftest.c @@ -156,7 +156,6 @@ int FIPS_selftest_rsa() "\xef\x12\x34\x56\x78\x9a\xbc\xde\xf0\x12\x34\x56\x78\x9a\xbc\xde"; int n; - ERR_load_crypto_strings(); key=RSA_new(); clen=setkey(key,expected_ctext); n=RSA_public_encrypt(sizeof(original_ptext)-1,original_ptext,ctext,key, -- 2.25.1