Upgrade libtomcrypt
This commit is contained in:
@@ -29,7 +29,7 @@ int ccm_add_aad(ccm_state *ccm,
|
||||
for (y = 0; y < adatalen; y++) {
|
||||
if (ccm->x == 16) {
|
||||
/* full block so let's encrypt it */
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
ccm->x = 0;
|
||||
@@ -40,7 +40,7 @@ int ccm_add_aad(ccm_state *ccm,
|
||||
/* remainder? */
|
||||
if (ccm->aadlen == ccm->current_aadlen) {
|
||||
if (ccm->x != 0) {
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ int ccm_add_nonce(ccm_state *ccm,
|
||||
}
|
||||
|
||||
/* encrypt PAD */
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ int ccm_done(ccm_state *ccm,
|
||||
LTC_ARGCHK(taglen != NULL);
|
||||
|
||||
if (ccm->x != 0) {
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
}
|
||||
@@ -37,11 +37,11 @@ int ccm_done(ccm_state *ccm,
|
||||
for (y = 15; y > 15 - ccm->L; y--) {
|
||||
ccm->ctr[y] = 0x00;
|
||||
}
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
cipher_descriptor[ccm->cipher].done(&ccm->K);
|
||||
ecb_done(&ccm->K);
|
||||
|
||||
/* store the TAG */
|
||||
for (x = 0; x < 16 && x < *taglen; x++) {
|
||||
|
||||
@@ -41,10 +41,9 @@ int ccm_init(ccm_state *ccm, int cipher,
|
||||
ccm->taglen = taglen;
|
||||
|
||||
/* schedule key */
|
||||
if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_start(cipher, key, keylen, 0, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
ccm->cipher = cipher;
|
||||
|
||||
/* let's get the L value */
|
||||
ccm->ptlen = ptlen;
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
*/
|
||||
int ccm_memory(int cipher,
|
||||
const unsigned char *key, unsigned long keylen,
|
||||
symmetric_key *uskey,
|
||||
symmetric_ECB *uskey,
|
||||
const unsigned char *nonce, unsigned long noncelen,
|
||||
const unsigned char *header, unsigned long headerlen,
|
||||
unsigned char *pt, unsigned long ptlen,
|
||||
@@ -42,7 +42,7 @@ int ccm_memory(int cipher,
|
||||
{
|
||||
unsigned char PAD[16], ctr[16], CTRPAD[16], ptTag[16], b, *pt_real;
|
||||
unsigned char *pt_work = NULL;
|
||||
symmetric_key *skey;
|
||||
symmetric_ECB *skey;
|
||||
int err;
|
||||
unsigned long len, L, x, y, z, CTRlen;
|
||||
|
||||
@@ -78,12 +78,15 @@ int ccm_memory(int cipher,
|
||||
if (*taglen < 4 || *taglen > 16 || (*taglen % 2) == 1 || headerlen > 0x7fffffffu) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
if (noncelen < 7) {
|
||||
return CRYPT_INVALID_ARG;
|
||||
}
|
||||
|
||||
/* is there an accelerator? */
|
||||
if (cipher_descriptor[cipher].accel_ccm_memory != NULL) {
|
||||
return cipher_descriptor[cipher].accel_ccm_memory(
|
||||
key, keylen,
|
||||
uskey,
|
||||
&uskey->key,
|
||||
nonce, noncelen,
|
||||
header, headerlen,
|
||||
pt, ptlen,
|
||||
@@ -120,7 +123,7 @@ int ccm_memory(int cipher,
|
||||
}
|
||||
|
||||
/* initialize the cipher */
|
||||
if ((err = cipher_descriptor[cipher].setup(key, (int)keylen, 0, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_start(cipher, key, keylen, 0, skey)) != CRYPT_OK) {
|
||||
XFREE(skey);
|
||||
return err;
|
||||
}
|
||||
@@ -144,7 +147,7 @@ int ccm_memory(int cipher,
|
||||
(L-1));
|
||||
|
||||
/* nonce */
|
||||
for (y = 0; y < 15 - L; y++) {
|
||||
for (y = 0; y < noncelen; y++) {
|
||||
PAD[x++] = nonce[y];
|
||||
}
|
||||
|
||||
@@ -170,7 +173,7 @@ int ccm_memory(int cipher,
|
||||
}
|
||||
|
||||
/* encrypt PAD */
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -195,7 +198,7 @@ int ccm_memory(int cipher,
|
||||
for (y = 0; y < headerlen; y++) {
|
||||
if (x == 16) {
|
||||
/* full block so let's encrypt it */
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
x = 0;
|
||||
@@ -204,7 +207,7 @@ int ccm_memory(int cipher,
|
||||
}
|
||||
|
||||
/* remainder */
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@@ -239,7 +242,7 @@ int ccm_memory(int cipher,
|
||||
ctr[z] = (ctr[z] + 1) & 255;
|
||||
if (ctr[z]) break;
|
||||
}
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -248,7 +251,7 @@ int ccm_memory(int cipher,
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&PAD[z])) ^= *(LTC_FAST_TYPE_PTR_CAST(&pt[y+z]));
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&ct[y+z])) = *(LTC_FAST_TYPE_PTR_CAST(&pt[y+z])) ^ *(LTC_FAST_TYPE_PTR_CAST(&CTRPAD[z]));
|
||||
}
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@@ -259,7 +262,7 @@ int ccm_memory(int cipher,
|
||||
ctr[z] = (ctr[z] + 1) & 255;
|
||||
if (ctr[z]) break;
|
||||
}
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -268,7 +271,7 @@ int ccm_memory(int cipher,
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&pt[y+z])) = *(LTC_FAST_TYPE_PTR_CAST(&ct[y+z])) ^ *(LTC_FAST_TYPE_PTR_CAST(&CTRPAD[z]));
|
||||
*(LTC_FAST_TYPE_PTR_CAST(&PAD[z])) ^= *(LTC_FAST_TYPE_PTR_CAST(&pt[y+z]));
|
||||
}
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@@ -283,7 +286,7 @@ int ccm_memory(int cipher,
|
||||
ctr[z] = (ctr[z] + 1) & 255;
|
||||
if (ctr[z]) break;
|
||||
}
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
CTRlen = 0;
|
||||
@@ -299,7 +302,7 @@ int ccm_memory(int cipher,
|
||||
}
|
||||
|
||||
if (x == 16) {
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
x = 0;
|
||||
@@ -308,7 +311,7 @@ int ccm_memory(int cipher,
|
||||
}
|
||||
|
||||
if (x != 0) {
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
@@ -318,12 +321,12 @@ int ccm_memory(int cipher,
|
||||
for (y = 15; y > 15 - L; y--) {
|
||||
ctr[y] = 0x00;
|
||||
}
|
||||
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (skey != uskey) {
|
||||
cipher_descriptor[cipher].done(skey);
|
||||
ecb_done(skey);
|
||||
#ifdef LTC_CLEAN_STACK
|
||||
zeromem(skey, sizeof(*skey));
|
||||
#endif
|
||||
|
||||
@@ -47,7 +47,7 @@ int ccm_process(ccm_state *ccm,
|
||||
ccm->ctr[z] = (ccm->ctr[z] + 1) & 255;
|
||||
if (ccm->ctr[z]) break;
|
||||
}
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
ccm->CTRlen = 0;
|
||||
@@ -63,7 +63,7 @@ int ccm_process(ccm_state *ccm,
|
||||
}
|
||||
|
||||
if (ccm->x == 16) {
|
||||
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
ccm->x = 0;
|
||||
|
||||
@@ -108,7 +108,7 @@ int ccm_test(void)
|
||||
unsigned long taglen, x, y;
|
||||
unsigned char buf[64], buf2[64], tag[16], tag2[16], tag3[16], zero[64];
|
||||
int err, idx;
|
||||
symmetric_key skey;
|
||||
symmetric_ECB skey;
|
||||
ccm_state ccm;
|
||||
|
||||
zeromem(zero, 64);
|
||||
@@ -121,11 +121,11 @@ int ccm_test(void)
|
||||
}
|
||||
}
|
||||
|
||||
for (x = 0; x < (sizeof(tests)/sizeof(tests[0])); x++) {
|
||||
for (x = 0; x < LTC_ARRAY_SIZE(tests); x++) {
|
||||
for (y = 0; y < 2; y++) {
|
||||
taglen = tests[x].taglen;
|
||||
if (y == 0) {
|
||||
if ((err = cipher_descriptor[idx].setup(tests[x].key, 16, 0, &skey)) != CRYPT_OK) {
|
||||
if ((err = ecb_start(idx, tests[x].key, 16, 0, &skey)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ int ccm_test(void)
|
||||
return err;
|
||||
}
|
||||
} else {
|
||||
if ((err = ccm_init(&ccm, idx, tests[x].key, 16, tests[x].ptlen, (int)tests[x].taglen, tests[x].headerlen)) != CRYPT_OK) {
|
||||
if ((err = ccm_init(&ccm, idx, tests[x].key, 16, tests[x].ptlen, tests[x].taglen, tests[x].headerlen)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
if ((err = ccm_add_nonce(&ccm, tests[x].nonce, tests[x].noncelen)) != CRYPT_OK) {
|
||||
@@ -168,10 +168,10 @@ int ccm_test(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (compare_testvector(buf, tests[x].ptlen, tests[x].ct, tests[x].ptlen, "CCM encrypt data", (int)x)) {
|
||||
if (compare_testvector(buf, tests[x].ptlen, tests[x].ct, tests[x].ptlen, "CCM encrypt data", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
if (compare_testvector(tag, taglen, tests[x].tag, tests[x].taglen, "CCM encrypt tag", (int)x)) {
|
||||
if (compare_testvector(tag, taglen, tests[x].tag, tests[x].taglen, "CCM encrypt tag", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
|
||||
@@ -189,7 +189,7 @@ int ccm_test(void)
|
||||
return err;
|
||||
}
|
||||
} else {
|
||||
if ((err = ccm_init(&ccm, idx, tests[x].key, 16, tests[x].ptlen, (int)tests[x].taglen, tests[x].headerlen)) != CRYPT_OK) {
|
||||
if ((err = ccm_init(&ccm, idx, tests[x].key, 16, tests[x].ptlen, tests[x].taglen, tests[x].headerlen)) != CRYPT_OK) {
|
||||
return err;
|
||||
}
|
||||
if ((err = ccm_add_nonce(&ccm, tests[x].nonce, tests[x].noncelen)) != CRYPT_OK) {
|
||||
@@ -207,7 +207,7 @@ int ccm_test(void)
|
||||
}
|
||||
|
||||
|
||||
if (compare_testvector(buf2, tests[x].ptlen, tests[x].pt, tests[x].ptlen, "CCM decrypt data", (int)x)) {
|
||||
if (compare_testvector(buf2, tests[x].ptlen, tests[x].pt, tests[x].ptlen, "CCM decrypt data", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
if (y == 0) {
|
||||
@@ -225,17 +225,17 @@ int ccm_test(void)
|
||||
tag3, &taglen, 1 ) != CRYPT_ERROR) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
if (compare_testvector(buf2, tests[x].ptlen, zero, tests[x].ptlen, "CCM decrypt wrong tag", (int)x)) {
|
||||
if (compare_testvector(buf2, tests[x].ptlen, zero, tests[x].ptlen, "CCM decrypt wrong tag", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
} else {
|
||||
if (compare_testvector(tag2, taglen, tests[x].tag, tests[x].taglen, "CCM decrypt tag", (int)x)) {
|
||||
if (compare_testvector(tag2, taglen, tests[x].tag, tests[x].taglen, "CCM decrypt tag", x)) {
|
||||
return CRYPT_FAIL_TESTVECTOR;
|
||||
}
|
||||
}
|
||||
|
||||
if (y == 0) {
|
||||
cipher_descriptor[idx].done(&skey);
|
||||
ecb_done(&skey);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user