diff options
Diffstat (limited to 'src/lib/libssl/src/crypto/chacha/chacha-merged.c')
| -rw-r--r-- | src/lib/libssl/src/crypto/chacha/chacha-merged.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/src/lib/libssl/src/crypto/chacha/chacha-merged.c b/src/lib/libssl/src/crypto/chacha/chacha-merged.c index 25092b16da..a665fb316f 100644 --- a/src/lib/libssl/src/crypto/chacha/chacha-merged.c +++ b/src/lib/libssl/src/crypto/chacha/chacha-merged.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: chacha-merged.c,v 1.5 2014/06/24 17:48:30 jsing Exp $ */ | 1 | /* $OpenBSD: chacha-merged.c,v 1.6 2014/06/24 18:12:09 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | chacha-merged.c version 20080118 | 3 | chacha-merged.c version 20080118 |
| 4 | D. J. Bernstein | 4 | D. J. Bernstein |
| @@ -7,16 +7,18 @@ Public domain. | |||
| 7 | 7 | ||
| 8 | #include <sys/types.h> | 8 | #include <sys/types.h> |
| 9 | 9 | ||
| 10 | struct chacha_ctx { | ||
| 11 | u_int input[16]; | ||
| 12 | }; | ||
| 13 | |||
| 14 | #define CHACHA_MINKEYLEN 16 | 10 | #define CHACHA_MINKEYLEN 16 |
| 15 | #define CHACHA_NONCELEN 8 | 11 | #define CHACHA_NONCELEN 8 |
| 16 | #define CHACHA_CTRLEN 8 | 12 | #define CHACHA_CTRLEN 8 |
| 17 | #define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN) | 13 | #define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN) |
| 18 | #define CHACHA_BLOCKLEN 64 | 14 | #define CHACHA_BLOCKLEN 64 |
| 19 | 15 | ||
| 16 | struct chacha_ctx { | ||
| 17 | u_int input[16]; | ||
| 18 | u_int8_t ks[CHACHA_BLOCKLEN]; | ||
| 19 | u_int8_t unused; | ||
| 20 | }; | ||
| 21 | |||
| 20 | static inline void chacha_keysetup(struct chacha_ctx *x, const u_char *k, | 22 | static inline void chacha_keysetup(struct chacha_ctx *x, const u_char *k, |
| 21 | u_int kbits) | 23 | u_int kbits) |
| 22 | __attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN))); | 24 | __attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN))); |
| @@ -187,6 +189,25 @@ chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, u32 bytes) | |||
| 187 | x14 = PLUS(x14, j14); | 189 | x14 = PLUS(x14, j14); |
| 188 | x15 = PLUS(x15, j15); | 190 | x15 = PLUS(x15, j15); |
| 189 | 191 | ||
| 192 | if (bytes < 64) { | ||
| 193 | U32TO8_LITTLE(x->ks + 0, x0); | ||
| 194 | U32TO8_LITTLE(x->ks + 4, x1); | ||
| 195 | U32TO8_LITTLE(x->ks + 8, x2); | ||
| 196 | U32TO8_LITTLE(x->ks + 12, x3); | ||
| 197 | U32TO8_LITTLE(x->ks + 16, x4); | ||
| 198 | U32TO8_LITTLE(x->ks + 20, x5); | ||
| 199 | U32TO8_LITTLE(x->ks + 24, x6); | ||
| 200 | U32TO8_LITTLE(x->ks + 28, x7); | ||
| 201 | U32TO8_LITTLE(x->ks + 32, x8); | ||
| 202 | U32TO8_LITTLE(x->ks + 36, x9); | ||
| 203 | U32TO8_LITTLE(x->ks + 40, x10); | ||
| 204 | U32TO8_LITTLE(x->ks + 44, x11); | ||
| 205 | U32TO8_LITTLE(x->ks + 48, x12); | ||
| 206 | U32TO8_LITTLE(x->ks + 52, x13); | ||
| 207 | U32TO8_LITTLE(x->ks + 56, x14); | ||
| 208 | U32TO8_LITTLE(x->ks + 60, x15); | ||
| 209 | } | ||
| 210 | |||
| 190 | x0 = XOR(x0, U8TO32_LITTLE(m + 0)); | 211 | x0 = XOR(x0, U8TO32_LITTLE(m + 0)); |
| 191 | x1 = XOR(x1, U8TO32_LITTLE(m + 4)); | 212 | x1 = XOR(x1, U8TO32_LITTLE(m + 4)); |
| 192 | x2 = XOR(x2, U8TO32_LITTLE(m + 8)); | 213 | x2 = XOR(x2, U8TO32_LITTLE(m + 8)); |
| @@ -237,6 +258,7 @@ chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, u32 bytes) | |||
| 237 | } | 258 | } |
| 238 | x->input[12] = j12; | 259 | x->input[12] = j12; |
| 239 | x->input[13] = j13; | 260 | x->input[13] = j13; |
| 261 | x->unused = 64 - bytes; | ||
| 240 | return; | 262 | return; |
| 241 | } | 263 | } |
| 242 | bytes -= 64; | 264 | bytes -= 64; |
