Switch all 'num' parameters in crypto/modes to unsigned. Also switch the EVP_CIPHER copy to cut down on how frequently we need to cast back and forth. BUG=22 Change-Id: I9af1e586ca27793a4ee6193bbb348cf2b28a126e Reviewed-on: https://boringssl-review.googlesource.com/7689 Reviewed-by: Steven Valdez <svaldez@google.com> Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/crypto/aes/mode_wrappers.c b/crypto/aes/mode_wrappers.c index dc657dc..4929920 100644 --- a/crypto/aes/mode_wrappers.c +++ b/crypto/aes/mode_wrappers.c
@@ -96,13 +96,17 @@ void AES_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t length, const AES_KEY *key, uint8_t *ivec, int *num) { - CRYPTO_ofb128_encrypt(in, out, length, key, ivec, num, + unsigned num_u = (unsigned)(*num); + CRYPTO_ofb128_encrypt(in, out, length, key, ivec, &num_u, (block128_f)AES_encrypt); + *num = (int)num_u; } void AES_cfb128_encrypt(const uint8_t *in, uint8_t *out, size_t length, const AES_KEY *key, uint8_t *ivec, int *num, int enc) { - CRYPTO_cfb128_encrypt(in, out, length, key, ivec, num, enc, + unsigned num_u = (unsigned)(*num); + CRYPTO_cfb128_encrypt(in, out, length, key, ivec, &num_u, enc, (block128_f)AES_encrypt); + *num = (int)num_u; }
diff --git a/crypto/cipher/e_aes.c b/crypto/cipher/e_aes.c index aa652eb..d61d048 100644 --- a/crypto/cipher/e_aes.c +++ b/crypto/cipher/e_aes.c
@@ -371,17 +371,15 @@ static int aes_ctr_cipher(EVP_CIPHER_CTX *ctx, uint8_t *out, const uint8_t *in, size_t len) { - unsigned num = (unsigned)ctx->num; EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data; if (dat->stream.ctr) { - CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks, ctx->iv, ctx->buf, &num, - dat->stream.ctr); + CRYPTO_ctr128_encrypt_ctr32(in, out, len, &dat->ks, ctx->iv, ctx->buf, + &ctx->num, dat->stream.ctr); } else { - CRYPTO_ctr128_encrypt(in, out, len, &dat->ks, ctx->iv, ctx->buf, &num, + CRYPTO_ctr128_encrypt(in, out, len, &dat->ks, ctx->iv, ctx->buf, &ctx->num, dat->block); } - ctx->num = (int)num; return 1; }
diff --git a/crypto/modes/cfb.c b/crypto/modes/cfb.c index c58614b..51b883e 100644 --- a/crypto/modes/cfb.c +++ b/crypto/modes/cfb.c
@@ -57,14 +57,13 @@ OPENSSL_COMPILE_ASSERT((16 % sizeof(size_t)) == 0, bad_size_t_size); void CRYPTO_cfb128_encrypt(const uint8_t *in, uint8_t *out, size_t len, - const void *key, uint8_t ivec[16], int *num, int enc, - block128_f block) { - unsigned int n; + const void *key, uint8_t ivec[16], unsigned *num, + int enc, block128_f block) { size_t l = 0; assert(in && out && key && ivec && num); - n = *num; + unsigned n = *num; if (enc) { while (n && len) { @@ -199,7 +198,7 @@ /* N.B. This expects the input to be packed, MS bit first */ void CRYPTO_cfb128_1_encrypt(const uint8_t *in, uint8_t *out, size_t bits, - const void *key, uint8_t ivec[16], int *num, + const void *key, uint8_t ivec[16], unsigned *num, int enc, block128_f block) { size_t n; uint8_t c[1], d[1]; @@ -217,7 +216,7 @@ void CRYPTO_cfb128_8_encrypt(const unsigned char *in, unsigned char *out, size_t length, const void *key, - unsigned char ivec[16], int *num, int enc, + unsigned char ivec[16], unsigned *num, int enc, block128_f block) { size_t n;
diff --git a/crypto/modes/internal.h b/crypto/modes/internal.h index c165a58..b46e836 100644 --- a/crypto/modes/internal.h +++ b/crypto/modes/internal.h
@@ -200,7 +200,7 @@ * incremented by this function. */ void CRYPTO_ctr128_encrypt(const uint8_t *in, uint8_t *out, size_t len, const void *key, uint8_t ivec[16], - uint8_t ecount_buf[16], unsigned int *num, + uint8_t ecount_buf[16], unsigned *num, block128_f block); /* CRYPTO_ctr128_encrypt_ctr32 acts like |CRYPTO_ctr128_encrypt| but takes @@ -209,7 +209,7 @@ * function. */ void CRYPTO_ctr128_encrypt_ctr32(const uint8_t *in, uint8_t *out, size_t len, const void *key, uint8_t ivec[16], - uint8_t ecount_buf[16], unsigned int *num, + uint8_t ecount_buf[16], unsigned *num, ctr128_f ctr); @@ -313,7 +313,7 @@ * call. */ void CRYPTO_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t len, const void *key, uint8_t ivec[16], - int *num, block128_f block); + unsigned *num, block128_f block); /* CFB. */ @@ -323,21 +323,21 @@ * |len| be a multiple of any value and any partial blocks are stored in |ivec| * and |*num|, the latter must be zero before the initial call. */ void CRYPTO_cfb128_encrypt(const uint8_t *in, uint8_t *out, size_t len, - const void *key, uint8_t ivec[16], int *num, int enc, - block128_f block); + const void *key, uint8_t ivec[16], unsigned *num, + int enc, block128_f block); /* CRYPTO_cfb128_8_encrypt encrypts (or decrypts, if |enc| is zero) |len| bytes * from |in| to |out| using |block| in CFB-8 mode. Prior to the first call * |num| should be set to zero. */ void CRYPTO_cfb128_8_encrypt(const uint8_t *in, uint8_t *out, size_t len, - const void *key, uint8_t ivec[16], int *num, + const void *key, uint8_t ivec[16], unsigned *num, int enc, block128_f block); /* CRYPTO_cfb128_1_encrypt encrypts (or decrypts, if |enc| is zero) |len| bytes * from |in| to |out| using |block| in CFB-1 mode. Prior to the first call * |num| should be set to zero. */ void CRYPTO_cfb128_1_encrypt(const uint8_t *in, uint8_t *out, size_t bits, - const void *key, uint8_t ivec[16], int *num, + const void *key, uint8_t ivec[16], unsigned *num, int enc, block128_f block); size_t CRYPTO_cts128_encrypt_block(const uint8_t *in, uint8_t *out, size_t len,
diff --git a/crypto/modes/ofb.c b/crypto/modes/ofb.c index 63c3165..2c5bdc9 100644 --- a/crypto/modes/ofb.c +++ b/crypto/modes/ofb.c
@@ -56,13 +56,11 @@ OPENSSL_COMPILE_ASSERT((16 % sizeof(size_t)) == 0, bad_size_t_size); void CRYPTO_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t len, - const void *key, uint8_t ivec[16], int *num, + const void *key, uint8_t ivec[16], unsigned *num, block128_f block) { - unsigned int n; - assert(in && out && key && ivec && num); - n = *num; + unsigned n = *num; while (n && len) { *(out++) = *(in++) ^ ivec[n];
diff --git a/include/openssl/cipher.h b/include/openssl/cipher.h index fb7171f..5312308 100644 --- a/include/openssl/cipher.h +++ b/include/openssl/cipher.h
@@ -481,7 +481,7 @@ /* num contains the number of bytes of |iv| which are valid for modes that * manage partial blocks themselves. */ - int num; + unsigned num; /* final_used is non-zero if the |final| buffer contains plaintext. */ int final_used;