diff options
Diffstat (limited to 'src/lib/libcrypto/modes/cbc128.c')
| -rw-r--r-- | src/lib/libcrypto/modes/cbc128.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/lib/libcrypto/modes/cbc128.c b/src/lib/libcrypto/modes/cbc128.c index 3d3782cbe1..0e54f75470 100644 --- a/src/lib/libcrypto/modes/cbc128.c +++ b/src/lib/libcrypto/modes/cbc128.c | |||
| @@ -117,7 +117,7 @@ void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, | |||
| 117 | unsigned char ivec[16], block128_f block) | 117 | unsigned char ivec[16], block128_f block) |
| 118 | { | 118 | { |
| 119 | size_t n; | 119 | size_t n; |
| 120 | union { size_t align; unsigned char c[16]; } tmp; | 120 | union { size_t t[16/sizeof(size_t)]; unsigned char c[16]; } tmp; |
| 121 | 121 | ||
| 122 | assert(in && out && key && ivec); | 122 | assert(in && out && key && ivec); |
| 123 | 123 | ||
| @@ -137,11 +137,13 @@ void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, | |||
| 137 | out += 16; | 137 | out += 16; |
| 138 | } | 138 | } |
| 139 | } | 139 | } |
| 140 | else { | 140 | else if (16%sizeof(size_t) == 0) { /* always true */ |
| 141 | while (len>=16) { | 141 | while (len>=16) { |
| 142 | size_t *out_t=(size_t *)out, *iv_t=(size_t *)iv; | ||
| 143 | |||
| 142 | (*block)(in, out, key); | 144 | (*block)(in, out, key); |
| 143 | for(n=0; n<16; n+=sizeof(size_t)) | 145 | for(n=0; n<16/sizeof(size_t); n++) |
| 144 | *(size_t *)(out+n) ^= *(size_t *)(iv+n); | 146 | out_t[n] ^= iv_t[n]; |
| 145 | iv = in; | 147 | iv = in; |
| 146 | len -= 16; | 148 | len -= 16; |
| 147 | in += 16; | 149 | in += 16; |
| @@ -165,15 +167,16 @@ void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, | |||
| 165 | out += 16; | 167 | out += 16; |
| 166 | } | 168 | } |
| 167 | } | 169 | } |
| 168 | else { | 170 | else if (16%sizeof(size_t) == 0) { /* always true */ |
| 169 | size_t c; | ||
| 170 | while (len>=16) { | 171 | while (len>=16) { |
| 172 | size_t c, *out_t=(size_t *)out, *ivec_t=(size_t *)ivec; | ||
| 173 | const size_t *in_t=(const size_t *)in; | ||
| 174 | |||
| 171 | (*block)(in, tmp.c, key); | 175 | (*block)(in, tmp.c, key); |
| 172 | for(n=0; n<16; n+=sizeof(size_t)) { | 176 | for(n=0; n<16/sizeof(size_t); n++) { |
| 173 | c = *(size_t *)(in+n); | 177 | c = in_t[n]; |
| 174 | *(size_t *)(out+n) = | 178 | out_t[n] = tmp.t[n] ^ ivec_t[n]; |
| 175 | *(size_t *)(tmp.c+n) ^ *(size_t *)(ivec+n); | 179 | ivec_t[n] = c; |
| 176 | *(size_t *)(ivec+n) = c; | ||
| 177 | } | 180 | } |
| 178 | len -= 16; | 181 | len -= 16; |
| 179 | in += 16; | 182 | in += 16; |
