summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/crypto/rijndael/rijndael-api-fst.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/crypto/rijndael/rijndael-api-fst.c')
-rw-r--r--freebsd/sys/crypto/rijndael/rijndael-api-fst.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/freebsd/sys/crypto/rijndael/rijndael-api-fst.c b/freebsd/sys/crypto/rijndael/rijndael-api-fst.c
index 1ae535a5..30816c80 100644
--- a/freebsd/sys/crypto/rijndael/rijndael-api-fst.c
+++ b/freebsd/sys/crypto/rijndael/rijndael-api-fst.c
@@ -38,7 +38,6 @@ typedef u_int8_t BYTE;
int rijndael_makeKey(keyInstance *key, BYTE direction, int keyLen,
const char *keyMaterial) {
- u_int8_t cipherKey[RIJNDAEL_MAXKB];
if (key == NULL) {
return BAD_KEY_INSTANCE;
@@ -61,13 +60,12 @@ int rijndael_makeKey(keyInstance *key, BYTE direction, int keyLen,
}
/* initialize key schedule: */
- memcpy(cipherKey, key->keyMaterial, keyLen/8);
if (direction == DIR_ENCRYPT) {
- key->Nr = rijndaelKeySetupEnc(key->rk, cipherKey, keyLen);
+ key->Nr = rijndaelKeySetupEnc(key->rk, key->keyMaterial, keyLen);
} else {
- key->Nr = rijndaelKeySetupDec(key->rk, cipherKey, keyLen);
+ key->Nr = rijndaelKeySetupDec(key->rk, key->keyMaterial, keyLen);
}
- rijndaelKeySetupEnc(key->ek, cipherKey, keyLen);
+ rijndaelKeySetupEnc(key->ek, key->keyMaterial, keyLen);
return TRUE;
}
@@ -188,6 +186,7 @@ int rijndael_blockEncrypt(cipherInstance *cipher, keyInstance *key,
return BAD_CIPHER_STATE;
}
+ explicit_bzero(block, sizeof(block));
return 128*numBlocks;
}
@@ -260,6 +259,7 @@ int rijndael_padEncrypt(cipherInstance *cipher, keyInstance *key,
return BAD_CIPHER_STATE;
}
+ explicit_bzero(block, sizeof(block));
return 16*(numBlocks + 1);
}
@@ -359,12 +359,13 @@ int rijndael_blockDecrypt(cipherInstance *cipher, keyInstance *key,
return BAD_CIPHER_STATE;
}
+ explicit_bzero(block, sizeof(block));
return 128*numBlocks;
}
int rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
const BYTE *input, int inputOctets, BYTE *outBuffer) {
- int i, numBlocks, padLen;
+ int i, numBlocks, padLen, rval;
u_int8_t block[16];
u_int32_t iv[4];
@@ -394,11 +395,13 @@ int rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
rijndaelDecrypt(key->rk, key->Nr, input, block);
padLen = block[15];
if (padLen >= 16) {
- return BAD_DATA;
+ rval = BAD_DATA;
+ goto out;
}
for (i = 16 - padLen; i < 16; i++) {
if (block[i] != padLen) {
- return BAD_DATA;
+ rval = BAD_DATA;
+ goto out;
}
}
memcpy(outBuffer, block, 16 - padLen);
@@ -426,11 +429,13 @@ int rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
((u_int32_t*)block)[3] ^= iv[3];
padLen = block[15];
if (padLen <= 0 || padLen > 16) {
- return BAD_DATA;
+ rval = BAD_DATA;
+ goto out;
}
for (i = 16 - padLen; i < 16; i++) {
if (block[i] != padLen) {
- return BAD_DATA;
+ rval = BAD_DATA;
+ goto out;
}
}
memcpy(outBuffer, block, 16 - padLen);
@@ -440,5 +445,9 @@ int rijndael_padDecrypt(cipherInstance *cipher, keyInstance *key,
return BAD_CIPHER_STATE;
}
- return 16*numBlocks - padLen;
+ rval = 16*numBlocks - padLen;
+
+out:
+ explicit_bzero(block, sizeof(block));
+ return rval;
}