| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | /* *  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 <assert.h>#include <gmssl/mem.h>#include <gmssl/rand.h>#include <gmssl/error.h>#include <gmssl/sm4_cbc_mac.h>static int test_sm4_cbc_mac(void){	SM4_KEY sm4_key;	SM4_CBC_MAC_CTX ctx;	uint8_t key[16];	uint8_t iv[16] = {0};	uint8_t m[128];	uint8_t c[128];	uint8_t mac1[16];	uint8_t mac2[16];	uint8_t *p;	size_t len, left;	rand_bytes(key, sizeof(key));	rand_bytes(m, sizeof(m));	sm4_set_encrypt_key(&sm4_key, key);	// test 1	sm4_cbc_encrypt(&sm4_key, iv, m, sizeof(m)/16, c);	memcpy(mac1, c + sizeof(m) - 16, 16);	sm4_cbc_mac_init(&ctx, key);	p = m;	len = 0;	left = sizeof(m);	while (left) {		len = left < len ? left : len;		sm4_cbc_mac_update(&ctx, p, len);		p += len;		left -= len;		len++;	}	sm4_cbc_mac_finish(&ctx, mac2);	if (memcmp(mac1, mac2, 16)) {		error_print();		return -1;	}	// test 2	m[sizeof(m) - 1] = 0;	sm4_cbc_encrypt(&sm4_key, iv, m, sizeof(m)/16, c);	memcpy(mac1, c + sizeof(m) - 16, 16);	sm4_cbc_mac_init(&ctx, key);	p = m;	len = 0;	left = sizeof(m) - 1;	while (left) {		len = left < len ? left : len;		sm4_cbc_mac_update(&ctx, p, len);		p += len;		left -= len;		len++;	}	sm4_cbc_mac_finish(&ctx, mac2);	if (memcmp(mac1, mac2, 16)) {		error_print();		return -1;	}	printf("%s() ok\n", __FUNCTION__);	return 1;}int main(void){	if (test_sm4_cbc_mac() != 1) { error_print(); return -1; }	return 0;}
 |