mirror of
https://github.com/jedisct1/libsodium.git
synced 2026-08-25 08:37:13 +09:00
Add crypto_stream_chacha20_ietf_ext, use _ext suffix everywhere for consistency
This commit is contained in:
@@ -36,7 +36,7 @@ _encrypt_detached(unsigned char *c,
|
||||
unsigned char slen[8U];
|
||||
|
||||
(void) nsec;
|
||||
crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k);
|
||||
crypto_stream_chacha20_ietf_ext(block0, sizeof block0, npub, k);
|
||||
crypto_onetimeauth_poly1305_init(&state, block0);
|
||||
sodium_memzero(block0, sizeof block0);
|
||||
|
||||
@@ -82,7 +82,7 @@ _decrypt_detached(unsigned char *m,
|
||||
int ret;
|
||||
|
||||
(void) nsec;
|
||||
crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k);
|
||||
crypto_stream_chacha20_ietf_ext(block0, sizeof block0, npub, k);
|
||||
crypto_onetimeauth_poly1305_init(&state, block0);
|
||||
sodium_memzero(block0, sizeof block0);
|
||||
|
||||
|
||||
+8
-7
@@ -12,7 +12,6 @@
|
||||
#include "randombytes.h"
|
||||
#include "utils.h"
|
||||
|
||||
#include "private/chacha20_ietf_ext.h"
|
||||
#include "private/common.h"
|
||||
|
||||
#define crypto_secretstream_xchacha20poly1305_COUNTERBYTES 4U
|
||||
@@ -124,6 +123,8 @@ crypto_secretstream_xchacha20poly1305_push
|
||||
if (outlen_p != NULL) {
|
||||
*outlen_p = 0U;
|
||||
}
|
||||
COMPILER_ASSERT(crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX
|
||||
<= crypto_aead_chacha20poly1305_ietf_MESSAGEBYTES_MAX);
|
||||
if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
@@ -137,13 +138,13 @@ crypto_secretstream_xchacha20poly1305_push
|
||||
memset(block, 0, sizeof block);
|
||||
block[0] = tag;
|
||||
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(block, block, sizeof block,
|
||||
state->nonce, 1U, state->k);
|
||||
crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block,
|
||||
state->nonce, 1U, state->k);
|
||||
crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block);
|
||||
out[0] = block[0];
|
||||
|
||||
c = out + (sizeof tag);
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(c, m, mlen, state->nonce, 2U, state->k);
|
||||
crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k);
|
||||
crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen);
|
||||
crypto_onetimeauth_poly1305_update
|
||||
(&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf);
|
||||
@@ -213,8 +214,8 @@ crypto_secretstream_xchacha20poly1305_pull
|
||||
|
||||
memset(block, 0, sizeof block);
|
||||
block[0] = in[0];
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(block, block, sizeof block,
|
||||
state->nonce, 1U, state->k);
|
||||
crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block,
|
||||
state->nonce, 1U, state->k);
|
||||
tag = block[0];
|
||||
block[0] = in[0];
|
||||
crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block);
|
||||
@@ -238,7 +239,7 @@ crypto_secretstream_xchacha20poly1305_pull
|
||||
return -1;
|
||||
}
|
||||
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(m, c, mlen, state->nonce, 2U, state->k);
|
||||
crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k);
|
||||
XOR_BUF(STATE_INONCE(state), mac,
|
||||
crypto_secretstream_xchacha20poly1305_INONCEBYTES);
|
||||
sodium_increment(STATE_COUNTER(state),
|
||||
|
||||
@@ -77,9 +77,6 @@ chacha20_encrypt_bytes(chacha_ctx *ctx, const uint8_t *m, uint8_t *c,
|
||||
if (!bytes) {
|
||||
return; /* LCOV_EXCL_LINE */
|
||||
}
|
||||
if (bytes > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
# include "u8.h"
|
||||
# include "u4.h"
|
||||
# include "u1.h"
|
||||
@@ -106,8 +103,8 @@ stream_ref(unsigned char *c, unsigned long long clen, const unsigned char *n,
|
||||
}
|
||||
|
||||
static int
|
||||
stream_ietf_ref(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
stream_ietf_ext_ref(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
struct chacha_ctx ctx;
|
||||
|
||||
@@ -150,9 +147,9 @@ stream_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
}
|
||||
|
||||
static int
|
||||
stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
uint32_t ic, const unsigned char *k)
|
||||
stream_ietf_ext_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
uint32_t ic, const unsigned char *k)
|
||||
{
|
||||
struct chacha_ctx ctx;
|
||||
uint8_t ic_bytes[4];
|
||||
@@ -172,9 +169,9 @@ stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
struct crypto_stream_chacha20_implementation
|
||||
crypto_stream_chacha20_dolbeau_avx2_implementation = {
|
||||
SODIUM_C99(.stream =) stream_ref,
|
||||
SODIUM_C99(.stream_ietf =) stream_ietf_ref,
|
||||
SODIUM_C99(.stream_ietf_ext =) stream_ietf_ext_ref,
|
||||
SODIUM_C99(.stream_xor_ic =) stream_ref_xor_ic,
|
||||
SODIUM_C99(.stream_ietf_xor_ic =) stream_ietf_ref_xor_ic
|
||||
SODIUM_C99(.stream_ietf_ext_xor_ic =) stream_ietf_ext_ref_xor_ic
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -72,9 +72,6 @@ chacha20_encrypt_bytes(chacha_ctx *ctx, const uint8_t *m, uint8_t *c,
|
||||
if (!bytes) {
|
||||
return; /* LCOV_EXCL_LINE */
|
||||
}
|
||||
if (bytes > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
# include "u4.h"
|
||||
# include "u1.h"
|
||||
# include "u0.h"
|
||||
@@ -100,8 +97,8 @@ stream_ref(unsigned char *c, unsigned long long clen, const unsigned char *n,
|
||||
}
|
||||
|
||||
static int
|
||||
stream_ietf_ref(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
stream_ietf_ext_ref(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
struct chacha_ctx ctx;
|
||||
|
||||
@@ -144,9 +141,9 @@ stream_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
}
|
||||
|
||||
static int
|
||||
stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
uint32_t ic, const unsigned char *k)
|
||||
stream_ietf_ext_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
uint32_t ic, const unsigned char *k)
|
||||
{
|
||||
struct chacha_ctx ctx;
|
||||
uint8_t ic_bytes[4];
|
||||
@@ -166,9 +163,9 @@ stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
struct crypto_stream_chacha20_implementation
|
||||
crypto_stream_chacha20_dolbeau_ssse3_implementation = {
|
||||
SODIUM_C99(.stream =) stream_ref,
|
||||
SODIUM_C99(.stream_ietf =) stream_ietf_ref,
|
||||
SODIUM_C99(.stream_ietf_ext =) stream_ietf_ext_ref,
|
||||
SODIUM_C99(.stream_xor_ic =) stream_ref_xor_ic,
|
||||
SODIUM_C99(.stream_ietf_xor_ic =) stream_ietf_ref_xor_ic
|
||||
SODIUM_C99(.stream_ietf_ext_xor_ic =) stream_ietf_ext_ref_xor_ic
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -92,9 +92,6 @@ chacha20_encrypt_bytes(chacha_ctx *ctx, const uint8_t *m, uint8_t *c,
|
||||
if (!bytes) {
|
||||
return; /* LCOV_EXCL_LINE */
|
||||
}
|
||||
if (bytes > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
j0 = ctx->input[0];
|
||||
j1 = ctx->input[1];
|
||||
j2 = ctx->input[2];
|
||||
@@ -243,8 +240,8 @@ stream_ref(unsigned char *c, unsigned long long clen, const unsigned char *n,
|
||||
}
|
||||
|
||||
static int
|
||||
stream_ietf_ref(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
stream_ietf_ext_ref(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
struct chacha_ctx ctx;
|
||||
|
||||
@@ -287,9 +284,9 @@ stream_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
}
|
||||
|
||||
static int
|
||||
stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
uint32_t ic, const unsigned char *k)
|
||||
stream_ietf_ext_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
uint32_t ic, const unsigned char *k)
|
||||
{
|
||||
struct chacha_ctx ctx;
|
||||
uint8_t ic_bytes[4];
|
||||
@@ -309,7 +306,7 @@ stream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
struct crypto_stream_chacha20_implementation
|
||||
crypto_stream_chacha20_ref_implementation = {
|
||||
SODIUM_C99(.stream =) stream_ref,
|
||||
SODIUM_C99(.stream_ietf =) stream_ietf_ref,
|
||||
SODIUM_C99(.stream_ietf_ext =) stream_ietf_ext_ref,
|
||||
SODIUM_C99(.stream_xor_ic =) stream_ref_xor_ic,
|
||||
SODIUM_C99(.stream_ietf_xor_ic =) stream_ietf_ref_xor_ic
|
||||
SODIUM_C99(.stream_ietf_ext_xor_ic =) stream_ietf_ext_ref_xor_ic
|
||||
};
|
||||
|
||||
@@ -54,25 +54,79 @@ int
|
||||
crypto_stream_chacha20(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
if (clen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream(c, clen, n, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
return implementation->stream_ietf(c, clen, n, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint64_t ic,
|
||||
const unsigned char *k)
|
||||
{
|
||||
if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream_xor_ic(c, m, mlen, n, ic, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
const unsigned char *k)
|
||||
{
|
||||
if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_ietf_ext(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
if (clen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream_ietf_ext(c, clen, n, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint32_t ic,
|
||||
const unsigned char *k)
|
||||
{
|
||||
if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream_ietf_ext_xor_ic(c, m, mlen, n, ic, k);
|
||||
}
|
||||
|
||||
static int
|
||||
crypto_stream_chacha20_ietf_ext_xor(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
const unsigned char *k)
|
||||
{
|
||||
if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream_ietf_ext_xor_ic(c, m, mlen, n, 0U, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k)
|
||||
{
|
||||
if (clen >
|
||||
crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX / 64ULL - (clen + 63ULL) / 64ULL) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return crypto_stream_chacha20_ietf_ext(c, clen, n, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
@@ -83,24 +137,7 @@ crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX / 64ULL - (mlen + 63ULL) / 64ULL) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return implementation->stream_ietf_xor_ic(c, m, mlen, n, ic, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint32_t ic,
|
||||
const unsigned char *k)
|
||||
{
|
||||
return implementation->stream_ietf_xor_ic(c, m, mlen, n, ic, k);
|
||||
}
|
||||
|
||||
int
|
||||
crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
const unsigned char *k)
|
||||
{
|
||||
return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);
|
||||
return crypto_stream_chacha20_ietf_ext_xor_ic(c, m, mlen, n, ic, k);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -108,7 +145,11 @@ crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen, const unsigned char *n,
|
||||
const unsigned char *k)
|
||||
{
|
||||
return implementation->stream_ietf_xor_ic(c, m, mlen, n, 0U, k);
|
||||
if (mlen >
|
||||
crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX / 64ULL - (mlen + 63ULL) / 64ULL) {
|
||||
sodium_misuse();
|
||||
}
|
||||
return crypto_stream_chacha20_ietf_ext_xor(c, m, mlen, n, k);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
typedef struct crypto_stream_chacha20_implementation {
|
||||
int (*stream)(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k);
|
||||
int (*stream_ietf)(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k);
|
||||
int (*stream_ietf_ext)(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k);
|
||||
int (*stream_xor_ic)(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint64_t ic,
|
||||
const unsigned char *k);
|
||||
int (*stream_ietf_xor_ic)(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint32_t ic,
|
||||
const unsigned char *k);
|
||||
int (*stream_ietf_ext_xor_ic)(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint32_t ic,
|
||||
const unsigned char *k);
|
||||
} crypto_stream_chacha20_implementation;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -4,10 +4,13 @@
|
||||
#include <stdint.h>
|
||||
|
||||
/* The ietf_ext variant allows the internal counter to overflow into the IV */
|
||||
int
|
||||
crypto_stream_chacha20_ietf_ext_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint32_t ic,
|
||||
const unsigned char *k);
|
||||
|
||||
int crypto_stream_chacha20_ietf_ext(unsigned char *c, unsigned long long clen,
|
||||
const unsigned char *n, const unsigned char *k);
|
||||
|
||||
int crypto_stream_chacha20_ietf_ext_xor_ic(unsigned char *c, const unsigned char *m,
|
||||
unsigned long long mlen,
|
||||
const unsigned char *n, uint32_t ic,
|
||||
const unsigned char *k);
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user