| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | /* *  Copyright 2014-2022 The GmSSL Project. All Rights Reserved. * *  Licensed under the Apache License, Version 2.0 (the License); you may *  not use this file except in compliance with the License. * *  http://www.apache.org/licenses/LICENSE-2.0 */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <gmssl/hex.h>#include <gmssl/pbkdf2.h>#include <gmssl/error.h>struct {	char *pass;	char *salt;	int iter;	int dklen;	char *dk;} pbkdf2_hmac_sha1_tests[] = {	// rfc 6070 test vectors for pbkdf2-hmac-sha1	{		"password",		"salt",		1,		20,		"0c60c80f961f0e71f3a9b524af6012062fe037a6",	},	{		"password",		"salt",		2,		20,		"ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957",	},	{		"password",		"salt",		4096,		20,		"4b007901b765489abead49d926f721d065a429c1",	},	/*	{		"password",		"salt",		16777216, // very slow		20,		"eefe3d61cd4da4e4e9945b3d6ba2158c2634e984",	},	*/	{		"passwordPASSWORDpassword",		"saltSALTsaltSALTsaltSALTsaltSALTsalt",		4096,		25,		"3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038",	},};/*void test(void){	HMAC_CTX ctx;	uint8_t iter[4] = {0, 0, 0, 1};	uint8_t mac[20];	size_t len;	int i;	hmac_init(&ctx, DIGEST_sha1(), (uint8_t *)"password", 8);	hmac_update(&ctx, (uint8_t *)"salt", 4);	hmac_update(&ctx, iter, 4);	hmac_finish(&ctx, mac, &len);	for (i = 1; i < 4096; i++) {		uint8_t buf[20];		memset(&ctx, 0, sizeof(HMAC_CTX));		hmac_init(&ctx, DIGEST_sha1(), (uint8_t *)"password", 8);		hmac_update(&ctx, mac, len);		hmac_finish(&ctx, buf, &len);		int j;		for (j = 0; j < len; j++) {			mac[j] ^= buf[j];		}	}	for (i = 0; i < len; i++) {		printf("%02x", mac[i]);	}	printf("\n");}*/static int test_pbkdf2_genkey(void){// FIXME: currently we only has SHA-1 tests, replace with SHA-256#ifdef ENABLE_BROKEN_CRYPTO	int i;	uint8_t key[64];	uint8_t buf[64];	size_t len;	for (i = 0; i < sizeof(pbkdf2_hmac_sha1_tests)/sizeof(pbkdf2_hmac_sha1_tests[0]); i++) {		hex_to_bytes(pbkdf2_hmac_sha1_tests[i].dk, strlen(pbkdf2_hmac_sha1_tests[i].dk), buf, &len);		if (pbkdf2_genkey(DIGEST_sha1(),			pbkdf2_hmac_sha1_tests[i].pass, strlen(pbkdf2_hmac_sha1_tests[i].pass),			(uint8_t *)pbkdf2_hmac_sha1_tests[i].salt, strlen(pbkdf2_hmac_sha1_tests[i].salt),			pbkdf2_hmac_sha1_tests[i].iter, pbkdf2_hmac_sha1_tests[i].dklen, key) != 1) {			error_print();			return -1;		}		if (memcmp(key, buf, pbkdf2_hmac_sha1_tests[i].dklen) != 0) {			fprintf(stderr, "test_pbkdf2_genkey test %d failed\n", i);			return -1;		} else {			fprintf(stderr, "test_pbkdf2_genkey test %d ok\n", i);		}	}#endif	printf("%s() ok\n", __FUNCTION__);	return 0;}int main(int argc, char **argv){	int err = 0;	err += test_pbkdf2_genkey();	return err;}
 |