Add support for calculating HMAC using SM3 hash functions.
Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
gost28147.c gosthash94.c gosthash94-meta.c \
hmac.c hmac-gosthash94.c hmac-md5.c hmac-ripemd160.c \
hmac-sha1.c hmac-sha224.c hmac-sha256.c hmac-sha384.c \
- hmac-sha512.c hmac-streebog.c \
+ hmac-sha512.c hmac-streebog.c hmac-sm3.c \
hmac-md5-meta.c hmac-ripemd160-meta.c hmac-sha1-meta.c \
hmac-sha224-meta.c hmac-sha256-meta.c hmac-sha384-meta.c \
- hmac-sha512-meta.c hmac-streebog-meta.c \
+ hmac-sha512-meta.c hmac-streebog-meta.c hmac-sm3-meta.c \
knuth-lfib.c hkdf.c \
md2.c md2-meta.c md4.c md4-meta.c \
md5.c md5-compress.c md5-compat.c md5-meta.c \
--- /dev/null
+/* hmac-sm3-meta.c
+
+ Copyright (C) 2021 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
+
+ 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 "nettle-meta.h"
+
+#include "hmac.h"
+
+static void
+hmac_sm3_set_key_wrapper (void *ctx, const uint8_t *key)
+{
+ hmac_sm3_set_key (ctx, SM3_DIGEST_SIZE, key);
+}
+
+const struct nettle_mac nettle_hmac_sm3
+= _NETTLE_HMAC(hmac_sm3, SM3);
--- /dev/null
+/* hmac-sm3.c
+
+ HMAC-SM3 message authentication code.
+
+ Copyright (C) 2021 Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
+
+ 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 "hmac.h"
+
+void
+hmac_sm3_set_key(struct hmac_sm3_ctx *ctx,
+ size_t key_length, const uint8_t *key)
+{
+ HMAC_SET_KEY(ctx, &nettle_sm3, key_length, key);
+}
+
+void
+hmac_sm3_update(struct hmac_sm3_ctx *ctx,
+ size_t length, const uint8_t *data)
+{
+ sm3_update(&ctx->state, length, data);
+}
+
+void
+hmac_sm3_digest(struct hmac_sm3_ctx *ctx,
+ size_t length, uint8_t *digest)
+{
+ HMAC_DIGEST(ctx, &nettle_sm3, length, digest);
+}
#include "sha1.h"
#include "sha2.h"
#include "streebog.h"
+#include "sm3.h"
#ifdef __cplusplus
extern "C" {
#define hmac_streebog512_set_key nettle_hmac_streebog512_set_key
#define hmac_streebog512_update nettle_hmac_streebog512_update
#define hmac_streebog512_digest nettle_hmac_streebog512_digest
+#define hmac_sm3_set_key nettle_hmac_sm3_set_key
+#define hmac_sm3_update nettle_hmac_sm3_update
+#define hmac_sm3_digest nettle_hmac_sm3_digest
void
hmac_set_key(void *outer, void *inner, void *state,
hmac_streebog256_digest(struct hmac_streebog256_ctx *ctx,
size_t length, uint8_t *digest);
+/* hmac-sm3 */
+struct hmac_sm3_ctx HMAC_CTX(struct sm3_ctx);
+
+void
+hmac_sm3_set_key(struct hmac_sm3_ctx *ctx,
+ size_t key_length, const uint8_t *key);
+
+void
+hmac_sm3_update(struct hmac_sm3_ctx *ctx,
+ size_t length, const uint8_t *data);
+
+void
+hmac_sm3_digest(struct hmac_sm3_ctx *ctx,
+ size_t length, uint8_t *digest);
+
#ifdef __cplusplus
}
#endif
&nettle_hmac_sha512,
&nettle_hmac_streebog256,
&nettle_hmac_streebog512,
+ &nettle_hmac_sm3,
NULL
};
extern const struct nettle_mac nettle_hmac_sha512;
extern const struct nettle_mac nettle_hmac_streebog256;
extern const struct nettle_mac nettle_hmac_streebog512;
+extern const struct nettle_mac nettle_hmac_sm3;
#ifdef __cplusplus
}
SHEX("0126bdb87800af214341456563780100"),
SHEX("a1aa5f7de402d7b3d323f2991c8d4534"
"013137010a83754fd0af6d7cd4922ed9"));
+
+ HMAC_TEST(sm3,
+ SDATA("monkey monkey monkey monkey"),
+ SDATA("abc"),
+ SHEX("7a9388e2ca5343b5d76e7c2c3d84f239"
+ "f306c0b60d5e0dc4d2771e42860a6a2b"));
}
"hmac_sha512",
"hmac_streebog256",
"hmac_streebog512",
+ "hmac_sm3",
};
void