diff options
author | Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> | 2018-09-21 22:10:30 +0300 |
---|---|---|
committer | Dmitry Baryshkov <dbaryshkov@gmail.com> | 2020-06-07 00:58:59 +0300 |
commit | 929e8889b7c551b3676ee2365cf64f438e67f247 (patch) | |
tree | 71c925a253d81c6a35e663971762716fc0bf9f2c /lib | |
parent | 1da75337cc400c779e3fb09e4911d48008c5c205 (diff) | |
download | gnutls-929e8889b7c551b3676ee2365cf64f438e67f247.tar.gz |
nettle/gost: add ACPKM rekeying code
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/nettle/Makefile.am | 1 | ||||
-rw-r--r-- | lib/nettle/gost/acpkm.c | 83 | ||||
-rw-r--r-- | lib/nettle/gost/acpkm.h | 68 |
3 files changed, 152 insertions, 0 deletions
diff --git a/lib/nettle/Makefile.am b/lib/nettle/Makefile.am index ef0c736c09..3dddeec71e 100644 --- a/lib/nettle/Makefile.am +++ b/lib/nettle/Makefile.am @@ -92,6 +92,7 @@ libcrypto_la_SOURCES += gost_keywrap.c libcrypto_la_SOURCES += \ gost/magma.c gost/magma.h \ gost/kuznyechik.c gost/kuznyechik.h gost/kuztable.h \ + gost/acpkm.c gost/acpkm.h \ gost/cmac.h gost/cmac-magma.c gost/cmac-kuznyechik.c endif diff --git a/lib/nettle/gost/acpkm.c b/lib/nettle/gost/acpkm.c new file mode 100644 index 0000000000..8b05c7a75f --- /dev/null +++ b/lib/nettle/gost/acpkm.c @@ -0,0 +1,83 @@ +/* acpkm.c + + The R 1323565.1.017-2018 cipher function. See draft-irtf-cfrg-re-keying. + + Copyright (C) 2018 Dmitry Eremin-Solenikov + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "acpkm.h" + +static uint8_t acpkm_mesh_data[ACPKM_KEY_SIZE] = +{ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, +}; + +void acpkm_crypt(struct acpkm_ctx *ctx, + void *cipher, + nettle_cipher_func *encrypt, + nettle_set_key_func *set_key, + size_t length, uint8_t *dst, + const uint8_t *src) +{ + size_t N = ctx->N; + size_t part; + uint8_t new_key[ACPKM_KEY_SIZE]; + + /* Less than a block, no rekeying */ + if (ctx->pos + length < N) + { + encrypt(cipher, length, dst, src); + ctx->pos += length; + return; + } + + for (part = N - ctx->pos; length >= part; part = N) + { + encrypt(cipher, part, dst, src); + src += part; + dst += part; + length -= part; + + /* Rekey */ + encrypt(cipher, ACPKM_KEY_SIZE, new_key, acpkm_mesh_data); + set_key(cipher, new_key); + } + + if (length != 0) + encrypt(cipher, length, dst, src); + + ctx->pos = length; +} diff --git a/lib/nettle/gost/acpkm.h b/lib/nettle/gost/acpkm.h new file mode 100644 index 0000000000..5ece09f799 --- /dev/null +++ b/lib/nettle/gost/acpkm.h @@ -0,0 +1,68 @@ +/* acpkm.h + + The R 1323565.1.017-2018 cipher function. See draft-irtf-cfrg-re-keying. + + Copyright (C) 2018 Dmitry Eremin-Solenikov + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_ACPKM_H_INCLUDED +#define NETTLE_ACPKM_H_INCLUDED + +#include <nettle/nettle-types.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#define acpkm_crypt _gnutls_acpkm_crypt + +struct acpkm_ctx +{ + size_t N; + size_t pos; +}; + +#define ACPKM_CTX(type) \ +{ struct acpkm_ctx ctx; type cipher; } + +#define ACPKM_KEY_SIZE 32 + +void acpkm_crypt(struct acpkm_ctx *ctx, + void *cipher, + nettle_cipher_func *encrypt, + nettle_set_key_func *set_key, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ACPKM_H_INCLUDED */ + |