extern int command_digest(int argc, char * const *argv) { int result = 1; uint8_t *data = NULL; size_t data_len; const struct ccdigest_info *di; unsigned char *digest = NULL; unsigned long i,j; if (argc < 3) return 2; /* Return 2 triggers usage message. */ if (strcasecmp("sha1", argv[1]) == 0) { //printf("Calculating sha1\n"); di = ccsha1_di(); } else if (strcasecmp("sha256", argv[1]) == 0) { //printf("Calculating sha256\n"); di = ccsha256_di(); } else if (strcasecmp("sha512", argv[1]) == 0) { //printf("Calculating sha256\n"); di = ccsha512_di(); } else return 2; /* Return 2 triggers usage message. */ digest = malloc(di->output_size); if (!digest) goto exit; for (i = 2; i < (unsigned int)argc; ++i) { printf("%s(%s)= ", argv[1], argv[i]); if (read_file( argv[i], &data, &data_len) != 0 || !data) { printf("error reading file\n"); continue; } ccdigest(di, data_len, data, digest); for (j = 0; j < di->output_size; j++) printf("%02x", digest[j]); printf("\n"); free(data); data = NULL; } result = 0; exit: if(data) free(data); if (digest) free(digest); return result; }
int cchkdftest(TM_UNUSED int argc, TM_UNUSED char *const *argv) { size_t i, n; int err; plan_tests(10 * 2); if(verbose) diag("Starting hkdf tests\n"); n = sizeof(hkdf_sha256_tests) / sizeof(*hkdf_sha256_tests); for(i = 0; i < n; ++i) { const test_vector_t * tv = &hkdf_sha256_tests[ i ]; byteBuffer ikm = hexStringToBytes(tv->ikm); byteBuffer salt = hexStringToBytes(tv->salt); byteBuffer info = hexStringToBytes(tv->info); byteBuffer okmActual = mallocByteBuffer(tv->len); byteBuffer okmExpected = hexStringToBytes(tv->okm); const struct ccdigest_info * di; if( tv->type == type_sha1) di = ccsha1_di(); else if(tv->type == type_sha256) di = ccsha256_di(); else if(tv->type == type_sha512) di = ccsha512_di(); else abort(); err = cchkdf(di, ikm->len, ikm->bytes, salt->len, salt->bytes, info->len, info->bytes, okmActual->len, okmActual->bytes); ok(!err, "check return value"); ok(bytesAreEqual(okmActual, okmExpected), "compare memory of answer"); free(ikm); free(salt); free(info); free(okmActual); free(okmExpected); } return 0; }
static int HMAC_POST() { int result = -1; typedef struct { const struct ccdigest_info* digest_info; size_t key_size; unsigned char* key_buffer; size_t msg_size; unsigned char* msg_buffer; size_t digest_size; unsigned char* digest_buffer; } hmac_test; // HMAC-SHA1 Test Data #ifdef FORCE_FAIL unsigned char* hmacSha1KeyBuffer = (unsigned char*)"\x0f\x00\x00\x81\x31\x2a\x16\xfa\xc6\xa8\x1e\x98\x05\xe1\xd7\x84\x44\x5b\xff\x8c\xe6\x84\x99\xbe\x95\xeb\x4a\x36\xcb\xb0\x03\x34\x97\x3a\xe0\x72\x9e\x27\x50\xb4\x60\x89\x77\xa0\xbc\x4f\xd0\xd0\xb6\x01"; #else unsigned char* hmacSha1KeyBuffer = (unsigned char*)"\xee\xd8\x1b\x81\x31\x2a\x16\xfa\xc6\xa8\x1e\x98\x05\xe1\xd7\x84\x44\x5b\xff\x8c\xe6\x84\x99\xbe\x95\xeb\x4a\x36\xcb\xb0\x03\x34\x97\x3a\xe0\x72\x9e\x27\x50\xb4\x60\x89\x77\xa0\xbc\x4f\xd0\xd0\xb6\x01"; #endif size_t hmacSha1KeyBufferLength = 50; unsigned char* sha1MsgBuffer = (unsigned char*)"\xf0\x6b\xb4\x5b\xd0\x60\x58\x27\x82\x4c\xd0\x4d\xa7\x5b\x68\x7a\x86\xc9\x39\xef\xaf\xf9\xf1\x32\xdd\xc1\xd7\x04\x21\x08\x09\x94\x3d\x94\x08\xf2\x4e\x1d\x77\xc6\xaf\xa6\x20\x42\x19\x0d\x38\x55\x0f\xe0\xe4\x22\x79\x72\xfc\xb0\x8f\x2e\x0e\xe3\xf8\x2c\xa6\xab\x33\x02\xcc\x7b\x37\xdd\xcf\xfd\x56\xd0\x41\x04\x67\x6b\x43\xc2\x24\x90\x03\x3b\xd1\x82\x82\xf9\x1f\x3f\x9b\x01\x4f\x10\x41\x07\x9a\x5e\x08\xde\xd1\xc7\xe6\x32\x41\x71\x3b\x79\xd9\x9e\x10\x27\x8f\x81\x9c\x21\xff\x51\x0d\x75\x55\x9b\x85\x48\x6e\xdc\x62\x10"; size_t sha1MsgBufferLength = 128; unsigned char* sha1DigestBuffer = (unsigned char*)"\x88\x6e\xae\x70\xf3\x6b\xd3\x80\x5e\xeb\x12\x74\xb3\x24\x8f\xcc\xf5\xe1\x5b\x80"; size_t sha1DigestBufferLength = 20; // HMAC-SHA224 Test Data unsigned char* hmacSha224KeyBuffer = (unsigned char*)"\x76\x67\xba\x7e\x64\xcc\x36\x44\xa6\x8e\xa0\x3e\x54\xef\x7b\xef\xb7\xa5\xf7\xdd\x0b\x8e\xcd\xe7\x83\xa0\x6b\xd9\x8e\x1f\x51\x3e\x59\x12\xbb\x76\x95\xf7\x80\x08\x7a\xb6\x3a\x39\x0c\xd4\xa7\xdd\x9d\xe9"; size_t hmacSha224KeyBufferLength = 50; unsigned char* sha224MsgBuffer = (unsigned char*)"\xd3\x9b\x1f\xae\xa3\x0e\x5f\x64\x5b\x94\xfe\x32\x2d\xab\x54\xa3\xc6\x59\x1d\x0d\x76\xc0\xc4\xc4\x91\xf3\xe1\x8d\x15\x08\x00\x55\x8c\x6e\xa4\x23\x34\x81\x8b\x4c\x5e\x5c\x34\xe6\x14\xee\x9f\x7e\xfe\x51\x54\x0e\x87\x56\xa6\x29\x3b\x65\x39\x79\x73\x84\xc2\x6b\x35\xb5\x0e\x29\x56\x85\x46\xc9\xe1\xe2\x71\xc3\xbd\x2d\x3a\xa9\x89\x90\xf3\x12\xcb\x92\xdb\xd8\x4a\xe8\x9c\x83\xb8\x8e\x18\x04\x94\x17\x65\xa7\x4f\x42\x16\x43\xae\xcd\xbd\xb3\x6f\x8e\xae\x8a\x2f\xbf\x05\x03\x8b\x9a\xea\x37\x86\x26\x13\x93\x2a\x50\x8b\x88"; size_t sha224MsgBufferLength = 128; unsigned char* sha224DigestBuffer = (unsigned char*)"\xcb\xff\xc6\x5b\x24\x8c\x87\x8c\x85\xac\xf9\x4d\x1c\x0b\xfb\x1f\xe6\x8c\x22\x85\x76\x62\xac\x20\x2e\x9b\x47\xc1"; size_t sha224DigestBufferLength = 28; // HMAC-SHA256 Test Data unsigned char* hmacSha256KeyBuffer = (unsigned char*)"\xf3\xd9\x84\x1c\x78\x2e\x1d\xc8\x4d\x5f\xbd\x95\x23\x68\x3b\x8d\x29\xd1\xd5\x85\x2d\x3a\x74\x52\x04\x38\x32\x3a\x2d\x5f\x19\xa9\xb1\xa0\x2d\x25\x4d\xd6\xad\x84\xd3\x9b\x97\x5d\xce\x60\x6a\xbc\x65\xbd"; size_t hmacSha256KeyBufferLength = 50; unsigned char* sha256MsgBuffer = (unsigned char*)"\xce\xb6\xa4\x96\x7c\xc8\x60\xd3\xb8\x7a\x53\x1c\xb2\x4f\xc5\x31\x76\x35\xbf\x80\x11\x13\x5b\x50\xf6\xa1\x3d\x40\xa0\x7c\x62\xf0\x78\x7a\x19\xfe\xf8\x3a\x4e\x34\x11\x00\x0e\xff\xca\xc0\x48\x23\x2b\x79\xd1\xae\x59\xc5\xab\x2a\x02\xad\x87\x17\xfb\xc1\x88\x99\x28\x69\x4a\x6d\x9d\x76\x23\x21\x02\xfc\xa9\x85\x3c\x64\x74\x5d\x4a\xbd\x25\x58\x6c\x53\xa6\x46\x8b\x83\xb4\x85\xd5\xcd\x9b\xbc\xa8\x2b\x41\xcc\xb1\xa1\x66\x04\x55\x16\x2a\x95\x4f\x62\xd0\x45\x9b\xa8\xc1\x67\x93\xe6\xd4\x0a\x59\xca\xcc\x71\x74\xc8\x23\xc3"; size_t sha256MsgBufferLength = 128; unsigned char* sha256DigestBuffer = (unsigned char*)"\xc1\xcc\xf9\x1e\x8e\xa5\x8a\x16\x75\x6b\xe8\xe4\x08\xf3\x08\xc9\xe1\x02\xea\xe3\x54\x4f\xb6\x36\xdb\x18\x29\x34\x80\xae\xd1\xe1"; size_t sha256DigestBufferLength = 32; // HMAC-SHA384 Test Data unsigned char* hmacSha384KeyBuffer = (unsigned char*)"\xc6\xc9\xe0\x68\xd4\x39\x02\xee\xc3\x2b\x2f\x9f\x48\x0e\x69\x83\x1e\x47\xd2\x4b\x03\x26\xca\xe2\x03\x19\x58\x44\xf8\x20\xcb\x93\x52\x81\xa1\x68\x14\xbd\xa7\x67\x1f\xc2\x62\x16\xb3\x62\xae\xef\x33\x04\xa5\xb3\x28\x9a\xc2\x02\x89\xd3\x46\x29\x3a\x91\xdb\x3b\xd2\x9d\x78\x63\xa1\x9a\x84\x78\xf2\x37\x3e\xd2\x8d\xa9\x5c\x5c\x80\x59\xf2\xeb\x1f\xd9\x96\xce\x4a\x1d\xc2\xa7\xee\xe8\x7a\x79\xce\x84\x2e\x01\x84\xb6\xe1\x4a\xc2\xf1\x8b\x7c\xde\xca"; size_t hmacSha384KeyBufferLength = 110; unsigned char* sha384MsgBuffer = (unsigned char*)"\xd3\x69\xd5\x7c\x74\xb3\xac\x14\x97\xca\x2b\x8b\x92\xfb\x7a\x3d\xe0\x20\x17\x7e\x19\xc7\x6d\xda\x21\x90\xa9\xa1\xa0\xd7\xc9\xa4\xb3\x93\xf5\x39\xe2\x7e\x13\x85\x51\x77\x96\xfa\x3a\x24\x96\x1e\x9a\xdb\x26\x8e\x2b\xc3\xe2\x43\x93\x36\xc7\x15\xdb\x6a\x48\x7d\x22\x51\x9d\x9f\x93\xbd\x5f\x88\x94\xc8\x52\xb4\x40\x73\x82\xd3\x18\x8d\x91\xcc\xf5\xd7\x4f\x03\x42\x65\x8b\xd8\x67\x47\x29\x70\x88\x69\x75\xb7\x70\xb8\xb7\xa5\xc8\x86\x08\xc1\x8d\x30\x63\xe4\xc1\xfe\xff\x40\x60\x4a\xdc\xa0\x95\xe5\x9c\xf1\x2e\xb6\x95\x02"; size_t sha384MsgBufferLength = 128; unsigned char* sha384DigestBuffer = (unsigned char*)"\x01\x96\x0e\xcb\xda\xdb\x6c\x2f\x6a\xcd\xeb\x4c\x90\xb8\x74\x4c\x15\xe8\x17\x3e\x84\x2b\x47\x33\x7d\x9c\xf2\x28\x3c\x37\x9c\x6f\xca\x93\xe6\x00\x3c\x80\x3c\xcd\x7c\x75\x30\xb7\xdc\x4a\x7f\x7a"; size_t sha384DigestBufferLength = 48; // HMAC-SHA512 Test Data unsigned char* hmacSha512KeyBuffer = (unsigned char*)"\x14\x62\x37\xf2\xc2\x3c\x3c\x65\x22\x30\x60\x33\x44\x60\x4f\x29\x56\x92\xc7\xe0\x18\xd5\xa6\x88\x90\x66\x48\xe3\xfe\xd4\x0f\x94\x12\x63\x43\x9a\x5d\xae\x1d\x18\x06\x91\x1e\x57\xbe\x46\xa5\x0d\xf5\xce\xc1\xe0\x4e\x93\x44\x26\x51\x4b\x19\xef\x61\x1f\xd7\x45\xed\x0d\x95\xb2\xea\x8b\x01\x03\x80\x6d\xac\x4c\x03\x08\xa8\x2c\x26\x98\x55\x52\x6b\xdf\x78\x40\xde\x0f\x8d\x4f\x03\xea\x5f\xf4\x0d\x28\xd5\x41\x50\x19\x0f\xaf\xf9\x8b\xb1\x1a\xfd\xee"; size_t hmacSha512KeyBufferLength = 110; unsigned char* sha512MsgBuffer = (unsigned char*)"\x94\x14\x7a\x46\xd6\x7e\xef\x0b\x5e\x9f\x99\x24\x0a\xf4\xd3\x14\xa3\x30\x4d\x58\x02\xd6\x54\x9a\x77\x06\x54\x27\x6b\x97\x9b\xa3\x43\x67\x5f\xfc\x88\xef\x03\x9c\x45\x1b\x96\xe3\xb1\x58\x9d\xd4\x0e\xee\x12\x0e\xd1\x90\xac\xfe\x03\x31\x61\x54\xe7\x1a\x2a\xb3\xdd\x3a\x06\xad\x86\xbd\x41\xee\x29\xe0\xf6\xb7\x56\x03\xd3\x8f\xc9\xff\x1c\x35\x90\xbb\xf2\xd8\x71\xfa\xd6\x8a\x86\x77\x69\xf3\x2a\x34\x75\x42\x19\x0f\x31\x69\xd2\x96\xc1\x8a\x40\x1c\xfd\xac\x9a\x0d\x73\xb3\x88\x7e\xaf\x8f\x87\x08\xba\xb3\x8e\xd7\xe0\xc9"; size_t sha512MsgBufferLength = 128; unsigned char* sha512DigestBuffer = (unsigned char*)"\x57\x05\xbf\xd5\x85\x4b\x7c\xc3\xb7\xc8\xea\xca\x32\x41\x88\x40\xae\xde\x68\xe7\xcd\x62\x1e\x43\x8f\x6d\x61\x58\x3b\x45\x61\xfc\xa5\x47\x19\x04\xbd\x79\x22\x89\x59\xa3\x90\x86\x4c\x8a\x70\xa5\x30\x69\xda\x41\x72\xca\x34\xc0\xea\x49\x6e\x12\x8d\xcd\xb8\xc3"; size_t sha512DigestBufferLength = 64; uint8_t outputDigestBuffer[sha512DigestBufferLength]; memset(outputDigestBuffer, 0, sha512DigestBufferLength); const struct ccdigest_info* sha1Impl = ccsha1_di(); const struct ccdigest_info* sha224Impl = ccsha224_di(); const struct ccdigest_info* sha256Impl = ccsha256_di(); const struct ccdigest_info* sha384Impl = ccsha384_di(); const struct ccdigest_info* sha512Impl = ccsha512_di(); hmac_test testToRun[] = { {sha1Impl, hmacSha1KeyBufferLength, hmacSha1KeyBuffer, sha1MsgBufferLength, sha1MsgBuffer, sha1DigestBufferLength, sha1DigestBuffer}, {sha224Impl, hmacSha224KeyBufferLength, hmacSha224KeyBuffer, sha224MsgBufferLength, sha224MsgBuffer, sha224DigestBufferLength, sha224DigestBuffer}, {sha256Impl, hmacSha256KeyBufferLength, hmacSha256KeyBuffer, sha256MsgBufferLength, sha256MsgBuffer, sha256DigestBufferLength, sha256DigestBuffer}, {sha384Impl, hmacSha384KeyBufferLength, hmacSha384KeyBuffer, sha384MsgBufferLength, sha384MsgBuffer, sha384DigestBufferLength, sha384DigestBuffer}, {sha512Impl, hmacSha512KeyBufferLength, hmacSha512KeyBuffer, sha512MsgBufferLength, sha512MsgBuffer, sha512DigestBufferLength, sha512DigestBuffer} }; int numTestToRun = 5; for (int iCnt = 0; iCnt < numTestToRun; iCnt++) { hmac_test* currentTest = &(testToRun[iCnt]); const struct ccdigest_info* di_ptr = currentTest->digest_info; cchmac(di_ptr, currentTest->key_size, currentTest->key_buffer, currentTest->msg_size, currentTest->msg_buffer, outputDigestBuffer); if (memcmp(outputDigestBuffer, currentTest->digest_buffer, currentTest->digest_size)) { return result; } } return 0; }
static int SHA_POST() { int result = -1; size_t messageSize = 10; const struct ccdigest_info* sha1Impl = ccsha1_di(); const struct ccdigest_info* sha224Impl = ccsha224_di(); const struct ccdigest_info* sha256Impl = ccsha256_di(); const struct ccdigest_info* sha384Impl = ccsha384_di(); const struct ccdigest_info* sha512Impl = ccsha512_di(); typedef struct { const struct ccdigest_info* digest_info; unsigned char* msgBuffer; unsigned char* digestBuffer; size_t digestBufferLength; } digest_test; // SHA1 Test Data unsigned char* sha1MsgBuffer = (unsigned char*)"\xd2\x32\xb4\x7e\xa4\x52\xd5\xd7\xa0\x89"; #ifdef FORCE_FAIL unsigned char* shaDigestBuffer = (unsigned char*)"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13"; #else unsigned char* shaDigestBuffer = (unsigned char*)"\xb3\x31\xfe\x2c\xda\xc9\xc5\x2b\x0f\xae\xff\xfb\x04\x09\xa7\x3a\xaf\x86\xb3\x28"; #endif size_t sha1DigestBufferLength = 20; // SHA224 Test Data unsigned char* sha224MsgBuffer = (unsigned char*)"\x1e\x3b\x6a\x3b\xdc\x28\x69\x2a\x91\xcb"; unsigned char* sha224DigestBuffer = (unsigned char*)"\x15\x11\x75\xc0\x02\x80\x87\x3a\x2a\xc1\x62\x8d\x84\x4b\x7b\x67\x42\xa0\x39\x2d\xc5\xbd\x3a\xa7\x2b\x31\xed\x0b"; size_t sha224DigestBufferLength = 28; // SHA256 Test Data unsigned char* sha256MsgBuffer = (unsigned char*)"\xbe\x3b\x88\x4a\x36\x46\x4d\x88\x14\x28"; unsigned char* sha256DigestBuffer = (unsigned char*)"\xb3\x34\x8a\x1a\x93\x23\xbe\xef\x01\x77\x47\x99\xa2\x46\xea\xd9\x4b\xd8\x97\x41\x54\x09\xc7\xec\x3f\xb1\xa4\x5c\x62\x89\x85\xaa"; size_t sha256DigestBufferLength = 32; // SHA384 Test Data unsigned char* sha384MsgBuffer = (unsigned char*)"\x23\xcb\xcb\x15\xc6\xb5\xd3\xe7\xcc\x6a"; unsigned char* sha384DigestBuffer = (unsigned char*)"\x83\x3d\xdc\xf2\xf2\x9e\x7e\x3c\x3f\x73\x16\xa2\xdc\x10\x8c\x83\x1f\xbd\x4f\x7b\x61\x59\x53\x0d\xa9\x63\x64\xc8\xcd\x9e\xcf\xbe\x98\x9d\x7e\x97\x4b\xed\xba\xa0\x03\xa8\x2e\xd7\x06\x0b\xb3\xc8"; size_t sha384DigestBufferLength = 48; // SHA512 Test Data unsigned char* sha512MsgBuffer = (unsigned char*)"\x44\xc8\x73\x00\x21\x13\x2b\x4a\x2b\x7e"; unsigned char* sha512DigestBuffer = (unsigned char*)"\xbd\x5c\xa4\x21\xe4\x85\x8d\x3f\x1e\x11\xdf\xfb\x27\x38\xb0\x54\x7f\xec\xdb\xc1\x66\x7c\xed\x6a\x69\x44\x9b\x69\xcd\xf9\xb3\x91\x29\x55\x78\xb3\x80\xab\xde\x52\x48\x96\x6a\xd0\x7a\xf9\x5c\x77\x70\x7c\xc1\x5f\xf9\x08\xf6\xef\xb5\x9e\xf7\xc2\x45\x95\x46\x02"; size_t sha512DigestBufferLength = 64; uint8_t outputDigestBuffer[sha512DigestBufferLength]; memset(outputDigestBuffer, 0, sha512DigestBufferLength); digest_test testToRun[] = { // SHA1 {sha1Impl, sha1MsgBuffer, shaDigestBuffer, sha1DigestBufferLength}, // SHA224 {sha224Impl, sha224MsgBuffer, sha224DigestBuffer, sha224DigestBufferLength}, // SHA356 {sha256Impl, sha256MsgBuffer, sha256DigestBuffer, sha256DigestBufferLength}, // SHA384 {sha384Impl, sha384MsgBuffer, sha384DigestBuffer, sha384DigestBufferLength}, // SHA512 {sha512Impl, sha512MsgBuffer, sha512DigestBuffer, sha512DigestBufferLength} }; int numTestToRun = 5; for (int iCnt = 0; iCnt < numTestToRun; iCnt++) { digest_test* currentTest = &(testToRun[iCnt]); const struct ccdigest_info* di_ptr = currentTest->digest_info; ccdigest(di_ptr, messageSize, currentTest->msgBuffer, outputDigestBuffer); if (0 != memcmp(currentTest->digestBuffer, outputDigestBuffer, currentTest->digestBufferLength)) { return result; } } return 0; }