cipher/xchacha20: add one-pass implementation
Fix the function pointers while at it.
This commit is contained in:
parent
fb2139eeee
commit
2b76f3df5b
@ -209,6 +209,36 @@ chacha20_anycrypt(uint8_t *out, size_t *outlen, void *initparams,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
xchacha20_anycrypt(uint8_t *out, size_t *outlen, void *initparams,
|
||||||
|
const uint8_t *in, size_t inlen)
|
||||||
|
{
|
||||||
|
struct chacha20_ctx ctx;
|
||||||
|
size_t l0, l1;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
*outlen = 0;
|
||||||
|
|
||||||
|
if (inlen > SIZE_MAX - (LC_CHACHA20_BLOCKLEN - 1) ||
|
||||||
|
(inlen + LC_CHACHA20_BLOCKLEN - 1) / LC_CHACHA20_BLOCKLEN >
|
||||||
|
CHACHA20_CTRMAX)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (out == NULL) {
|
||||||
|
*outlen = inlen;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = xchacha20_anycrypt_init(&ctx, initparams) &&
|
||||||
|
chacha20_anycrypt_update(&ctx, out, &l0, in, inlen) &&
|
||||||
|
chacha20_anycrypt_final(&ctx, out + l0, &l1);
|
||||||
|
|
||||||
|
if (rc)
|
||||||
|
*outlen = l0 + l1;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct lc_cipher_impl chacha20_impl = {
|
static struct lc_cipher_impl chacha20_impl = {
|
||||||
.encrypt_init = &chacha20_anycrypt_init,
|
.encrypt_init = &chacha20_anycrypt_init,
|
||||||
@ -229,12 +259,12 @@ static struct lc_cipher_impl xchacha20_impl = {
|
|||||||
.encrypt_init = &xchacha20_anycrypt_init,
|
.encrypt_init = &xchacha20_anycrypt_init,
|
||||||
.encrypt_update = &chacha20_anycrypt_update,
|
.encrypt_update = &chacha20_anycrypt_update,
|
||||||
.encrypt_final = &chacha20_anycrypt_final,
|
.encrypt_final = &chacha20_anycrypt_final,
|
||||||
.encrypt = &chacha20_anycrypt,
|
.encrypt = &xchacha20_anycrypt,
|
||||||
|
|
||||||
.decrypt_init = &xchacha20_anycrypt_init,
|
.decrypt_init = &xchacha20_anycrypt_init,
|
||||||
.decrypt_update = &chacha20_anycrypt_update,
|
.decrypt_update = &chacha20_anycrypt_update,
|
||||||
.decrypt_final = &chacha20_anycrypt_final,
|
.decrypt_final = &chacha20_anycrypt_final,
|
||||||
.decrypt = &chacha20_anycrypt,
|
.decrypt = &xchacha20_anycrypt,
|
||||||
|
|
||||||
.argsz = sizeof(struct chacha20_ctx),
|
.argsz = sizeof(struct chacha20_ctx),
|
||||||
.blocklen = LC_XCHACHA20_BLOCKLEN,
|
.blocklen = LC_XCHACHA20_BLOCKLEN,
|
||||||
|
Loading…
Reference in New Issue
Block a user