xref: /btstack/test/crypto/aes_ccm_test.c (revision f88ad41f77f7f7380cf4f30f10a5f0edb26f8233)
181132a39SMatthias Ringwald #include <stdio.h>
281132a39SMatthias Ringwald #include <stdint.h>
381132a39SMatthias Ringwald #include "btstack_util.h"
4ba1e2dc4SMatthias Ringwald #include "aes_ccm.h"
5995faa29SMatthias Ringwald #include "btstack_crypto.h"
675ba91cfSMatthias Ringwald 
781132a39SMatthias Ringwald typedef uint8_t key_t[16];
881132a39SMatthias Ringwald 
981132a39SMatthias Ringwald #define LOG_KEY(NAME) { printf("%16s: ", #NAME); printf_hexdump(NAME, 16); }
1081132a39SMatthias Ringwald #define PARSE_KEY(NAME) { parse_hex(NAME, NAME##_string); LOG_KEY(NAME); }
1181132a39SMatthias Ringwald #define DEFINE_KEY(NAME, VALUE) key_t NAME; parse_hex(NAME, VALUE); LOG_KEY(NAME);
1281132a39SMatthias Ringwald 
1381132a39SMatthias Ringwald static int parse_hex(uint8_t * buffer, const char * hex_string){
1481132a39SMatthias Ringwald 	int len = 0;
1581132a39SMatthias Ringwald 	while (*hex_string){
1681132a39SMatthias Ringwald 		if (*hex_string == ' '){
1781132a39SMatthias Ringwald 			hex_string++;
1881132a39SMatthias Ringwald 			continue;
1981132a39SMatthias Ringwald 		}
2081132a39SMatthias Ringwald 		int high_nibble = nibble_for_char(*hex_string++);
2181132a39SMatthias Ringwald 		int low_nibble = nibble_for_char(*hex_string++);
2281132a39SMatthias Ringwald 		*buffer++ = (high_nibble << 4) | low_nibble;
2381132a39SMatthias Ringwald 		len++;
2481132a39SMatthias Ringwald 	}
2581132a39SMatthias Ringwald 	return len;
2681132a39SMatthias Ringwald }
2781132a39SMatthias Ringwald 
28995faa29SMatthias Ringwald static void ccm_done(void * arg){
29995faa29SMatthias Ringwald 
30995faa29SMatthias Ringwald }
31995faa29SMatthias Ringwald 
32*f88ad41fSMatthias Ringwald static void message_24_upper_transport_encrypt(void){
33*f88ad41fSMatthias Ringwald 	printf("[+] Upper transport encrypt\n");
34*f88ad41fSMatthias Ringwald 	DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875");
35*f88ad41fSMatthias Ringwald 	DEFINE_KEY(app_key,    "63964771734fbd76e3b40519d1d94a48");
36*f88ad41fSMatthias Ringwald 
37*f88ad41fSMatthias Ringwald 	uint8_t app_nonce[13];
38*f88ad41fSMatthias Ringwald 	parse_hex(app_nonce, "010007080d1234973612345677");
39*f88ad41fSMatthias Ringwald 	printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13);
40*f88ad41fSMatthias Ringwald 
41*f88ad41fSMatthias Ringwald 	uint8_t plaintext[8];
42*f88ad41fSMatthias Ringwald 	parse_hex(plaintext, "ea0a00576f726c64");
43*f88ad41fSMatthias Ringwald 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext));
44*f88ad41fSMatthias Ringwald 
45*f88ad41fSMatthias Ringwald 	printf("Reference:\n");
46*f88ad41fSMatthias Ringwald 	uint8_t ciphertext[8+8];
47*f88ad41fSMatthias Ringwald 	bt_mesh_ccm_encrypt(app_key, app_nonce, plaintext, sizeof(plaintext), label_uuid, sizeof(label_uuid), ciphertext, 8);
48*f88ad41fSMatthias Ringwald 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8);
49*f88ad41fSMatthias Ringwald 	printf("%16s: ", "TransMIC");     printf_hexdump(&ciphertext[8], 8);
50*f88ad41fSMatthias Ringwald 
51*f88ad41fSMatthias Ringwald 	// btstack_crypto
52*f88ad41fSMatthias Ringwald 	printf("btstack_crypto:\n");
53*f88ad41fSMatthias Ringwald 	uint8_t trans_mic[8];
54*f88ad41fSMatthias Ringwald 	btstack_crypto_init();
55*f88ad41fSMatthias Ringwald 	btstack_crypto_ccm_t btstack_crypto_ccm;
56*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(plaintext), sizeof(label_uuid), sizeof(trans_mic));
57*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_digest(&btstack_crypto_ccm, label_uuid, 16,  &ccm_done, NULL);
58*f88ad41fSMatthias Ringwald 	btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL);
59*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic);
60*f88ad41fSMatthias Ringwald 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8);
61*f88ad41fSMatthias Ringwald 	printf("%16s: ", "TransMIC");     printf_hexdump(trans_mic, 8);
62*f88ad41fSMatthias Ringwald }
63*f88ad41fSMatthias Ringwald 
64*f88ad41fSMatthias Ringwald static void message_24_upper_transport_decrypt(void){
65*f88ad41fSMatthias Ringwald 	printf("[+] Upper transport decrypt\n");
66*f88ad41fSMatthias Ringwald 	DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875");
67*f88ad41fSMatthias Ringwald 	DEFINE_KEY(app_key,    "63964771734fbd76e3b40519d1d94a48");
68*f88ad41fSMatthias Ringwald 
69*f88ad41fSMatthias Ringwald 	uint8_t app_nonce[13];
70*f88ad41fSMatthias Ringwald 	parse_hex(app_nonce, "010007080d1234973612345677");
71*f88ad41fSMatthias Ringwald 	printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13);
72*f88ad41fSMatthias Ringwald 
73*f88ad41fSMatthias Ringwald 
74*f88ad41fSMatthias Ringwald 	uint8_t ciphertext[8];
75*f88ad41fSMatthias Ringwald 	parse_hex(ciphertext, "DE1547118463123E");
76*f88ad41fSMatthias Ringwald 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, sizeof(ciphertext));
77*f88ad41fSMatthias Ringwald 
78*f88ad41fSMatthias Ringwald 	printf("Reference:\n");
79*f88ad41fSMatthias Ringwald 	uint8_t plaintext[8+8];
80*f88ad41fSMatthias Ringwald 	bt_mesh_ccm_decrypt(app_key, app_nonce, ciphertext, sizeof(ciphertext), label_uuid, sizeof(label_uuid), plaintext, 8);
81*f88ad41fSMatthias Ringwald 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8);
82*f88ad41fSMatthias Ringwald 	printf("%16s: ", "TransMIC");    printf_hexdump(&plaintext[8], 8);
83*f88ad41fSMatthias Ringwald 
84*f88ad41fSMatthias Ringwald 	// btstack_crypto
85*f88ad41fSMatthias Ringwald 	printf("btstack_crypto:\n");
86*f88ad41fSMatthias Ringwald 	uint8_t trans_mic[8];
87*f88ad41fSMatthias Ringwald 	btstack_crypto_init();
88*f88ad41fSMatthias Ringwald 	btstack_crypto_ccm_t btstack_crypto_ccm;
89*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(ciphertext), sizeof(label_uuid), sizeof(trans_mic));
90*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_digest(&btstack_crypto_ccm, label_uuid, 16,  &ccm_done, NULL);
91*f88ad41fSMatthias Ringwald 	btstack_crypto_ccm_decrypt_block(&btstack_crypto_ccm, sizeof(ciphertext), ciphertext, plaintext, &ccm_done, NULL);
92*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic);
93*f88ad41fSMatthias Ringwald 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8);
94*f88ad41fSMatthias Ringwald 	printf("%16s: ", "TransMIC");     printf_hexdump(trans_mic, 8);
95*f88ad41fSMatthias Ringwald }
96*f88ad41fSMatthias Ringwald 
97*f88ad41fSMatthias Ringwald static void message_24_lower_transport_segment_0(void){
98*f88ad41fSMatthias Ringwald 	printf("[+] Lower Transport Segment 0\n");
9981132a39SMatthias Ringwald 	DEFINE_KEY(encryption_key, "0953fa93e7caac9638f58820220a398e");
10081132a39SMatthias Ringwald 
10181132a39SMatthias Ringwald 	uint8_t network_nonce[13];
10281132a39SMatthias Ringwald 	parse_hex(network_nonce, "000307080d1234000012345677");
10381132a39SMatthias Ringwald 	printf("%16s: ", "network_nonce"); printf_hexdump(network_nonce, 13);
10481132a39SMatthias Ringwald 
10581132a39SMatthias Ringwald 	uint8_t plaintext[18];
10681132a39SMatthias Ringwald 	parse_hex(plaintext, "9736e6a03401de1547118463123e5f6a17b9");
10781132a39SMatthias Ringwald 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext));
10881132a39SMatthias Ringwald 
109995faa29SMatthias Ringwald 	printf("Reference:\n");
11081132a39SMatthias Ringwald 	uint8_t ciphertext[18+4];
11181132a39SMatthias Ringwald 	bt_mesh_ccm_encrypt(encryption_key, network_nonce, plaintext, sizeof(plaintext), NULL, 0, ciphertext, 4);
11281132a39SMatthias Ringwald 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18);
11381132a39SMatthias Ringwald 	printf("%16s: ", "NetMIC");     printf_hexdump(&ciphertext[18], 4);
114995faa29SMatthias Ringwald 
115995faa29SMatthias Ringwald 	// btstack_crypto
116995faa29SMatthias Ringwald 	printf("btstack_crypto:\n");
117995faa29SMatthias Ringwald 	uint8_t net_mic[4];
118995faa29SMatthias Ringwald 	btstack_crypto_init();
119995faa29SMatthias Ringwald 	btstack_crypto_ccm_t btstack_crypto_ccm;
120*f88ad41fSMatthias Ringwald 	btstack_crypo_ccm_init(&btstack_crypto_ccm, encryption_key, network_nonce, sizeof(plaintext), 0, 4);
121995faa29SMatthias Ringwald 	btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL);
122995faa29SMatthias Ringwald 	btstack_crypo_ccm_get_authentication_value(&btstack_crypto_ccm, net_mic);
123995faa29SMatthias Ringwald 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18);
124995faa29SMatthias Ringwald 	printf("%16s: ", "NetMIC");     printf_hexdump(net_mic, 4);
12581132a39SMatthias Ringwald }
12681132a39SMatthias Ringwald 
12781132a39SMatthias Ringwald int main(void){
128*f88ad41fSMatthias Ringwald 	message_24_upper_transport_encrypt();
129*f88ad41fSMatthias Ringwald 	message_24_upper_transport_decrypt();
130*f88ad41fSMatthias Ringwald 	message_24_lower_transport_segment_0();
13181132a39SMatthias Ringwald 	return 0;
13281132a39SMatthias Ringwald }
133