提交 17295884 编写于 作者: R Richard Levitte

The AES CTR API was buggy, we need to save the encrypted counter as well

between calls, or that will be lost if it returned with *num non-zero.
上级 6f7c2cb3
...@@ -99,7 +99,9 @@ void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out, ...@@ -99,7 +99,9 @@ void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
unsigned char *ivec, int *num); unsigned char *ivec, int *num);
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
const unsigned long length, const AES_KEY *key, const unsigned long length, const AES_KEY *key,
unsigned char *counter, unsigned int *num); unsigned char counter[AES_BLOCK_SIZE],
unsigned char ecount_buf[AES_BLOCK_SIZE],
unsigned int *num);
#ifdef __cplusplus #ifdef __cplusplus
......
...@@ -94,11 +94,12 @@ static void AES_ctr128_inc(unsigned char *counter) { ...@@ -94,11 +94,12 @@ static void AES_ctr128_inc(unsigned char *counter) {
*/ */
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
const unsigned long length, const AES_KEY *key, const unsigned long length, const AES_KEY *key,
unsigned char *counter, unsigned int *num) { unsigned char counter[AES_BLOCK_SIZE],
unsigned char ecount_buf[AES_BLOCK_SIZE],
unsigned int *num) {
unsigned int n; unsigned int n;
unsigned long l=length; unsigned long l=length;
unsigned char tmp[AES_BLOCK_SIZE];
assert(in && out && key && counter && num); assert(in && out && key && counter && num);
...@@ -106,10 +107,10 @@ void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, ...@@ -106,10 +107,10 @@ void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
while (l--) { while (l--) {
if (n == 0) { if (n == 0) {
AES_encrypt(counter, tmp, key); AES_encrypt(counter, ecount_buf, key);
AES_ctr128_inc(counter); AES_ctr128_inc(counter);
} }
*(out++) = *(in++) ^ tmp[n]; *(out++) = *(in++) ^ ecount_buf[n];
n = (n+1) % AES_BLOCK_SIZE; n = (n+1) % AES_BLOCK_SIZE;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册