📄 test_ccmp.c
字号:
11 ab 1d 98 c7 fe 73 50 71 3d 6a12 Muted 802.11 Header = 88 42 5a f2 84 30 fd ab bf f9 43 b9 f9 a613 ab 1d 98 c7 fe 73 00 00 0d 0014 CCMP Header = 89 89 00 60 a4 ec 81 6b15 CCM Nonce = 0d bf f9 43 b9 f9 a6 6b 81 ec a4 89 8916 Plaintext Data = ab fd a2 2d 3a 0b fc 9c c1 fc 07 93 63 c2 fc a117 43 e6 eb 1d18 CCM MIC = 30 9a 8d 5c 46 6b bb 7119 -- Encrypted MPDU with FCS20 88 52 e1 1f 5a f2 84 30 fd ab bf f9 43 b9 f9 a6 ab 1d 98 c7 fe 7321 50 71 3d 6a 89 89 00 60 a4 ec 81 6b 9a 70 9b 60 a3 9d 40 b1 df b622 12 e1 8b 5f 11 4b ad b6 cc 86 30 9a 8d 5c 46 6b bb 71 86 c0 4e 97*/static const u_int8_t test6_key[] = { /* TK */ 0xf7, 0x1e, 0xea, 0x4e, 0x1f, 0x58, 0x80, 0x4b, 0x97, 0x17, 0x23, 0x0a, 0xd0, 0x61, 0x46, 0x41,};static const u_int8_t test6_plaintext[] = { /* Plaintext MPDU w/o MIC */ 0x88, 0x52, 0xe1, 0x1f, 0x5a, 0xf2, 0x84, 0x30, 0xfd, 0xab, 0xbf, 0xf9, 0x43, 0xb9, 0xf9, 0xa6, 0xab, 0x1d, 0x98, 0xc7, 0xfe, 0x73, 0x50, 0x71, 0x3d, 0x6a, 0xab, 0xfd, 0xa2, 0x2d, 0x3a, 0x0b, 0xfc, 0x9c, 0xc1, 0xfc, 0x07, 0x93, 0x63, 0xc2, 0xfc, 0xa1, 0x43, 0xe6, 0xeb, 0x1d,};static const u_int8_t test6_encrypted[] = { /* Encrypted MPDU with MIC */ 0x88, 0x52, 0xe1, 0x1f, 0x5a, 0xf2, 0x84, 0x30, 0xfd, 0xab, 0xbf, 0xf9, 0x43, 0xb9, 0xf9, 0xa6, 0xab, 0x1d, 0x98, 0xc7, 0xfe, 0x73, 0x50, 0x71, 0x3d, 0x6a, 0x89, 0x89, 0x00, 0x60, 0xa4, 0xec, 0x81, 0x6b, 0x9a, 0x70, 0x9b, 0x60, 0xa3, 0x9d, 0x40, 0xb1, 0xdf, 0xb6, 0x12, 0xe1, 0x8b, 0x5f, 0x11, 0x4b, 0xad, 0xb6, 0xcc, 0x86, 0x30, 0x9a, 0x8d, 0x5c, 0x46, 0x6b, 0xbb, 0x71,};/*==== CCMP test mpdu 7 ====-- MPDU Fields25 Version = 026 Type = 2 SubType = 1 Data+CF-Ack27 ToDS = 1 FromDS = 028 MoreFrag = 0 Retry = 129 PwrMgt = 1 moreData = 130 Encrypt = 131 Order = 032 Duration = 1804933 A1 = 9b-50-f4-fd-56-f6 BSSID34 A2 = ef-ec-95-20-16-91 SA35 A3 = 83-57-0c-4c-cd-ee DA36 SC = 0xA02037 seqNum = 2562 (0x0A02) fraqNum = 0 (0x00)38 Algorithm = AES_CCM39 Key ID = 340 TK = 1b db 34 98 0e 03 81 24 a1 db 1a 89 2b ec 36 6a41 PN = 104368786630435 (0x5EEC4073E723)42 Header = 18 79 81 46 9b 50 f4 fd 56 f6 ef ec 95 20 16 91 83 5743 0c 4c cd ee 20 a044 Muted MAC Header = 08 41 9b 50 f4 fd 56 f6 ef ec 95 20 16 9145 83 57 0c 4c cd ee 00 0046 CCMP Header = 23 e7 00 e0 73 40 ec 5e47 CCM Nonce = 00 ef ec 95 20 16 91 5e ec 40 73 e7 2348 Plaintext Data = 98 be ca 86 f4 b3 8d a2 0c fd f2 47 24 c5 8e b849 35 66 53 3950 CCM MIC = 2d 09 57 ec fa be 95 b9-- Encrypted MPDU with FCS1 18 79 81 46 9b 50 f4 fd 56 f6 ef ec 95 20 16 91 83 57 0c 4c cd ee2 20 a0 23 e7 00 e0 73 40 ec 5e 12 c5 37 eb f3 ab 58 4e f1 fe f9 a13 f3 54 7a 8c 13 b3 22 5a 2d 09 57 ec fa be 95 b9 aa fa 0c c8*/static const u_int8_t test7_key[] = { /* TK */ 0x1b, 0xdb, 0x34, 0x98, 0x0e, 0x03, 0x81, 0x24, 0xa1, 0xdb, 0x1a, 0x89, 0x2b, 0xec, 0x36, 0x6a,};static const u_int8_t test7_plaintext[] = { /* Plaintext MPDU w/o MIC */ 0x18, 0x79, 0x81, 0x46, 0x9b, 0x50, 0xf4, 0xfd, 0x56, 0xf6, 0xef, 0xec, 0x95, 0x20, 0x16, 0x91, 0x83, 0x57, 0x0c, 0x4c, 0xcd, 0xee, 0x20, 0xa0, 0x98, 0xbe, 0xca, 0x86, 0xf4, 0xb3, 0x8d, 0xa2, 0x0c, 0xfd, 0xf2, 0x47, 0x24, 0xc5, 0x8e, 0xb8, 0x35, 0x66, 0x53, 0x39,};static const u_int8_t test7_encrypted[] = { /* Encrypted MPDU with MIC */ 0x18, 0x79, 0x81, 0x46, 0x9b, 0x50, 0xf4, 0xfd, 0x56, 0xf6, 0xef, 0xec, 0x95, 0x20, 0x16, 0x91, 0x83, 0x57, 0x0c, 0x4c, 0xcd, 0xee, 0x20, 0xa0, 0x23, 0xe7, 0x00, 0xe0, 0x73, 0x40, 0xec, 0x5e, 0x12, 0xc5, 0x37, 0xeb, 0xf3, 0xab, 0x58, 0x4e, 0xf1, 0xfe, 0xf9, 0xa1, 0xf3, 0x54, 0x7a, 0x8c, 0x13, 0xb3, 0x22, 0x5a, 0x2d, 0x09, 0x57, 0xec, 0xfa, 0xbe, 0x95, 0xb9,};/*==== CCMP test mpdu 8 ====-- MPDU Fields6 Version = 07 Type = 2 SubType = 118 ToDS = 1 FromDS = 09 MoreFrag = 0 Retry = 110 PwrMgt = 1 moreData = 011 Encrypt = 112 Order = 113 Duration = 2926014 A1 = 55-2d-5f-72-bb-70 BSSID15 A2 = ca-3f-3a-ae-60-c4 SA16 A3 = 8b-a9-b5-f8-2c-2f DA17 SC = 0xEB5018 seqNum = 3765 (0x0EB5) fraqNum = 0 (0x00)19 QC = 0x000a20 MSDU Priority = 10 (0xa)21 Algorithm = AES_CCM22 Key ID = 223 TK = 6e ac 1b f5 4b d5 4e db 23 21 75 43 03 02 4c 7124 PN = 227588596223197 (0xCEFD996ECCDD)25 802.11 Header = b8 d9 4c 72 55 2d 5f 72 bb 70 ca 3f 3a ae 60 c426 8b a9 b5 f8 2c 2f 50 eb 2a 5527 Muted 802.11 Header = 88 c1 55 2d 5f 72 bb 70 ca 3f 3a ae 60 c428 8b a9 b5 f8 2c 2f 00 00 0a 0029 CCMP Header = dd cc 00 a0 6e 99 fd ce30 CCM Nonce = 0a ca 3f 3a ae 60 c4 ce fd 99 6e cc dd31 Plaintext Data = 57 cb 5c 0e 5f cd 88 5e 9a 42 39 e9 b9 ca d6 0d32 64 37 59 7933 CCM MIC = 6d ba 8e f7 f0 80 87 dd-- Encrypted MPDU with FCS35 b8 d9 4c 72 55 2d 5f 72 bb 70 ca 3f 3a ae 60 c4 8b a9 b5 f8 2c 2f36 50 eb 2a 55 dd cc 00 a0 6e 99 fd ce 4b f2 81 ef 8e c7 73 9f 91 5937 1b 97 a8 7d c1 4b 3f a1 74 62 6d ba 8e f7 f0 80 87 dd 0c 65 74 3f*/static const u_int8_t test8_key[] = { /* TK */ 0x6e, 0xac, 0x1b, 0xf5, 0x4b, 0xd5, 0x4e, 0xdb, 0x23, 0x21, 0x75, 0x43, 0x03, 0x02, 0x4c, 0x71,};static const u_int8_t test8_plaintext[] = { /* Plaintext MPDU w/o MIC */ 0xb8, 0xd9, 0x4c, 0x72, 0x55, 0x2d, 0x5f, 0x72, 0xbb, 0x70, 0xca, 0x3f, 0x3a, 0xae, 0x60, 0xc4, 0x8b, 0xa9, 0xb5, 0xf8, 0x2c, 0x2f, 0x50, 0xeb, 0x2a, 0x55, 0x57, 0xcb, 0x5c, 0x0e, 0x5f, 0xcd, 0x88, 0x5e, 0x9a, 0x42, 0x39, 0xe9, 0xb9, 0xca, 0xd6, 0x0d, 0x64, 0x37, 0x59, 0x79,};static const u_int8_t test8_encrypted[] = { /* Encrypted MPDU with MIC */ 0xb8, 0xd9, 0x4c, 0x72, 0x55, 0x2d, 0x5f, 0x72, 0xbb, 0x70, 0xca, 0x3f, 0x3a, 0xae, 0x60, 0xc4, 0x8b, 0xa9, 0xb5, 0xf8, 0x2c, 0x2f, 0x50, 0xeb, 0x2a, 0x55, 0xdd, 0xcc, 0x00, 0xa0, 0x6e, 0x99, 0xfd, 0xce, 0x4b, 0xf2, 0x81, 0xef, 0x8e, 0xc7, 0x73, 0x9f, 0x91, 0x59, 0x1b, 0x97, 0xa8, 0x7d, 0xc1, 0x4b, 0x3f, 0xa1, 0x74, 0x62, 0x6d, 0xba, 0x8e, 0xf7, 0xf0, 0x80, 0x87, 0xdd,};#define TEST(n,name,cipher,keyix,pn) { \ name, IEEE80211_CIPHER_##cipher,keyix, pn##LL, \ test##n##_key, sizeof(test##n##_key), \ test##n##_plaintext, sizeof(test##n##_plaintext), \ test##n##_encrypted, sizeof(test##n##_encrypted) \}static struct ciphertest { const char *name; int cipher; int keyix; u_int64_t pn; const u_int8_t *key; size_t key_len; const u_int8_t *plaintext; size_t plaintext_len; const u_int8_t *encrypted; size_t encrypted_len;} ccmptests[] = { TEST(1, "CCMP test mpdu 1", AES_CCM, 0, 199027030681356), TEST(2, "CCMP test mpdu 2", AES_CCM, 2, 54923164817386), TEST(3, "CCMP test mpdu 3", AES_CCM, 2, 52624639632814), TEST(4, "CCMP test mpdu 4", AES_CCM, 0, 270963670912995), TEST(5, "CCMP test mpdu 5", AES_CCM, 2, 184717420531255), TEST(6, "CCMP test mpdu 6", AES_CCM, 1, 118205765159305), TEST(7, "CCMP test mpdu 7", AES_CCM, 3, 104368786630435), TEST(8, "CCMP test mpdu 8", AES_CCM, 2, 227588596223197),};static voiddumpdata(const char *tag, const void *p, size_t len){ int i; printk("%s: 0x%p len %zu", tag, p, len); for (i = 0; i < len; i++) { if ((i % 16) == 0) printk("\n%03d:", i); printk(" %02x", ((u_int8_t *)p)[i]); } printk("\n");}static voidcmpfail(const void *gen, size_t genlen, const void *ref, size_t reflen){ int i; for (i = 0; i < genlen; i++) if (((u_int8_t *)gen)[i] != ((u_int8_t *)ref)[i]) { printk("first difference at byte %u\n", i); break; } dumpdata("Generated", gen, genlen); dumpdata("Reference", ref, reflen);}static intruntest(struct ieee80211vap *vap, struct ciphertest *t){ struct ieee80211_key *key; struct sk_buff *skb = NULL; const struct ieee80211_cipher *cip; u_int8_t mac[IEEE80211_ADDR_LEN]; int hdrlen; printk("%s: ", t->name); if (!ieee80211_crypto_available(t->cipher)) { printk("FAIL: ieee80211_crypto_available failed\n"); return 0; } /* * Setup key. */ key = &vap->iv_nw_keys[t->keyix]; key->wk_keyix = t->keyix; if (!ieee80211_crypto_newkey(vap, t->cipher, IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV, key)) { printk("FAIL: ieee80211_crypto_newkey failed\n"); goto bad; } memcpy(key->wk_key, t->key, t->key_len); key->wk_keylen = t->key_len; memset(key->wk_keyrsc, 0, sizeof(key->wk_keyrsc)); key->wk_keytsc = t->pn - 1; /* PN-1 since we do encap */ if (!ieee80211_crypto_setkey(vap, key, mac, NULL)) { printk("FAIL: ieee80211_crypto_setkey failed\n"); goto bad; } /* * Craft frame from plaintext data. */ cip = key->wk_cipher; skb = dev_alloc_skb(t->plaintext_len + cip->ic_header + cip->ic_trailer); if (skb == NULL) { printk("FAIL: unable to allocate skbuff\n"); goto bad; } skb_reserve(skb, cip->ic_header); memcpy(skb_put(skb, t->plaintext_len), t->plaintext, t->plaintext_len); /* * Encrypt frame w/ MIC. */ if (!(*cip->ic_encap)(key, skb, t->keyix << 6)) { printk("FAIL: ccmp encap failed\n"); goto bad; } /* * Verify: frame length, frame contents. */ if (skb->len != t->encrypted_len) { printk("FAIL: encap data length mismatch\n"); cmpfail(skb->data, skb->len, t->encrypted, t->encrypted_len); goto bad; } else if (memcmp(skb->data, t->encrypted, skb->len)) { printk("FAIL: encrypt data does not compare\n"); cmpfail(skb->data, skb->len, t->encrypted, t->encrypted_len); dumpdata("Plaintext", t->plaintext, t->plaintext_len); goto bad; } /* * Decrypt frame; strip MIC. */ hdrlen = ieee80211_hdrspace(vap->iv_ic, skb->data); if (!(*cip->ic_decap)(key, skb, hdrlen)) { printk("FAIL: ccmp decap failed\n"); cmpfail(skb->data, skb->len, t->plaintext, t->plaintext_len); goto bad; } /* * Verify: frame length, frame contents. */ if (skb->len != t->plaintext_len) { printk("FAIL: decap botch; length mismatch\n"); cmpfail(skb->data, skb->len, t->plaintext, t->plaintext_len); goto bad; } else if (memcmp(skb->data, t->plaintext, t->plaintext_len)) { printk("FAIL: decap botch; data does not compare\n"); cmpfail(skb->data, skb->len, t->plaintext, sizeof(t->plaintext)); goto bad; } dev_kfree_skb(skb); ieee80211_crypto_delkey(vap, key, NULL); printk("PASS\n"); return 1;bad: if (skb != NULL) dev_kfree_skb(skb); ieee80211_crypto_delkey(vap, key, NULL); return 0;}/* * Module glue. */MODULE_AUTHOR("Errno Consulting, Sam Leffler");MODULE_DESCRIPTION("802.11 wireless support: AES-CCMP cipher tester");#ifdef MODULE_LICENSEMODULE_LICENSE("Dual BSD/GPL");#endifstatic int tests = -1;static int debug = 0;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,52))MODULE_PARM(tests, "i");MODULE_PARM(debug, "i");#else#include <linux/moduleparam.h>module_param(tests, int, 0600);module_param(debug, int, 0600);#endifMODULE_PARM_DESC(tests, "Specify which tests to run");MODULE_PARM_DESC(debug, "Enable IEEE80211_MSG_CRYPTO");static int __initinit_crypto_ccmp_test(void){ struct ieee80211com ic; struct ieee80211vap vap; int i, pass, total; memset(&ic, 0, sizeof(ic)); memset(&vap, 0, sizeof(vap)); vap.iv_ic = ⁣ if (debug) vap.iv_debug = IEEE80211_MSG_CRYPTO; ieee80211_crypto_attach(&ic); ieee80211_crypto_vattach(&vap); pass = 0; total = 0; for (i = 0; i < ARRAY_SIZE(ccmptests); i++) if (tests & (1 << i)) { total++; pass += runtest(&vap, &ccmptests[i]); } printk("%u of %u 802.11i AES-CCMP test vectors passed\n", pass, total); ieee80211_crypto_vdetach(&vap); ieee80211_crypto_detach(&ic); return (pass == total ? 0 : -ENXIO);}module_init(init_crypto_ccmp_test);static void __exitexit_crypto_ccmp_test(void){}module_exit(exit_crypto_ccmp_test);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -