summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--regress/lib/libcrypto/sm3/Makefile9
-rw-r--r--regress/lib/libcrypto/sm3/sm3test.c92
2 files changed, 101 insertions, 0 deletions
diff --git a/regress/lib/libcrypto/sm3/Makefile b/regress/lib/libcrypto/sm3/Makefile
new file mode 100644
index 00000000000..a0b5006ebcc
--- /dev/null
+++ b/regress/lib/libcrypto/sm3/Makefile
@@ -0,0 +1,9 @@
+# $OpenBSD: Makefile,v 1.1 2018/11/11 07:12:33 tb Exp $
+
+PROG= sm3test
+LDADD= -lcrypto
+DPADD= ${LIBCRYPTO}
+WARNINGS= Yes
+CFLAGS+= -DLIBRESSL_INTERNAL -Werror
+
+.include <bsd.regress.mk>
diff --git a/regress/lib/libcrypto/sm3/sm3test.c b/regress/lib/libcrypto/sm3/sm3test.c
new file mode 100644
index 00000000000..ec6f7b39c0c
--- /dev/null
+++ b/regress/lib/libcrypto/sm3/sm3test.c
@@ -0,0 +1,92 @@
+/* $OpenBSD: sm3test.c,v 1.1 2018/11/11 07:12:33 tb Exp $ */
+/*
+ * Copyright (c) 2018, Ribose Inc
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <err.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <openssl/evp.h>
+
+#define SM3_TESTS 3
+
+const char *sm3_input[SM3_TESTS] = {
+ "",
+ "abc",
+ "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"
+};
+
+const char *sm3_expected[SM3_TESTS] = {
+ "1ab21d8355cfa17f8e61194831e81a8f22bec8c728fefb747ed035eb5082aa2b",
+ "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0",
+ "debe9ff92275b8a138604889c18e5a4d6fdb70e5387e5765293dcba39c0c5732"
+};
+
+char *hex_encode(const uint8_t *, size_t);
+
+char *
+hex_encode(const uint8_t *input, size_t len)
+{
+ const char *hex = "0123456789abcdef";
+ char *out;
+ size_t i;
+
+ if ((out = malloc(len * 2 + 1)) == NULL)
+ err(1, NULL);
+ for (i = 0; i < len; i++) {
+ out[i * 2] = hex[input[i] >> 4];
+ out[i * 2 + 1] = hex[input[i] & 0x0f];
+ }
+ out[len * 2] = '\0';
+
+ return out;
+}
+
+int
+main(int argc, char *argv[])
+{
+ EVP_MD_CTX *ctx;
+ uint8_t digest[32];
+ char *hexdigest;
+ int numerrors = 0, i;
+
+ if ((ctx = EVP_MD_CTX_new()) == NULL)
+ err(1, NULL);
+
+ for (i = 0; i != SM3_TESTS; ++i) {
+ if (!EVP_DigestInit(ctx, EVP_sm3()))
+ errx(1, "EVP_DigestInit() failed");
+ if (!EVP_DigestUpdate(ctx, sm3_input[i], strlen(sm3_input[i])))
+ errx(1, "EVP_DigestInit() failed");
+ if (!EVP_DigestFinal(ctx, digest, NULL))
+ errx(1, "EVP_DigestFinal() failed");
+
+ hexdigest = hex_encode(digest, sizeof(digest));
+
+ if (strcmp(hexdigest, sm3_expected[i]) != 0) {
+ fprintf(stderr,
+ "TEST %d failed\nProduced %s\nExpected %s\n",
+ i, hexdigest, sm3_expected[i]);
+ numerrors++;
+ } else
+ fprintf(stderr, "SM3 test %d ok\n", i);
+ free(hexdigest);
+ }
+
+ EVP_MD_CTX_free(ctx);
+
+ return (numerrors > 0) ? 1 : 0;
+}