These patches add tests for AES-XCBC-MAC. ---
crypto/tcrypt.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- crypto/tcrypt.h | 80 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+), 2 deletions(-) 03dfa73836c8802a91bfd84b1a019b02667a74ea diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 49e344f..5594dba 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c @@ -253,6 +253,102 @@ out: #endif /* CONFIG_CRYPTO_HMAC */ +#ifdef CONFIG_CRYPTO_XCBC + +static void +test_xcbc(char *algo, struct xcbc_testvec * template, unsigned int tcount) +{ + char *p; + unsigned int i, j, k, temp; + struct scatterlist sg[8]; + char result[64]; + struct crypto_tfm *tfm; + struct xcbc_testvec *xcbc_tv; + unsigned int tsize, klen; + u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x03030303, 0x03030303, 0x03030303, 0x03030303}; + + tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC); + if (tfm == NULL) { + printk("failed to load transform for %s\n", algo); + return; + } + + tfm->crt_cipher.cit_xcbc_const = (u8*)ks; + + printk("\ntesting xcbc_%s\n", algo); + + tsize = sizeof (struct xcbc_testvec); + tsize *= tcount; + if (tsize > TVMEMSIZE) { + printk("template (%u) too big for tvmem (%u)\n", tsize, + TVMEMSIZE); + goto out; + } + + memcpy(tvmem, template, tsize); + xcbc_tv = (void *) tvmem; + + for (i = 0; i < tcount; i++) { + printk("test %u:\n", i + 1); + memset(result, 0, sizeof (result)); + + p = xcbc_tv[i].plaintext; + klen = xcbc_tv[i].ksize; + sg[0].page = virt_to_page(p); + sg[0].offset = offset_in_page(p); + sg[0].length = xcbc_tv[i].psize; + + crypto_xcbc(tfm, xcbc_tv[i].key, klen, sg, 1, result); + + hexdump(result, crypto_tfm_alg_blocksize(tfm)); + printk("%s\n", + memcmp(result, xcbc_tv[i].digest, + crypto_tfm_alg_blocksize(tfm)) ? "fail" : + "pass"); + } + + printk("\ntesting xcbc_%s across pages\n", algo); + + memset(xbuf, 0, XBUFSIZE); + + j = 0; + for (i = 0; i < tcount; i++) { + if (xcbc_tv[i].np) { + j++; + printk ("test %u:\n",j); + memset (result, 0, 64); + + temp = 0; + klen = xcbc_tv[i].ksize; + for (k = 0; k < xcbc_tv[i].np; k++) { + memcpy (&xbuf[IDX[k]], xcbc_tv[i].plaintext + temp, + xcbc_tv[i].tap[k]); + temp += xcbc_tv[i].tap[k]; + p = &xbuf[IDX[k]]; + sg[k].page = virt_to_page (p); + sg[k].offset = offset_in_page (p); + sg[k].length = xcbc_tv[i].tap[k]; + } + + crypto_xcbc(tfm, xcbc_tv[i].key, klen, sg, xcbc_tv[i].np, + result); + hexdump(result, crypto_tfm_alg_blocksize(tfm)); + + printk("%s\n", + memcmp(result, xcbc_tv[i].digest, + crypto_tfm_alg_blocksize(tfm)) ? "fail" : + "pass"); + } + } +out: + crypto_free_tfm(tfm); +} + +#endif /* CONFIG_CRYPTO_XCBC */ + + static void test_cipher(char *algo, int mode, int enc, struct cipher_testvec *template, unsigned int tcount) { @@ -857,11 +953,14 @@ static void do_test(void) test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS); test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS); +#endif +#ifdef CONFIG_CRYPTO_XCBC + test_xcbc("aes", aes_xcbc_tv_template, XCBC_AES_TEST_VECTORS); #endif - +#ifdef CONFIG_CRYPTO_MICHAEL_MIC test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); +#endif break; - case 1: test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); break; diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h index 733d07e..326fe41 100644 --- a/crypto/tcrypt.h +++ b/crypto/tcrypt.h @@ -45,6 +45,16 @@ struct hmac_testvec { unsigned char tap[MAX_TAP]; }; +struct xcbc_testvec { + char key[128]; + unsigned char ksize; + char plaintext[128]; + unsigned char psize; + char digest[MAX_DIGEST_SIZE]; + unsigned char np; + unsigned char tap[MAX_TAP]; +}; + struct cipher_testvec { unsigned char fail; unsigned char wk; /* weak key flag */ @@ -940,6 +950,76 @@ static struct hmac_testvec hmac_sha256_t #endif /* CONFIG_CRYPTO_HMAC */ +#define XCBC_AES_TEST_VECTORS 6 + +#ifdef CONFIG_CRYPTO_XCBC +static struct xcbc_testvec aes_xcbc_tv_template[] = { + { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { [0 ... 127] = 0 }, + .psize = 0, + .digest = { 0x75, 0xf0, 0x25, 0x1d, 0x52, 0x8a, 0xc0, 0x1c, + 0x45, 0x73, 0xdf, 0xd5, 0x84, 0xd7, 0x9f, 0x29 }, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02 }, + .psize = 3, + .digest = { 0x5b, 0x37, 0x65, 0x80, 0xae, 0x2f, 0x19, 0xaf, + 0xe7, 0x21, 0x9c, 0xee, 0xf1, 0x72, 0x75, 0x6f }, + } , { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .psize = 16, + .digest = { 0xd2, 0xa2, 0x46, 0xfa, 0x34, 0x9b, 0x68, 0xa7, + 0x99, 0x98, 0xa4, 0x39, 0x4f, 0xf7, 0xa2, 0x63 }, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13 }, + .psize = 20, + .digest = { 0x47, 0xf5, 0x1b, 0x45, 0x64, 0x96, 0x62, 0x15, + 0xb8, 0x98, 0x5c, 0x63, 0x05, 0x5e, 0xd3, 0x08 }, + .np = 2, + .tap = {10, 10}, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, + .psize = 32, + .digest = { 0xf5, 0x4f, 0x0e, 0xc8, 0xd2, 0xb9, 0xf3, 0xd3, + 0x68, 0x07, 0x73, 0x4b, 0xd5, 0x28, 0x3f, 0xd4 }, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21 }, + .psize = 34, + .digest = { 0xbe, 0xcb, 0xb3, 0xbc, 0xcd, 0xb5, 0x18, 0xa3, + 0x06, 0x77, 0xd5, 0x48, 0x1f, 0xb6, 0xb4, 0xd8 }, + .np = 2, + .tap = {17,17}, + } +}; +#endif + /* * DES test vectors. */ -- Kazunori Miyazawa
Subject: [PATCH] add tests of xcbc From: Kazunori MIYAZAWA <[EMAIL PROTECTED]> Date: 1138249654 +0900 --- crypto/tcrypt.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- crypto/tcrypt.h | 80 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 181 insertions(+), 2 deletions(-) 03dfa73836c8802a91bfd84b1a019b02667a74ea diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c index 49e344f..5594dba 100644 --- a/crypto/tcrypt.c +++ b/crypto/tcrypt.c @@ -253,6 +253,102 @@ out: #endif /* CONFIG_CRYPTO_HMAC */ +#ifdef CONFIG_CRYPTO_XCBC + +static void +test_xcbc(char *algo, struct xcbc_testvec * template, unsigned int tcount) +{ + char *p; + unsigned int i, j, k, temp; + struct scatterlist sg[8]; + char result[64]; + struct crypto_tfm *tfm; + struct xcbc_testvec *xcbc_tv; + unsigned int tsize, klen; + u_int32_t ks[12] = {0x01010101, 0x01010101, 0x01010101, 0x01010101, + 0x02020202, 0x02020202, 0x02020202, 0x02020202, + 0x03030303, 0x03030303, 0x03030303, 0x03030303}; + + tfm = crypto_alloc_tfm(algo, CRYPTO_TFM_MODE_CBC); + if (tfm == NULL) { + printk("failed to load transform for %s\n", algo); + return; + } + + tfm->crt_cipher.cit_xcbc_const = (u8*)ks; + + printk("\ntesting xcbc_%s\n", algo); + + tsize = sizeof (struct xcbc_testvec); + tsize *= tcount; + if (tsize > TVMEMSIZE) { + printk("template (%u) too big for tvmem (%u)\n", tsize, + TVMEMSIZE); + goto out; + } + + memcpy(tvmem, template, tsize); + xcbc_tv = (void *) tvmem; + + for (i = 0; i < tcount; i++) { + printk("test %u:\n", i + 1); + memset(result, 0, sizeof (result)); + + p = xcbc_tv[i].plaintext; + klen = xcbc_tv[i].ksize; + sg[0].page = virt_to_page(p); + sg[0].offset = offset_in_page(p); + sg[0].length = xcbc_tv[i].psize; + + crypto_xcbc(tfm, xcbc_tv[i].key, klen, sg, 1, result); + + hexdump(result, crypto_tfm_alg_blocksize(tfm)); + printk("%s\n", + memcmp(result, xcbc_tv[i].digest, + crypto_tfm_alg_blocksize(tfm)) ? "fail" : + "pass"); + } + + printk("\ntesting xcbc_%s across pages\n", algo); + + memset(xbuf, 0, XBUFSIZE); + + j = 0; + for (i = 0; i < tcount; i++) { + if (xcbc_tv[i].np) { + j++; + printk ("test %u:\n",j); + memset (result, 0, 64); + + temp = 0; + klen = xcbc_tv[i].ksize; + for (k = 0; k < xcbc_tv[i].np; k++) { + memcpy (&xbuf[IDX[k]], xcbc_tv[i].plaintext + temp, + xcbc_tv[i].tap[k]); + temp += xcbc_tv[i].tap[k]; + p = &xbuf[IDX[k]]; + sg[k].page = virt_to_page (p); + sg[k].offset = offset_in_page (p); + sg[k].length = xcbc_tv[i].tap[k]; + } + + crypto_xcbc(tfm, xcbc_tv[i].key, klen, sg, xcbc_tv[i].np, + result); + hexdump(result, crypto_tfm_alg_blocksize(tfm)); + + printk("%s\n", + memcmp(result, xcbc_tv[i].digest, + crypto_tfm_alg_blocksize(tfm)) ? "fail" : + "pass"); + } + } +out: + crypto_free_tfm(tfm); +} + +#endif /* CONFIG_CRYPTO_XCBC */ + + static void test_cipher(char *algo, int mode, int enc, struct cipher_testvec *template, unsigned int tcount) { @@ -857,11 +953,14 @@ static void do_test(void) test_hmac("md5", hmac_md5_tv_template, HMAC_MD5_TEST_VECTORS); test_hmac("sha1", hmac_sha1_tv_template, HMAC_SHA1_TEST_VECTORS); test_hmac("sha256", hmac_sha256_tv_template, HMAC_SHA256_TEST_VECTORS); +#endif +#ifdef CONFIG_CRYPTO_XCBC + test_xcbc("aes", aes_xcbc_tv_template, XCBC_AES_TEST_VECTORS); #endif - +#ifdef CONFIG_CRYPTO_MICHAEL_MIC test_hash("michael_mic", michael_mic_tv_template, MICHAEL_MIC_TEST_VECTORS); +#endif break; - case 1: test_hash("md5", md5_tv_template, MD5_TEST_VECTORS); break; diff --git a/crypto/tcrypt.h b/crypto/tcrypt.h index 733d07e..326fe41 100644 --- a/crypto/tcrypt.h +++ b/crypto/tcrypt.h @@ -45,6 +45,16 @@ struct hmac_testvec { unsigned char tap[MAX_TAP]; }; +struct xcbc_testvec { + char key[128]; + unsigned char ksize; + char plaintext[128]; + unsigned char psize; + char digest[MAX_DIGEST_SIZE]; + unsigned char np; + unsigned char tap[MAX_TAP]; +}; + struct cipher_testvec { unsigned char fail; unsigned char wk; /* weak key flag */ @@ -940,6 +950,76 @@ static struct hmac_testvec hmac_sha256_t #endif /* CONFIG_CRYPTO_HMAC */ +#define XCBC_AES_TEST_VECTORS 6 + +#ifdef CONFIG_CRYPTO_XCBC +static struct xcbc_testvec aes_xcbc_tv_template[] = { + { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { [0 ... 127] = 0 }, + .psize = 0, + .digest = { 0x75, 0xf0, 0x25, 0x1d, 0x52, 0x8a, 0xc0, 0x1c, + 0x45, 0x73, 0xdf, 0xd5, 0x84, 0xd7, 0x9f, 0x29 }, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02 }, + .psize = 3, + .digest = { 0x5b, 0x37, 0x65, 0x80, 0xae, 0x2f, 0x19, 0xaf, + 0xe7, 0x21, 0x9c, 0xee, 0xf1, 0x72, 0x75, 0x6f }, + } , { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .psize = 16, + .digest = { 0xd2, 0xa2, 0x46, 0xfa, 0x34, 0x9b, 0x68, 0xa7, + 0x99, 0x98, 0xa4, 0x39, 0x4f, 0xf7, 0xa2, 0x63 }, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13 }, + .psize = 20, + .digest = { 0x47, 0xf5, 0x1b, 0x45, 0x64, 0x96, 0x62, 0x15, + 0xb8, 0x98, 0x5c, 0x63, 0x05, 0x5e, 0xd3, 0x08 }, + .np = 2, + .tap = {10, 10}, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }, + .psize = 32, + .digest = { 0xf5, 0x4f, 0x0e, 0xc8, 0xd2, 0xb9, 0xf3, 0xd3, + 0x68, 0x07, 0x73, 0x4b, 0xd5, 0x28, 0x3f, 0xd4 }, + }, { + .key = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + .ksize = 16, + .plaintext = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21 }, + .psize = 34, + .digest = { 0xbe, 0xcb, 0xb3, 0xbc, 0xcd, 0xb5, 0x18, 0xa3, + 0x06, 0x77, 0xd5, 0x48, 0x1f, 0xb6, 0xb4, 0xd8 }, + .np = 2, + .tap = {17,17}, + } +}; +#endif + /* * DES test vectors. */ -- 1.1.3