corecrypto/ccnistkdf/crypto_test/crypto_test_nistkdf.c

274 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright (c) (2013,2014,2015,2016,2018,2019) Apple Inc. All rights reserved.
*
* corecrypto is licensed under Apple Inc.s Internal Use License Agreement (which
* is contained in the License.txt file distributed with corecrypto) and only to
* people who accept that license. IMPORTANT: Any license rights granted to you by
* Apple Inc. (if any) are limited to internal use within your organization only on
* devices and computers you own or control, for the sole purpose of verifying the
* security characteristics and correct functioning of the Apple Software. You may
* not, directly or indirectly, redistribute the Apple Software or any portions thereof.
*/
#include "testmore.h"
#include "testbyteBuffer.h"
#include "testccnBuffer.h"
#include "ccnistkdf_priv.h"
static int verbose = 0;
#if (CCNISTKDF == 0)
entryPoint(ccnistkdf_tests,"ccnistkdf_hmac test")
#else
#include <corecrypto/ccasn1.h>
#include <corecrypto/ccdigest.h>
#include <corecrypto/ccdigest_priv.h>
#include <corecrypto/ccnistkdf.h>
#include <corecrypto/ccsha1.h>
#include <corecrypto/ccsha2.h>
typedef struct test_vector_t {
int testnum;
char *k1Str;
char *labelStr; // or fixedData
char *contextStr;
size_t result_len;
char *sha1_answer;
char *sha224_answer;
char *sha256_answer;
char *sha384_answer;
char *sha512_answer;
} test_vector;
static char *
digest_name(const struct ccdigest_info *di) {
if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA1)) return "SHA1";
if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA224)) return "SHA224";
if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA256)) return "SHA256";
if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA384)) return "SHA384";
if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA512)) return "SHA512";
return "";
}
static int test_answer(const struct ccdigest_info *di, test_vector *vector, size_t answer_len, void*answer) {
char *correct_answer = NULL;
if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA1)) correct_answer = vector->sha1_answer;
else if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA224)) correct_answer = vector->sha224_answer;
else if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA256)) correct_answer = vector->sha256_answer;
else if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA384)) correct_answer = vector->sha384_answer;
else if(ccdigest_oid_equal(di, CC_DIGEST_OID_SHA512)) correct_answer = vector->sha512_answer;
else correct_answer = NULL;
byteBuffer answer_bb = bytesToBytes(answer, answer_len);
if(correct_answer == NULL || strcmp(correct_answer, "") == 0) {
diag("Returned Answer for Test (%d) for NistKDF-CTR-HMac-%s\n", vector->testnum, digest_name(di));
cc_print("Output value",answer_bb->len,answer_bb->bytes);
return 1;
}
byteBuffer correct_answer_bb = hexStringToBytes((char *) correct_answer);
ok(bytesAreEqual(correct_answer_bb, answer_bb), "compare memory of answer");
if(bytesAreEqual(correct_answer_bb, answer_bb) == 0) {
diag("Failed Test (%d) for NistKDF-CTR-HMac-%s\n", vector->testnum, digest_name(di));
printByteBuffer(correct_answer_bb, "Correct Answer");
printByteBuffer(answer_bb, "Provided Answer");
}
free(correct_answer_bb);
free(answer_bb);
return 1;
}
static int test_ctr_hmac_fixed_oneshot(const struct ccdigest_info *di, test_vector *vector) {
uint8_t answer[vector->result_len];
byteBuffer k1 = hexStringToBytes(vector->k1Str);
byteBuffer label = hexStringToBytes(vector->labelStr);
ccnistkdf_ctr_hmac_fixed(di, k1->len, k1->bytes, label->len, label->bytes, vector->result_len, answer);
ok(test_answer(di, vector, vector->result_len, answer), "check answer");
free(k1);
free(label);
return 1;
}
static int test_nistkdf_hmac(const struct ccdigest_info *di) {
static test_vector vector_ctr_hmac[] = {
{ // from published NIST KAT for PRF=SHA256, R=32, CTRLOCATION=Before Raw FixedData
1,
"dd1d91b7d90b2bd3138533ce92b272fbf8a369316aefe242e659cc0ae238afe0", // K1
"01322b96b30acd197979444e468e1c5c6859bf1b1cf951b7e725303e237e46b8"\
"64a145fab25e517b08f8683d0315bb2911d80a0e8aba17f3b413faac", // Label/FixedData
"", // Context
16, // result_length
"cb2f32a1708b762bddb4ce6ae3c99f72", // SHA1
"f4bbe37ff89bfba838fbde108c1298e5", // SHA224
"10621342bfb0fd40046c0e29f2cfdbf0", // SHA256
"b8ede53b06a02d734c8f52abaf67e5d9", // SHA384
"6056854e0cd0b03a9026c42c1cd17de4", // SHA512
},
{ // from published NIST KAT for PRF=SHA224, R=32, CTRLOCATION=Before Raw FixedData
2,
"f5cb7cc6207f5920dd60155ddb68c3fbbdf5104365305d2c1abcd311", // K1
"4e5ac7539803da89581ee088c7d10235a10536360054b72b8e9f18f7"\
"7c25af01019b290656b60428024ce01fccf49022d831941407e6bd27"\
"ff9e2d28", // Label/FixedData
"", // Context
16, // result_length
"9a379dd1e18ecf2a00c1c9e4ca0f21e7", // SHA1
"0adbaab43edd532b560a322c84ac540e", // SHA224
"c571250d780cf51e6332713dfe84022b", // SHA256
"0d955e07d933eec54e8871c7fbceb2d3", // SHA384
"19c0c3c0c323efd19fa18f21830471e0", // SHA512
},
{ // from published NIST KAT for PRF=SHA1, R=32, CTRLOCATION=Before Raw FixedData
3,
"f7591733c856593565130975351954d0155abf3c", // K1
"8e347ef55d5f5e99eab6de706b51de7ce004f388"\
"2889e259ff4e5cff102167a5a4bd711578d4ce17"\
"dd9abe56e51c1f2df950e2fc812ec1b217ca08d6", // Label/FixedData
"", // Context
16, // result_length
"34fe44b0d8c41b93f5fa64fb96f00e5b", // SHA1
"6ea5f4643c111f2de3d7c4a4e9e23ae0", // SHA224
"2be4e09a1bd9c8c462205e3ecd9b9de2", // SHA256
"799b86a06a73ee08ba54151b219518a8", // SHA384
"f7d86befdde6d2353661995a6da53057", // SHA512
},
{ // from published NIST KAT for PRF=SHA384, R=32, CTRLOCATION=Before Raw FixedData
4,
"216ed044769c4c3908188ece61601af8"\
"819c30f501d12995df608e06f5e0e607"\
"ab54f542ee2da41906dfdb4971f20f9d", // K1
"638e9506a2c7be69ea346b84629a010c"\
"0e225b7548f508162c89f29c1ddbfd70"\
"472c2b58e7dc8aa6a5b06602f1c8ed49"\
"48cda79c62708218e26ac0e2", // Label/FixedData
"", // Context
16, // result_length
"42f4c5206acb6fde73ee356a97069e10", // SHA1
"8a943715e5568f12b13430ee88d53e57", // SHA224
"155b48ca2900dc1043f3c973454d1097", // SHA256
"d4b144bb40c7cabed13963d7d4318e72", // SHA384
"8b32a1e63e3633032f2f9cc6159aea21", // SHA512
},
{ // from published NIST KAT for PRF=SHA512, R=32, CTRLOCATION=Before Raw FixedData
5,
"dd5dbd45593ee2ac139748e7645b450f"\
"223d2ff297b73fd71cbcebe71d41653c"\
"950b88500de5322d99ef18dfdd304282"\
"94c4b3094f4c954334e593bd982ec614", // K1
"b50b0c963c6b3034b8cf19cd3f5c4ebe"\
"4f4985af0c03e575db62e6fdf1ecfe4f"\
"28b95d7ce16df85843246e1557ce95bb"\
"26cc9a21974bbd2eb69e8355", // Label/FixedData
"", // Context
16, // result_length
"a63a98af96ca265d7033963e9e6ed86d", // SHA1
"7eca8b022660a1161c441239b9e63f1f", // SHA224
"7d178ea8448edcad7e14aa32eb84f022", // SHA256
"a68e8d4b7102e6c75e77c072294f54c7", // SHA384
"e5993bf9bd2aa1c45746042e12598155", // SHA512
},
{ // from published NIST KAT for PRF=SHA1, R=32, CTRLOCATION=Before Raw FixedData, length 320
6,
"eea784c3e3181af8348385456878a775c3a41708", // K1
"51d601ecb9cabb4c5cc6348983a1d243"\
"44831812f6d3559399396418ff8824b7"\
"eae36350bb40dd66ec0677f49b5f5ab9"\
"805cb272562ed5c7ce0b30c9", // Label/FixedData
"", // Context
40, // result_length
"2fd6dc21e31cee812ae3738cea9f7c2a121c0a0f4b985b1d506eff72fde7fb6f0948c92a86b4b525", // SHA1
"2bc034e19979a8589be6c2c3eb20fb1dadd394b4cea3ce8d9621d0ccd40c852858dbd2c1a7628290", // SHA224
"9550a2395ea822cc16f4f041d21ebf1cf62204656291284cdacfa3c6b0c255cd5e93944771aa5648", // SHA256
"110066b403b2ab67198a2ba3a57868f87e322c3aad7e42d444ecf14174fbee5049b25f9d5aadfd7f", // SHA384
"b54833fd62e5d03cd678471174c3efc9b0a26a023724ab318b34b767f987d172e1e0fab0e48b0f82", // SHA512
},
{ // from published NIST KAT for PRF=SHA224, R=32, CTRLOCATION=Before Raw FixedData, length 320
7,
"6d4411ccfeca782ffc87ed9fc9163992d9e1cab24dea690b966b3231", // K1
"ee7967ddcaa6ddb242bbb2cee1fbf78632172d74f9bc0be645d52c19c7ee5b961ff6765432013372f693b7ca7f4489025fab6e599985c63e551e3733", // Label/FixedData
"", // Context
40, // result_length
"b3359f55651dd68ac85645b24908a15bdbb52be6d75673ecd5a4a14c4577c94e0c166e4cda7441f7", // SHA1
"221bb18f086c7396b73ecb68b20ce8ef61739a6db97b2ab8a3396722a93be1c759855a95de86d469", // SHA224
"438d0d10e935acc632168941eacd69d76bdf3f0270a49c793414f28c9cec29a081f2366b9e025987", // SHA256
"667d4d85cd8b08cf994296b1f5511c4c64da3f8e5c2daea23423d4750c99d2c39387c996f0b1c4cf", // SHA384
"3e3503794a770b9141c24e28ad52069cacf1cb9943b170999fab036674c6a56a1ec46bd621bb0191", // SHA512
},
{ // from published NIST KAT for PRF=SHA256, R=32, CTRLOCATION=Before Raw FixedData, length 320
8,
"9a6e83b91bd999737e577e449142dae05968e774b223c1185dc574da785c93cc", // K1
"4b5845c6737202632b2946c3579d9d4582b475dfa373945b0abc68c8f0daa36520179439086c6809aa182094453bc0bffef0dc2888b96295fcd6e442", // Label/FixedData
"", // Context
40, // result_length
"6245d8321bd5af6a96ace0f7367b3eb6de6e4cff1e83f58e33bc6f72ec6071fab0e5ea1b981e211e", // SHA1
"02daabf2c978cd4cec0a5730da4cffe505a7489c6c4b1f79b724d7b47429e8b5e09280c3aca62d70", // SHA224
"e90e3ed902a8eb1fc67823af534a2b48466bf2c5877dad0aadc7d6ff741d8f437b2e6d0031846960", // SHA256
"fe29134814802cf556b65b335a2350b58f634fe89bead19383670e55ec293e48f605895e51661947", // SHA384
"177fe6c90f460b18a62e3035c15bb35f7968ff6b2e431c56becbe3e83e7b3f1014d6154dbff103b5", // SHA512
},
{ // from published NIST KAT for PRF=SHA384, R=32, CTRLOCATION=Before Raw FixedData, length 320
9,
"0c5620f34aa7029f655a9eb9b051f13251d65bdf99d390b8f67898eb2216ec10bacb29358b895529db64fbfc942fd0ff", // K1
"6d8b8cdf7b699c0205c6feb4ac1839d3c436cf962f8575ee67ff20d69103c4aa93bb369d360980181e38c44215065c99a066946733ede23185183617", // Label/FixedData
"", // Context
40, // result_length
"8be493b61cfb17c9b07d946203ce6821e235b47e8929d06b666968f0660b3979b877dc9ccfbf5664", // SHA1
"0c82c5484d5ceddc3286a95849cd47d69d0d4ff5cdcf73f94c32c37d187ac33dbc0af3a4d34d67be", // SHA224
"f71a8f2ae10aebcffa80a43d113f05c8c5276a63ec6356b960ccb5cf8e2626bc2d540d04b8a6021c", // SHA256
"2857c7b4221a02b6717a1c67b1eeb64dcda8162284faae88466414b317e45457b5aaef5b5089722f", // SHA384
"83daadfab0823929bb358d1c650587e844a0bc9da9890da1694f14ce26c7eb8473d3ee07d0116561", // SHA512
},
{ // from published NIST KAT for PRF=SHA512, R=32, CTRLOCATION=Before Raw FixedData, length 320
10,
"46a65f2e432fe2aab26de24d1b9d39b44da270230f17844d44e249565a125f87a070b4b2eeac0b3a6c54acfc49ddc6360f59fe0e330e0605c61e85c5c27fe756", // K1
"b06a23e05945f96a293de59dc3db5972ca1fa00b4647ac38f753790335d5daeb2ffe09cf8924ac4e80b275ea4dbec53b9e2aaf90df0e6fd82ad69f7c", // Label/FixedData
"", // Context
40, // result_length
"0252c5b6e21f4de10b5f59d13b241c435b2b96cea07b2c45e1ec55eeeb9920c28a8eb889b2febf00", // SHA1
"3b63de00aacc5530280a99e92013525b1ed216ec9bb732734f469611f1ec3e6b065758ad9674611a", // SHA224
"dc68d700c478e6a1cf5f92952711c72ef7b4cd2d637bc63fa6249187a1326fd46eaea99fa3b7776c", // SHA256
"51eb9fb2f19253b9e236205dcb1c62e897dd7af387d54a9f466e71c63d9ea70a93f30bbb5f12a6bf", // SHA384
"04bbc4f93fb5c3589690798bf793c10bb726f87a4a2de93b8fdf6be8015abe156577119c5637ae71", // SHA512
},
};
int fixed_vector_size = sizeof(vector_ctr_hmac) / sizeof(test_vector);
if (verbose) diag("nistkdf_hmac LT Test\n");
for (int i = 0; i < fixed_vector_size; i++) {
ok(test_ctr_hmac_fixed_oneshot(di, &vector_ctr_hmac[i]), "test one-shot with data less than blocksize");
}
// test_size(di);
return 1;
}
int ccnistkdf_tests(TM_UNUSED int argc, TM_UNUSED char *const *argv)
{
plan_tests(341);
if(verbose) diag("Starting nistkdf_hmac tests\n");
// All pure C version
ok(test_nistkdf_hmac(&ccsha1_ltc_di), "ccsha1_ltc_di");
ok(test_nistkdf_hmac(&ccsha1_eay_di), "ccsha1_eay_di");
ok(test_nistkdf_hmac(&ccsha224_ltc_di), "ccsha224_ltc_di");
ok(test_nistkdf_hmac(&ccsha256_ltc_di), "ccsha256_ltc_di");
ok(test_nistkdf_hmac(&ccsha384_ltc_di), "ccsha384_ltc_di");
ok(test_nistkdf_hmac(&ccsha512_ltc_di), "ccsha512_ltc_di");
// Default for the current platform
ok(test_nistkdf_hmac(ccsha1_di()), "Default ccsha1_di");
ok(test_nistkdf_hmac(ccsha224_di()), "Default ccsha224_di");
ok(test_nistkdf_hmac(ccsha256_di()), "Default ccsha256_di");
ok(test_nistkdf_hmac(ccsha384_di()), "Default ccsha384_di");
ok(test_nistkdf_hmac(ccsha512_di()), "Default ccsha512_di");
return 0;
}
#endif