summaryrefslogtreecommitdiff
path: root/cmac.h
diff options
context:
space:
mode:
authorDmitry Eremin-Solenikov <dbaryshkov@gmail.com>2019-07-09 21:58:42 +0300
committerNiels Möller <nisse@lysator.liu.se>2019-07-10 22:31:08 +0200
commita71215f988312cf0c8d143b9e959ee6a9dbe1056 (patch)
treeb6d3d852b0df895dbc3bdfdb00ccc706eaf65e9c /cmac.h
parentc78f2fdbb6503856c02045213407c48efd29427d (diff)
downloadnettle-a71215f988312cf0c8d143b9e959ee6a9dbe1056.tar.gz
cmac: add 64-bit mode CMAC
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Diffstat (limited to 'cmac.h')
-rw-r--r--cmac.h69
1 files changed, 69 insertions, 0 deletions
diff --git a/cmac.h b/cmac.h
index 3c5b7bea..0cf9462d 100644
--- a/cmac.h
+++ b/cmac.h
@@ -44,6 +44,7 @@ extern "C" {
#endif
#define CMAC128_DIGEST_SIZE 16
+#define CMAC64_DIGEST_SIZE 8
#define cmac128_set_key nettle_cmac128_set_key
#define cmac128_init nettle_cmac128_init
@@ -56,6 +57,11 @@ extern "C" {
#define cmac_aes256_update nettle_cmac_aes256_update
#define cmac_aes256_digest nettle_cmac_aes256_digest
+#define cmac64_set_key nettle_cmac64_set_key
+#define cmac64_init nettle_cmac64_init
+#define cmac64_update nettle_cmac64_update
+#define cmac64_digest nettle_cmac64_digest
+
struct cmac128_key
{
union nettle_block16 K1;
@@ -72,6 +78,22 @@ struct cmac128_ctx
size_t index;
};
+struct cmac64_key
+{
+ union nettle_block8 K1;
+ union nettle_block8 K2;
+};
+
+struct cmac64_ctx
+{
+ /* MAC state */
+ union nettle_block8 X;
+
+ /* Block buffer */
+ union nettle_block8 block;
+ size_t index;
+};
+
void
cmac128_set_key(struct cmac128_key *key, const void *cipher,
nettle_cipher_func *encrypt);
@@ -118,6 +140,53 @@ cmac128_digest(struct cmac128_ctx *ctx, const struct cmac128_key *key,
(nettle_cipher_func *) (encrypt), \
(length), (digest)))
+void
+cmac64_set_key(struct cmac64_key *key, const void *cipher,
+ nettle_cipher_func *encrypt);
+
+void
+cmac64_init(struct cmac64_ctx *ctx);
+
+void
+cmac64_update(struct cmac64_ctx *ctx, const void *cipher,
+ nettle_cipher_func *encrypt,
+ size_t msg_len, const uint8_t *msg);
+
+void
+cmac64_digest(struct cmac64_ctx *ctx, const struct cmac64_key *key,
+ const void *cipher, nettle_cipher_func *encrypt,
+ unsigned length, uint8_t *digest);
+
+
+#define CMAC64_CTX(type) \
+ { struct cmac64_key key; struct cmac64_ctx ctx; type cipher; }
+
+/* NOTE: Avoid using NULL, as we don't include anything defining it. */
+#define CMAC64_SET_KEY(self, set_key, encrypt, cmac_key) \
+ do { \
+ (set_key)(&(self)->cipher, (cmac_key)); \
+ if (0) (encrypt)(&(self)->cipher, ~(size_t) 0, \
+ (uint8_t *) 0, (const uint8_t *) 0); \
+ cmac64_set_key(&(self)->key, &(self)->cipher, \
+ (nettle_cipher_func *) (encrypt)); \
+ cmac64_init(&(self)->ctx); \
+ } while (0)
+
+#define CMAC64_UPDATE(self, encrypt, length, src) \
+ (0 ? (encrypt)(&(self)->cipher, ~(size_t) 0, \
+ (uint8_t *) 0, (const uint8_t *) 0) \
+ : cmac64_update(&(self)->ctx, &(self)->cipher, \
+ (nettle_cipher_func *)encrypt, \
+ (length), (src)))
+
+#define CMAC64_DIGEST(self, encrypt, length, digest) \
+ (0 ? (encrypt)(&(self)->cipher, ~(size_t) 0, \
+ (uint8_t *) 0, (const uint8_t *) 0) \
+ : cmac64_digest(&(self)->ctx, &(self)->key, \
+ &(self)->cipher, \
+ (nettle_cipher_func *) (encrypt), \
+ (length), (digest)))
+
struct cmac_aes128_ctx CMAC128_CTX(struct aes128_ctx);
void