RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 30-May-2010 00:38:08 Branch: HEAD Handle: 2010052922380700 Modified files: rpm/tests trsa.c Log: - rsa: WIP. Summary: Revision Changes Path 1.7 +161 -121 rpm/tests/trsa.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/tests/trsa.c ============================================================================ $ cvs diff -u -r1.6 -r1.7 trsa.c --- rpm/tests/trsa.c 29 May 2010 20:51:10 -0000 1.6 +++ rpm/tests/trsa.c 29 May 2010 22:38:07 -0000 1.7 @@ -1250,65 +1250,75 @@ } static void -check_one_md(pgpDig dig, int algo, const char *data, int len, const char *expect) +pgpDigTestDigest(pgpDig dig, int algo, int flags, + const char *data, int datalen, const char *expect) { - gcry_md_hd_t hd2; - gcry_md_hd_t hd; - unsigned char *p; - int mdlen; - int i; - gcry_error_t err = 0; - - err = gcry_md_open(&hd, algo, 0); - if (err) { - fail("algo %d, gcry_md_open failed: %s\n", algo, - gpg_strerror(err)); + DIGEST_CTX nctx; + DIGEST_CTX ctx; + rpmuint8_t * p; + size_t plen; +int xx; + + ctx = rpmDigestInit(algo, flags); + if (ctx == NULL) { + rpmlog(RPMLOG_ERR, "digest(%d) rpmDigestInit(%d,%d) failed\n", + algo, flags); return; } - mdlen = gcry_md_get_algo_dlen(algo); - if (mdlen < 1 || mdlen > 500) { - fail("algo %d, gcry_md_get_algo_dlen failed: %d\n", algo, mdlen); - return; - } + rpmlog(RPMLOG_INFO, " checking %s [%i] for length %d\n", + rpmDigestName(ctx), algo, + (data[0] == '!' && data[1] == '\0') + ? 1000 * 1000 : datalen); - if (*data == '!' && !data[1]) { /* hash one million times a "a" */ + /* hash one million times an "a" */ + if (data[0] == '!' && data[1] == '\0') { char aaa[1000]; + int i; /* Write in odd size chunks so that we test the buffering. */ - memset(aaa, 'a', 1000); + memset(aaa, 'a', sizeof(aaa)); for (i = 0; i < 1000; i++) - gcry_md_write(hd, aaa, 1000); + xx = rpmDigestUpdate(ctx, aaa, sizeof(aaa)); } else - gcry_md_write(hd, data, len); + xx = rpmDigestUpdate(ctx, data, datalen); - err = gcry_md_copy(&hd2, hd); - if (err) { - fail("algo %d, gcry_md_copy failed: %s\n", algo, - gpg_strerror(err)); + nctx = rpmDigestDup(ctx); + if (nctx == NULL) + rpmlog(RPMLOG_ERR, "rpmDigestDup failed\n"); + + xx = rpmDigestFinal(ctx, &p, &plen, 0); + if (plen < 1 || plen > 500) { + rpmlog(RPMLOG_ERR, "digest(%d) length out-of-range\n", algo, plen); + } else + if (memcmp(p, expect, plen)) { + const char * p_str = xstrdup(pgpHexStr(p, plen)); + const char * expected_str = xstrdup(pgpHexStr((rpmuint8_t *)expect, plen)); + rpmlog(RPMLOG_ERR, "\ +digest(%d) mismatch\n\ +computed: %s\n\ +expected: %s\n", algo, p_str, expected_str); + p_str = _free(p_str); + expected_str = _free(expected_str); } - gcry_md_close(hd); - - p = gcry_md_read(hd2, algo); - - if (memcmp(p, expect, mdlen)) { - printf("computed: "); - for (i = 0; i < mdlen; i++) - printf("%02x ", p[i] & 0xFF); - printf("\nexpected: "); - for (i = 0; i < mdlen; i++) - printf("%02x ", expect[i] & 0xFF); - printf("\n"); - - fail("algo %d, digest mismatch\n", algo); + xx = rpmDigestFinal(nctx, &p, &plen, 0); + if (plen < 1 || plen > 500) { + rpmlog(RPMLOG_ERR, "dup digest(%d) length out-of-range\n", algo, plen); + } else + if (memcmp(p, expect, plen)) { + const char * p_str = xstrdup(pgpHexStr(p, plen)); + const char * expected_str = xstrdup(pgpHexStr((rpmuint8_t *)expect, plen)); + rpmlog(RPMLOG_ERR, "\ +dup digest(%d) mismatch\n\ +computed: %s\n\ +expected: %s\n", algo, p_str, expected_str); + p_str = _free(p_str); + expected_str = _free(expected_str); } - - gcry_md_close(hd2); } - -static void check_digests(pgpDig dig) +static void pgpDigTestDigests(pgpDig dig) { static struct algos { int md; @@ -1316,11 +1326,11 @@ const char *expect; } algos[] = { - { GCRY_MD_MD4, "", + { PGPHASHALGO_MD4, "", "\x31\xD6\xCF\xE0\xD1\x6A\xE9\x31\xB7\x3C\x59\xD7\xE0\xC0\x89\xC0" }, - { GCRY_MD_MD4, "a", + { PGPHASHALGO_MD4, "a", "\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46\x24\x5e\x05\xfb\xdb\xd6\xfb\x24" }, - { GCRY_MD_MD4, "message digest", + { PGPHASHALGO_MD4, "message digest", "\xd9\x13\x0a\x81\x64\x54\x9f\xe8\x18\x87\x48\x06\xe1\xc7\x01\x4b" }, { PGPHASHALGO_MD5, "", "\xD4\x1D\x8C\xD9\x8F\x00\xB2\x04\xE9\x80\x09\x98\xEC\xF8\x42\x7E" }, @@ -1382,8 +1392,10 @@ { PGPHASHALGO_RIPEMD160, "message digest", "\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8" "\x81\xb1\x23\xa8\x5f\xfa\x21\x59\x5f\x36" }, - { GCRY_MD_CRC32, "", "\x00\x00\x00\x00" }, - { GCRY_MD_CRC32, "foo", "\x8c\x73\x65\x21" }, + { PGPHASHALGO_CRC32, "", "\x00\x00\x00\x00" }, + { PGPHASHALGO_CRC32, "foo", "\x8c\x73\x65\x21" }, + +#ifdef NOTYET { GCRY_MD_CRC32_RFC1510, "", "\x00\x00\x00\x00" }, { GCRY_MD_CRC32_RFC1510, "foo", "\x73\x32\xbc\x33" }, { GCRY_MD_CRC32_RFC1510, "test0123456789", "\xb8\x3e\x88\xd6" }, @@ -1401,77 +1413,86 @@ #endif { GCRY_MD_CRC24_RFC2440, "", "\xb7\x04\xce" }, { GCRY_MD_CRC24_RFC2440, "foo", "\x4f\xc2\x55" }, +#endif /* NOTYET */ - { PGPHASHALGO_TIGER192, "", +#ifdef NOTNOW /* XXX RFC 2440/4880 mismatch */ +/* This is the old TIGER variant based on the unfixed reference + * implementation. IT was used in GnupG up to 1.3.2. We don't provide + * an OID anymore because that would not be correct. + */ + + { GCRY_MD_TIGER, "", "\x24\xF0\x13\x0C\x63\xAC\x93\x32\x16\x16\x6E\x76" "\xB1\xBB\x92\x5F\xF3\x73\xDE\x2D\x49\x58\x4E\x7A" }, - { PGPHASHALGO_TIGER192, "abc", + { GCRY_MD_TIGER, "abc", "\xF2\x58\xC1\xE8\x84\x14\xAB\x2A\x52\x7A\xB5\x41" "\xFF\xC5\xB8\xBF\x93\x5F\x7B\x95\x1C\x13\x29\x51" }, - { PGPHASHALGO_TIGER192, "Tiger", + { GCRY_MD_TIGER, "Tiger", "\x9F\x00\xF5\x99\x07\x23\x00\xDD\x27\x6A\xBB\x38" "\xC8\xEB\x6D\xEC\x37\x79\x0C\x11\x6F\x9D\x2B\xDF" }, - { PGPHASHALGO_TIGER192, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg" + { GCRY_MD_TIGER, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg" "hijklmnopqrstuvwxyz0123456789+-", "\x87\xFB\x2A\x90\x83\x85\x1C\xF7\x47\x0D\x2C\xF8" "\x10\xE6\xDF\x9E\xB5\x86\x44\x50\x34\xA5\xA3\x86" }, - { PGPHASHALGO_TIGER192, "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdef" + { GCRY_MD_TIGER, "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdef" "ghijklmnopqrstuvwxyz+0123456789", "\x46\x7D\xB8\x08\x63\xEB\xCE\x48\x8D\xF1\xCD\x12" "\x61\x65\x5D\xE9\x57\x89\x65\x65\x97\x5F\x91\x97" }, - { PGPHASHALGO_TIGER192, "Tiger - A Fast New Hash Function, " + { GCRY_MD_TIGER, "Tiger - A Fast New Hash Function, " "by Ross Anderson and Eli Biham", "\x0C\x41\x0A\x04\x29\x68\x86\x8A\x16\x71\xDA\x5A" "\x3F\xD2\x9A\x72\x5E\xC1\xE4\x57\xD3\xCD\xB3\x03" }, - { PGPHASHALGO_TIGER192, "Tiger - A Fast New Hash Function, " + { GCRY_MD_TIGER, "Tiger - A Fast New Hash Function, " "by Ross Anderson and Eli Biham, proceedings of Fa" "st Software Encryption 3, Cambridge.", "\xEB\xF5\x91\xD5\xAF\xA6\x55\xCE\x7F\x22\x89\x4F" "\xF8\x7F\x54\xAC\x89\xC8\x11\xB6\xB0\xDA\x31\x93" }, - { PGPHASHALGO_TIGER192, "Tiger - A Fast New Hash Function, " + { GCRY_MD_TIGER, "Tiger - A Fast New Hash Function, " "by Ross Anderson and Eli Biham, proceedings of Fa" "st Software Encryption 3, Cambridge, 1996.", "\x3D\x9A\xEB\x03\xD1\xBD\x1A\x63\x57\xB2\x77\x4D" "\xFD\x6D\x5B\x24\xDD\x68\x15\x1D\x50\x39\x74\xFC" }, - { PGPHASHALGO_TIGER192, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh" + { GCRY_MD_TIGER, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh" "ijklmnopqrstuvwxyz0123456789+-ABCDEFGHIJKLMNOPQRS" "TUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-", "\x00\xB8\x3E\xB4\xE5\x34\x40\xC5\x76\xAC\x6A\xAE" "\xE0\xA7\x48\x58\x25\xFD\x15\xE7\x0A\x59\xFF\xE4" }, +#endif /* NOTNOW */ - { GCRY_MD_TIGER1, "", + { PGPHASHALGO_TIGER192, "", "\x32\x93\xAC\x63\x0C\x13\xF0\x24\x5F\x92\xBB\xB1" "\x76\x6E\x16\x16\x7A\x4E\x58\x49\x2D\xDE\x73\xF3" }, - { GCRY_MD_TIGER1, "a", + { PGPHASHALGO_TIGER192, "a", "\x77\xBE\xFB\xEF\x2E\x7E\xF8\xAB\x2E\xC8\xF9\x3B" "\xF5\x87\xA7\xFC\x61\x3E\x24\x7F\x5F\x24\x78\x09" }, - { GCRY_MD_TIGER1, "abc", + { PGPHASHALGO_TIGER192, "abc", "\x2A\xAB\x14\x84\xE8\xC1\x58\xF2\xBF\xB8\xC5\xFF" "\x41\xB5\x7A\x52\x51\x29\x13\x1C\x95\x7B\x5F\x93" }, - { GCRY_MD_TIGER1, "message digest", + { PGPHASHALGO_TIGER192, "message digest", "\xD9\x81\xF8\xCB\x78\x20\x1A\x95\x0D\xCF\x30\x48" "\x75\x1E\x44\x1C\x51\x7F\xCA\x1A\xA5\x5A\x29\xF6" }, - { GCRY_MD_TIGER1, "abcdefghijklmnopqrstuvwxyz", + { PGPHASHALGO_TIGER192, "abcdefghijklmnopqrstuvwxyz", "\x17\x14\xA4\x72\xEE\xE5\x7D\x30\x04\x04\x12\xBF" "\xCC\x55\x03\x2A\x0B\x11\x60\x2F\xF3\x7B\xEE\xE9" }, - { GCRY_MD_TIGER1, + { PGPHASHALGO_TIGER192, "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", "\x0F\x7B\xF9\xA1\x9B\x9C\x58\xF2\xB7\x61\x0D\xF7" "\xE8\x4F\x0A\xC3\xA7\x1C\x63\x1E\x7B\x53\xF7\x8E" }, - { GCRY_MD_TIGER1, + { PGPHASHALGO_TIGER192, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789", "\x8D\xCE\xA6\x80\xA1\x75\x83\xEE\x50\x2B\xA3\x8A" "\x3C\x36\x86\x51\x89\x0F\xFB\xCC\xDC\x49\xA8\xCC" }, - { GCRY_MD_TIGER1, + { PGPHASHALGO_TIGER192, "1234567890" "1234567890" "1234567890" "1234567890" "1234567890" "1234567890" "1234567890" "1234567890", "\x1C\x14\x79\x55\x29\xFD\x9F\x20\x7A\x95\x8F\x84" "\xC5\x2F\x11\xE8\x87\xFA\x0C\xAB\xDF\xD9\x1B\xFD" }, - { GCRY_MD_TIGER1, "!", + { PGPHASHALGO_TIGER192, "!", "\x6D\xB0\xE2\x72\x9C\xBE\xAD\x93\xD7\x15\xC6\xA7" "\xD3\x63\x02\xE9\xB3\xCE\xE0\xD2\xBC\x31\x4B\x41" }, +#ifdef NOTYET { GCRY_MD_TIGER2, "", "\x44\x41\xBE\x75\xF6\x01\x87\x73\xC2\x06\xC2\x27" "\x45\x37\x4B\x92\x4A\xA8\x31\x3F\xEF\x91\x9F\x41" }, @@ -1532,6 +1553,7 @@ "\x29\x05\x7F\xD8\x6B\x20\xBF\xD6\x2D\xEC\xA0\xF1\xCC\xEA\x4A\xF5" "\x1F\xC1\x54\x90\xED\xDC\x47\xAF\x32\xBB\x2B\x66\xC3\x4F\xF9\xAD" "\x8C\x60\x08\xAD\x67\x7F\x77\x12\x69\x53\xB2\x26\xE4\xED\x8B\x01" }, +#endif /* NOTYET */ { 0 }, }; int i; @@ -1545,74 +1567,87 @@ algos[i].md); continue; } - rpmlog(RPMLOG_INFO, " checking %s [%i] for length %zi\n", - gcry_md_algo_name(algos[i].md), - algos[i].md, - !strcmp(algos[i].data, "!") ? - 1000000 : strlen(algos[i].data)); - check_one_md(dig, algos[i].md, algos[i].data, strlen(algos[i].data), - algos[i].expect); + pgpDigTestDigest(dig, algos[i].md, 0, + algos[i].data, strlen(algos[i].data), algos[i].expect); + } rpmlog(RPMLOG_INFO, "Completed hash checks.\n"); } static void -check_one_hmac(pgpDig dig, int algo, const char *data, int datalen, +pgpDigTestHMAC(pgpDig dig, int algo, int flags, const char *data, int datalen, const char *key, int keylen, const char *expect) { - gcry_md_hd_t hd, hd2; - unsigned char *p; - int mdlen; - int i; - gcry_error_t err = 0; - - err = gcry_md_open(&hd, algo, GCRY_MD_FLAG_HMAC); - if (err) { - fail("algo %d, gcry_md_open failed: %s\n", algo, - gpg_strerror(err)); - return; - } - - mdlen = gcry_md_get_algo_dlen(algo); - if (mdlen < 1 || mdlen > 500) { - fail("algo %d, gcry_md_get_algo_dlen failed: %d\n", algo, mdlen); + DIGEST_CTX nctx; + DIGEST_CTX ctx; + rpmuint8_t * p; + size_t plen; +int xx; + + ctx = rpmDigestInit(algo, flags); + if (ctx == NULL) { + rpmlog(RPMLOG_ERR, "digest(%d) rpmDigestInit(%d,%d) failed\n", + algo, flags); return; } - gcry_md_setkey(hd, key, keylen); - - gcry_md_write(hd, data, datalen); + rpmlog(RPMLOG_INFO, " checking %s [%i] for %d byte key and %d byte data\n", + rpmDigestName(ctx), algo, keylen, + (data[0] == '!' && data[1] == '\0') + ? 1000 * 1000 : datalen); - err = gcry_md_copy(&hd2, hd); - if (err) { - fail("algo %d, gcry_md_copy failed: %s\n", algo, - gpg_strerror(err)); - } - - gcry_md_close(hd); + xx = rpmHmacInit(ctx, key, keylen); - p = gcry_md_read(hd2, algo); - if (!p) - fail("algo %d, hmac gcry_md_read failed\n", algo); + /* hash one million times an "a" */ + if (data[0] == '!' && data[1] == '\0') { + char aaa[1000]; + int i; - if (memcmp(p, expect, mdlen)) { - printf("computed: "); - for (i = 0; i < mdlen; i++) - printf("%02x ", p[i] & 0xFF); - printf("\nexpected: "); - for (i = 0; i < mdlen; i++) - printf("%02x ", expect[i] & 0xFF); - printf("\n"); + /* Write in odd size chunks so that we test the buffering. */ + memset(aaa, 'a', sizeof(aaa)); + for (i = 0; i < 1000; i++) + xx = rpmDigestUpdate(ctx, aaa, sizeof(aaa)); + } else + xx = rpmDigestUpdate(ctx, data, datalen); - fail("algo %d, digest mismatch\n", algo); + nctx = rpmDigestDup(ctx); + if (nctx == NULL) + rpmlog(RPMLOG_ERR, "rpmDigestDup failed\n"); + + xx = rpmDigestFinal(ctx, &p, &plen, 0); + if (plen < 1 || plen > 500) { + rpmlog(RPMLOG_ERR, "digest(%d) length out-of-range\n", algo, plen); + } else + if (memcmp(p, expect, plen)) { + const char * p_str = xstrdup(pgpHexStr(p, plen)); + const char * expected_str = xstrdup(pgpHexStr((rpmuint8_t *)expect, plen)); + rpmlog(RPMLOG_ERR, "\ +digest(%d) mismatch\n\ +computed: %s\n\ +expected: %s\n", algo, p_str, expected_str); + p_str = _free(p_str); + expected_str = _free(expected_str); } - gcry_md_close(hd2); + xx = rpmDigestFinal(nctx, &p, &plen, 0); + if (plen < 1 || plen > 500) { + rpmlog(RPMLOG_ERR, "dup digest(%d) length out-of-range\n", algo, plen); + } else + if (memcmp(p, expect, plen)) { + const char * p_str = xstrdup(pgpHexStr(p, plen)); + const char * expected_str = xstrdup(pgpHexStr((rpmuint8_t *)expect, plen)); + rpmlog(RPMLOG_ERR, "\ +dup digest(%d) mismatch\n\ +computed: %s\n\ +expected: %s\n", algo, p_str, expected_str); + p_str = _free(p_str); + expected_str = _free(expected_str); + } } -static void check_hmac(pgpDig dig) +static void pgpDigTestHMACS(pgpDig dig) { static struct algos { @@ -1906,15 +1941,19 @@ algos[i].md); continue; } +#ifdef DYING +/* XXX FIXME: rpmDigestName */ rpmlog(RPMLOG_INFO, " checking %s [%i] for %zi byte key and %zi byte data\n", gcry_md_algo_name(algos[i].md), algos[i].md, strlen(algos[i].key), strlen(algos[i].data)); +#endif - check_one_hmac(dig, algos[i].md, algos[i].data, strlen(algos[i].data), - algos[i].key, strlen(algos[i].key), - algos[i].expect); + pgpDigTestHMAC(dig, algos[i].md, 0, + algos[i].data, strlen(algos[i].data), + algos[i].key, strlen(algos[i].key), + algos[i].expect); } rpmlog(RPMLOG_INFO, "Completed hashed MAC checks.\n"); @@ -2262,20 +2301,21 @@ gcry_set_progress_handler(progress_handler, NULL); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); + if (rpmIsDebug() || _pgp_debug) gcry_control(GCRYCTL_SET_DEBUG_FLAGS, 1u, 0); - /* No valuable keys are create, so we can speed up our RNG. */ + + /* No valuable keys are created, so we can speed up our RNG. */ gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0); if (!selftest_only) { check_ciphers(dig); check_cipher_modes(dig); - check_digests(dig); - check_hmac(dig); + pgpDigTestDigests(dig); + pgpDigTestHMACS(dig); check_pubkey(dig); } - if (in_fips_mode && !selftest_only) { /* If we are in fips mode do some more tests. */ gcry_md_hd_t md; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
