diff --git a/testprof/dsa_test.c b/testprof/dsa_test.c index feb1562..357dd02 100644 --- a/testprof/dsa_test.c +++ b/testprof/dsa_test.c @@ -44,6 +44,20 @@ static const unsigned char openssl_priv_dsa[] = { 0xd8, 0x1f, 0xc5 }; +/* private key - raw hexadecimal numbers */ +char *hex_g = "3B92E4FF5929150B08995A7BF2AD1440556FA047FF9099B344B3D4FC451505AE6722439CBA3710A5894737ECCCF5AEADA8B47A35CB9D935CEDE6B07E9694C4A60C7DD6708A094F814A0EC213FBEB16BFEAA4F456FF723005DE8A443FBEC6852655D62D1D1EDB15DAA445833C1797980B8D87F3490D90BDA9AB676E87687223DC"; +char *hex_p = "C50A37515CABD618D5A270BD4A6F6B4AF9E139950F2B99387D9A64D64CB5967ADCEDACA8ACC61B655ADEDB0061251A182CEEA10790625E4D123190C70321FA09E7B173D78EAFDBFDBFB3EFADD1A12A036DE706924A852AFF7A0166531FEAC66741845AC06CED62F9C2626205A4FA48A066EC35C9A811FEB981ABEEBE31B6BFCF"; +char *hex_q = "AA5BD7F4E5062413E58835CA00C7A635716194C5"; +char *hex_x = "9936E5E4E9FB28BE91F5065FE8C935B3F5D81FC5"; +char *hex_y = "5316B0FBBF598A5E5595C14FAC43B80853E6CF0D9223FAB184595239BFCBF22D383ADD935205497E2B12C46173E36F54BD96E5A7AAA95A58A4B767D2C0BDC81EB13A124F98C005EF395D6ABAB70B3BD8B795DD796EA2D28473470388B464D9B9B84FF1C934BBF97366F57C2E11FEC331E60838596781EB6D4127D70D74AFA035"; + +/* private key - raw decimal numbers */ +char *dec_g = "41834149751984197912953436480983170533071735026506895442815002322147255782590882063707309354781506433716654796985480894012184326029507913813728323760888731712844346877576824916725534905000120412305763983626878322597033839508975868744887842375259196379140567488975525420966465471602331600963525846901216912348"; +char *dec_p = "138366127874251453574215823372867983172559870428080754538874699342292548213873551009389476481395012375639515165022292709776266658812209612126692196557051247870332681145778007636026326219557730049370214260237710845864302921876857532769906463917243319959886290876544710558897185626634470575981605420411381006287"; +char *dec_q = "972576611327916959546542817054443329226761409733"; +char *dec_x = "874699854785640347852049895863914110365034094533"; +char *dec_y = "58346825863862115220306694056113472976936045407556113559931032566376300411053620606958863235131122432665794570437845128216268156672161823000705623178942581094085367656740608001229642983928728905397237964247962716781137229394844332774819193277135681825866994604976120931444766148118918668354923664000689348661"; + /* The public part of test_dsa.key in SubjectPublicKeyInfo format */ static const unsigned char openssl_pub_dsa[] = { 0x30, 0x82, 0x01, 0xb6, 0x30, 0x82, 0x01, 0x2b, 0x06, 0x07, 0x2a, 0x86, @@ -88,8 +102,8 @@ static const unsigned char openssl_pub_dsa[] = { static int dsa_compat_test(void) { dsa_key key; - unsigned char tmp[1024]; - unsigned long x; + unsigned char tmp[1024], buf[1024]; + unsigned long x, len; DO(dsa_import(openssl_priv_dsa, sizeof(openssl_priv_dsa), &key)); @@ -112,6 +126,46 @@ static int dsa_compat_test(void) DO((memcmp(tmp, openssl_pub_dsa, sizeof(openssl_pub_dsa)) == 0)?CRYPT_OK:CRYPT_ERROR); dsa_free(&key); + /* try import private key from raw hexadecimal numbers */ + DO(dsa_import_radix(16, hex_p, hex_q, hex_g, hex_x, hex_y, &key)); + len = sizeof(buf); + DO(dsa_export(buf, &len, PK_PRIVATE | PK_STD, &key)); + if (len != sizeof(openssl_priv_dsa) || memcmp(buf, openssl_priv_dsa, len)) { + fprintf(stderr, "DSA private export failed to match dsa_import_radix(16, ..)\n"); + return 1; + } + dsa_free(&key); + + /* try import private key from raw decimal numbers */ + DO(dsa_import_radix(10, dec_p, dec_q, dec_g, dec_x, dec_y, &key)); + len = sizeof(buf); + DO(dsa_export(buf, &len, PK_PRIVATE | PK_STD, &key)); + if (len != sizeof(openssl_priv_dsa) || memcmp(buf, openssl_priv_dsa, len)) { + fprintf(stderr, "DSA private export failed to match dsa_import_radix(10, ..)\n"); + return 1; + } + dsa_free(&key); + + /* try import public key from raw hexadecimal numbers */ + DO(dsa_import_radix(16, hex_p, hex_q, hex_g, NULL, hex_y, &key)); + len = sizeof(buf); + DO(dsa_export(buf, &len, PK_PUBLIC | PK_STD, &key)); + if (len != sizeof(openssl_pub_dsa) || memcmp(buf, openssl_pub_dsa, len)) { + fprintf(stderr, "DSA public export failed to match dsa_import_radix(16, ..)\n"); + return 1; + } + dsa_free(&key); + + /* try import public key from raw decimal numbers */ + DO(dsa_import_radix(10, dec_p, dec_q, dec_g, NULL, dec_y, &key)); + len = sizeof(buf); + DO(dsa_export(buf, &len, PK_PUBLIC | PK_STD, &key)); + if (len != sizeof(openssl_pub_dsa) || memcmp(buf, openssl_pub_dsa, len)) { + fprintf(stderr, "DSA public export failed to match dsa_import_radix(10, ..)\n"); + return 1; + } + dsa_free(&key); + return 0; }