xref: /btstack/test/crypto/aes_ccm_test.c (revision 064b9c7f1668e2cfbb1b5fd82c435f8b68c3f6e3)
1 #include <stdio.h>
2 #include <stdint.h>
3 #include "btstack_util.h"
4 #include "aes_ccm.h"
5 #include "btstack_crypto.h"
6 
7 typedef uint8_t key_t[16];
8 
9 #define LOG_KEY(NAME) { printf("%16s: ", #NAME); printf_hexdump(NAME, 16); }
10 #define PARSE_KEY(NAME) { parse_hex(NAME, NAME##_string); LOG_KEY(NAME); }
11 #define DEFINE_KEY(NAME, VALUE) key_t NAME; parse_hex(NAME, VALUE); LOG_KEY(NAME);
12 
parse_hex(uint8_t * buffer,const char * hex_string)13 static int parse_hex(uint8_t * buffer, const char * hex_string){
14 	int len = 0;
15 	while (*hex_string){
16 		if (*hex_string == ' '){
17 			hex_string++;
18 			continue;
19 		}
20 		int high_nibble = nibble_for_char(*hex_string++);
21 		int low_nibble = nibble_for_char(*hex_string++);
22 		*buffer++ = (high_nibble << 4) | low_nibble;
23 		len++;
24 	}
25 	return len;
26 }
27 
ccm_done(void * arg)28 static void ccm_done(void * arg){
29 
30 }
31 
message_24_upper_transport_encrypt(void)32 static void message_24_upper_transport_encrypt(void){
33 	printf("[+] Upper transport encrypt\n");
34 	DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875");
35 	DEFINE_KEY(app_key,    "63964771734fbd76e3b40519d1d94a48");
36 
37 	uint8_t app_nonce[13];
38 	parse_hex(app_nonce, "018007080d1234973612345677");
39 	printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13);
40 
41 	uint8_t plaintext[8];
42 	parse_hex(plaintext, "ea0a00576f726c64");
43 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext));
44 
45 	printf("Reference:\n");
46 	uint8_t ciphertext[8+8];
47 	bt_mesh_ccm_encrypt(app_key, app_nonce, plaintext, sizeof(plaintext), label_uuid, sizeof(label_uuid), ciphertext, 8);
48 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8);
49 	printf("%16s: ", "TransMIC");     printf_hexdump(&ciphertext[8], 8);
50 
51 	// btstack_crypto
52 	printf("btstack_crypto:\n");
53 	uint8_t trans_mic[8];
54 	btstack_crypto_init();
55 	btstack_crypto_ccm_t btstack_crypto_ccm;
56 	btstack_crypto_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(plaintext), sizeof(label_uuid), sizeof(trans_mic));
57 	btstack_crypto_ccm_digest(&btstack_crypto_ccm, label_uuid, 16,  &ccm_done, NULL);
58 	btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL);
59 	btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic);
60 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 8);
61 	printf("%16s: ", "TransMIC");     printf_hexdump(trans_mic, 8);
62 }
63 
message_24_upper_transport_decrypt(void)64 static void message_24_upper_transport_decrypt(void){
65 	printf("[+] Upper transport decrypt\n");
66 	DEFINE_KEY(label_uuid, "f4a002c7fb1e4ca0a469a021de0db875");
67 	DEFINE_KEY(app_key,    "63964771734fbd76e3b40519d1d94a48");
68 
69 	uint8_t app_nonce[13];
70 	parse_hex(app_nonce, "018007080d1234973612345677");
71 	printf("%16s: ", "app_nonce"); printf_hexdump(app_nonce, 13);
72 
73 
74 	uint8_t ciphertext[8];
75 	parse_hex(ciphertext, "c3c51d8e476b28e3");
76 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, sizeof(ciphertext));
77 
78 	printf("Reference:\n");
79 	uint8_t plaintext[8+8];
80 	bt_mesh_ccm_decrypt(app_key, app_nonce, ciphertext, sizeof(ciphertext), label_uuid, sizeof(label_uuid), plaintext, 8);
81 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8);
82 	printf("%16s: ", "TransMIC");    printf_hexdump(&plaintext[8], 8);
83 
84 	// btstack_crypto
85 	printf("btstack_crypto:\n");
86 	uint8_t trans_mic[8];
87 	btstack_crypto_init();
88 	btstack_crypto_ccm_t btstack_crypto_ccm;
89 	btstack_crypto_ccm_init(&btstack_crypto_ccm, app_key, app_nonce, sizeof(ciphertext), sizeof(label_uuid), sizeof(trans_mic));
90 	btstack_crypto_ccm_digest(&btstack_crypto_ccm, label_uuid, 16,  &ccm_done, NULL);
91 	btstack_crypto_ccm_decrypt_block(&btstack_crypto_ccm, sizeof(ciphertext), ciphertext, plaintext, &ccm_done, NULL);
92 	btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, trans_mic);
93 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, 8);
94 	printf("%16s: ", "TransMIC");     printf_hexdump(trans_mic, 8);
95 }
96 
message_24_lower_transport_segment_0(void)97 static void message_24_lower_transport_segment_0(void){
98 	printf("[+] Lower Transport Segment 0\n");
99 	DEFINE_KEY(encryption_key, "0953fa93e7caac9638f58820220a398e");
100 
101 	uint8_t network_nonce[13];
102 	parse_hex(network_nonce, "000307080d1234000012345677");
103 	printf("%16s: ", "network_nonce"); printf_hexdump(network_nonce, 13);
104 
105 	uint8_t plaintext[18];
106 	parse_hex(plaintext, "9736e6a03401de1547118463123e5f6a17b9");
107 	printf("%16s: ", "plaintext"); printf_hexdump(plaintext, sizeof(plaintext));
108 
109 	printf("Reference:\n");
110 	uint8_t ciphertext[18+4];
111 	bt_mesh_ccm_encrypt(encryption_key, network_nonce, plaintext, sizeof(plaintext), NULL, 0, ciphertext, 4);
112 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18);
113 	printf("%16s: ", "NetMIC");     printf_hexdump(&ciphertext[18], 4);
114 
115 	// btstack_crypto
116 	printf("btstack_crypto:\n");
117 	uint8_t net_mic[4];
118 	btstack_crypto_init();
119 	btstack_crypto_ccm_t btstack_crypto_ccm;
120 	btstack_crypto_ccm_init(&btstack_crypto_ccm, encryption_key, network_nonce, sizeof(plaintext), 0, 4);
121 	btstack_crypto_ccm_encrypt_block(&btstack_crypto_ccm, sizeof(plaintext), plaintext, ciphertext, &ccm_done, NULL);
122 	btstack_crypto_ccm_get_authentication_value(&btstack_crypto_ccm, net_mic);
123 	printf("%16s: ", "ciphertext"); printf_hexdump(ciphertext, 18);
124 	printf("%16s: ", "NetMIC");     printf_hexdump(net_mic, 4);
125 }
126 
main(void)127 int main(void){
128 	message_24_upper_transport_encrypt();
129 	message_24_upper_transport_decrypt();
130 	message_24_lower_transport_segment_0();
131 	return 0;
132 }
133