Merge pull request #15252 from benpicco/crypto/chacha20poly1305-cleanup

crypto/chacha20poly1305: cleanup
This commit is contained in:
Koen Zandberg 2020-10-20 21:25:40 +02:00 committed by GitHub
commit bdd7a24ea5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -26,6 +26,7 @@
#include "crypto/helper.h" #include "crypto/helper.h"
#include "crypto/chacha20poly1305.h" #include "crypto/chacha20poly1305.h"
#include "crypto/poly1305.h" #include "crypto/poly1305.h"
#include "unaligned.h"
/* Missing operations to convert numbers to little endian prevents this from /* Missing operations to convert numbers to little endian prevents this from
* working on big endian systems */ * working on big endian systems */
@ -42,40 +43,31 @@ static const uint32_t constant[] = {0x61707865,
/* Padding to add to the poly1305 authentication tag */ /* Padding to add to the poly1305 authentication tag */
static const uint8_t padding[15] = {0}; static const uint8_t padding[15] = {0};
static uint32_t u8to32(const uint8_t *p)
{
return
((uint32_t)p[0] |
((uint32_t)p[1] << 8) |
((uint32_t)p[2] << 16) |
((uint32_t)p[3] << 24));
}
/* Single round */ /* Single round */
void _r(uint32_t *a, uint32_t *b, uint32_t *d, unsigned c) static void _r(uint32_t *a, uint32_t *b, uint32_t *d, unsigned c)
{ {
*a += *b; *a += *b;
uint32_t tmp = *a ^ *d; uint32_t tmp = *a ^ *d;
*d = (tmp << c) | (tmp >> (32 - c)); *d = (tmp << c) | (tmp >> (32 - c));
} }
void _add_initial(chacha20poly1305_ctx_t *ctx, const uint8_t *key, static void _add_initial(chacha20poly1305_ctx_t *ctx, const uint8_t *key,
const uint8_t *nonce, uint32_t blk) const uint8_t *nonce, uint32_t blk)
{ {
for (unsigned i = 0; i < 4; i++) { for (unsigned i = 0; i < 4; i++) {
ctx->state[i] += constant[i]; ctx->state[i] += constant[i];
} }
for (unsigned i = 0; i < 8; i++) { for (unsigned i = 0; i < 8; i++) {
ctx->state[i+4] += u8to32(key + 4*i); ctx->state[i+4] += unaligned_get_u32(key + 4*i);
} }
ctx->state[12] += u8to32((uint8_t*)&blk); ctx->state[12] += unaligned_get_u32((uint8_t*)&blk);
ctx->state[13] += u8to32(nonce); ctx->state[13] += unaligned_get_u32(nonce);
ctx->state[14] += u8to32(nonce+4); ctx->state[14] += unaligned_get_u32(nonce+4);
ctx->state[15] += u8to32(nonce+8); ctx->state[15] += unaligned_get_u32(nonce+8);
} }
void _keystream(chacha20poly1305_ctx_t *ctx, const uint8_t *key, static void _keystream(chacha20poly1305_ctx_t *ctx, const uint8_t *key,
const uint8_t *nonce, uint32_t blk) const uint8_t *nonce, uint32_t blk)
{ {
/* Initialize block state */ /* Initialize block state */
memset(ctx->state, 0, sizeof(ctx->state)); memset(ctx->state, 0, sizeof(ctx->state));
@ -96,8 +88,8 @@ void _keystream(chacha20poly1305_ctx_t *ctx, const uint8_t *key,
_add_initial(ctx, key, nonce, blk); _add_initial(ctx, key, nonce, blk);
} }
void _xcrypt(chacha20poly1305_ctx_t *ctx, const uint8_t *key, static void _xcrypt(chacha20poly1305_ctx_t *ctx, const uint8_t *key,
const uint8_t *nonce, const uint8_t *in, uint8_t *out, size_t len) const uint8_t *nonce, const uint8_t *in, uint8_t *out, size_t len)
{ {
/* Number of full 64 byte blocks */ /* Number of full 64 byte blocks */
const size_t num_blocks = len >> 6; const size_t num_blocks = len >> 6;
@ -118,7 +110,7 @@ void _xcrypt(chacha20poly1305_ctx_t *ctx, const uint8_t *key,
} }
} }
void _poly1305_padded(poly1305_ctx_t *pctx, const uint8_t *data, size_t len) static void _poly1305_padded(poly1305_ctx_t *pctx, const uint8_t *data, size_t len)
{ {
poly1305_update(pctx, data, len); poly1305_update(pctx, data, len);
const size_t padlen = (16 - len) & 0xF; const size_t padlen = (16 - len) & 0xF;
@ -126,9 +118,9 @@ void _poly1305_padded(poly1305_ctx_t *pctx, const uint8_t *data, size_t len)
} }
/* Generate a poly1305 tag */ /* Generate a poly1305 tag */
void _poly1305_gentag(uint8_t *mac, const uint8_t *key, const uint8_t *nonce, static void _poly1305_gentag(uint8_t *mac, const uint8_t *key, const uint8_t *nonce,
const uint8_t *cipher, size_t cipherlen, const uint8_t *cipher, size_t cipherlen,
const uint8_t *aad, size_t aadlen) const uint8_t *aad, size_t aadlen)
{ {
chacha20poly1305_ctx_t ctx; chacha20poly1305_ctx_t ctx;
/* generate one time key */ /* generate one time key */