summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagendra modadugu <ngm@google.com>2016-08-25 15:17:29 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-09-02 15:12:08 -0700
commitd19eb52cd1a02f11b010e9588159a6ac5fa4f261 (patch)
treea5e5a04689655568750ab181cc82b09a4ee5b7ea
parent6b7f571900333c34c786d40ab03136775a68d7eb (diff)
downloadchrome-ec-d19eb52cd1a02f11b010e9588159a6ac5fa4f261.tar.gz
CR50: add tests for dcrypto bn_modinv_vartime
This change introduces a larger range of tests for bn_modinv_vartime. The tests are designed to run on a host, and compare results against openssl. BRANCH=none BUG=chrome-os-partner:47524 TEST=bn_test passes Change-Id: I2d6ea4824fa82f78f8797c0cfc2cf0dce03e8923 Signed-off-by: nagendra modadugu <ngm@google.com> Reviewed-on: https://chromium-review.googlesource.com/365232 Commit-Ready: Nagendra Modadugu <ngm@google.com> Tested-by: Nagendra Modadugu <ngm@google.com> Reviewed-by: Marius Schilder <mschilder@chromium.org> Reviewed-by: Bill Richardson <wfrichar@chromium.org>
-rw-r--r--test/tpm_test/Makefile27
-rw-r--r--test/tpm_test/bn_test.c122
-rw-r--r--test/tpm_test/testlib/common.c17
-rw-r--r--test/tpm_test/testlib/common.h18
-rw-r--r--test/tpm_test/testlib/trng.h6
-rw-r--r--test/tpm_test/testlib/util.h6
6 files changed, 189 insertions, 7 deletions
diff --git a/test/tpm_test/Makefile b/test/tpm_test/Makefile
index 3c53fd5caa..164b77e083 100644
--- a/test/tpm_test/Makefile
+++ b/test/tpm_test/Makefile
@@ -12,28 +12,37 @@ obj = ../../build/tpm_test
src = .
SWIG = /usr/bin/swig
+vpath %c $(src) ../../chip/g/dcrypto $(src)/testlib
+
CFLAGS = -fPIC
CFLAGS += -I /usr/include/python2.7
-CFLAGS += -DLIBFTDI1=1
-CFLAGS += -c
-
+CFLAGS += -I../../../../third_party/cryptoc/include
+CFLAGS += -I../../chip/g/dcrypto
+CFLAGS += -I.
+CFLAGS += -Itestlib
+CFLAGS += -DLIBFTDI1=1
+CFLAGS += -c
+CFLAGS += -DCR50_NO_BN_ASM
TARGET = ftdi_spi_tpm
+
.PRECIOUS: $(obj)/ftdi_spi_tpm_wrap.c
-$(obj)/_$(TARGET).so:
+all: $(obj)/_$(TARGET).so $(obj)/bn_test
+
+BN_OBJS = $(obj)/bn_test.o $(obj)/common.o $(obj)/bn.o
OBJS = $(obj)/$(TARGET).o $(obj)/$(TARGET)_wrap.o $(obj)/mpsse.o \
$(obj)/support.o
-DEPS := $(OBJS:.o=.o.d)
+DEPS := $(OBJS:.o=.o.d) $(BN_OBJS:.o=.o.d)
-$(OBJS): | $(obj)
+$(OBJS) $(BN_OBJS): | $(obj)
$(obj)/%.o: $(obj)/%.c
@echo " CC $(notdir $@)"
$(Q)gcc $(CFLAGS) -o $@ $<
-$(obj)/%.o: $(src)/%.c
+$(obj)/%.o: %.c
@echo " CC $(notdir $@)"
$(Q)gcc $(CFLAGS) -Wall -Werror -MMD -MF $@.d -o $@ $<
@@ -53,4 +62,8 @@ $(obj):
@echo " MKDIR $(obj)"
$(Q)mkdir -p $(obj)
+$(obj)/bn_test: $(BN_OBJS)
+ @echo " LD $(notdir $@)"
+ $(Q)$(CC) -o $@ $^ -lcrypto
+
-include $(DEPS)
diff --git a/test/tpm_test/bn_test.c b/test/tpm_test/bn_test.c
new file mode 100644
index 0000000000..c0eda9f450
--- /dev/null
+++ b/test/tpm_test/bn_test.c
@@ -0,0 +1,122 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "dcrypto.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/param.h>
+
+#include <openssl/bn.h>
+
+static int test_bn_modinv_helper(const BIGNUM *E, BN_CTX *ctx)
+{
+ int i;
+ BIGNUM *MOD = BN_CTX_get(ctx);
+
+ for (i = 0; i < 1000; i++) {
+
+ uint32_t m_buf[64];
+ uint32_t d_buf[64];
+ uint32_t e_buf[32];
+ int has_inverse;
+ int test_inverse;
+
+ struct LITE_BIGNUM m;
+ struct LITE_BIGNUM e;
+ struct LITE_BIGNUM d;
+
+ BIGNUM *r = BN_CTX_get(ctx);
+
+ memset(e_buf, 0, sizeof(e_buf));
+
+ /* Top bit set, bottom bit clear. */
+ BN_rand(MOD, 2048, 1, 0);
+
+ if (BN_mod_inverse(r, E, MOD, ctx))
+ has_inverse = 1;
+ else
+ has_inverse = 0;
+
+ DCRYPTO_bn_wrap(&m, m_buf, sizeof(m_buf));
+ memcpy(m_buf, MOD->d, sizeof(m_buf));
+ assert(BN_num_bytes(E) <= sizeof(e_buf));
+ memcpy(e_buf, E->d, BN_num_bytes(E));
+
+ DCRYPTO_bn_wrap(&e, e_buf, sizeof(e_buf));
+ bn_init(&d, d_buf, sizeof(d_buf));
+
+ test_inverse = bn_modinv_vartime(&d, &e, &m);
+
+ if (test_inverse != has_inverse) {
+ fprintf(stderr,
+ "ossl inverse: %d, dcrypto inverse: %d\n",
+ has_inverse, test_inverse);
+ fprintf(stderr, "d : ");
+ BN_print_fp(stderr, r);
+ fprintf(stderr, "\n");
+
+ fprintf(stderr, "e : ");
+ BN_print_fp(stderr, E);
+ fprintf(stderr, "\n");
+
+ fprintf(stderr, "M : ");
+ BN_print_fp(stderr, MOD);
+ fprintf(stderr, "\n");
+
+ return 1;
+ }
+
+ if (has_inverse) {
+ if (memcmp(d.d, r->d, BN_num_bytes(r)) != 0) {
+ fprintf(stderr, "memcmp fail\n");
+ return 1;
+ }
+ }
+
+ BN_free(r);
+ }
+
+ return 0;
+}
+
+static int test_bn_modinv(void)
+{
+ int result = 1;
+ BN_CTX *ctx = BN_CTX_new();
+
+ BN_CTX_start(ctx);
+
+ BIGNUM *E = BN_CTX_get(ctx);
+
+ BN_rand(E, 1024, 1, 1);
+ if (test_bn_modinv_helper(E, ctx))
+ goto fail;
+
+ BN_rand(E, 1024, 1, 0);
+ if (test_bn_modinv_helper(E, ctx))
+ goto fail;
+
+ BN_set_word(E, 3);
+ if (test_bn_modinv_helper(E, ctx))
+ goto fail;
+
+ BN_set_word(E, 65537);
+ if (test_bn_modinv_helper(E, ctx))
+ goto fail;
+
+ result = 0;
+fail:
+ BN_CTX_end(ctx);
+ BN_CTX_free(ctx);
+ return result;
+}
+
+int main(void)
+{
+ assert(test_bn_modinv() == 0);
+ fprintf(stderr, "PASS\n");
+ return 0;
+}
diff --git a/test/tpm_test/testlib/common.c b/test/tpm_test/testlib/common.c
new file mode 100644
index 0000000000..35b07196aa
--- /dev/null
+++ b/test/tpm_test/testlib/common.c
@@ -0,0 +1,17 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "common.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <openssl/rand.h>
+
+void rand_bytes(void *buf, size_t num)
+{
+ assert(RAND_bytes(buf, num) == 1);
+}
diff --git a/test/tpm_test/testlib/common.h b/test/tpm_test/testlib/common.h
new file mode 100644
index 0000000000..9fdd7ebcae
--- /dev/null
+++ b/test/tpm_test/testlib/common.h
@@ -0,0 +1,18 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef __EC_TEST_TPM_TEST_TESTLIB_COMMON_H
+#define __EC_TEST_TPM_TEST_TESTLIB_COMMON_H
+
+#include "dcrypto.h"
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <sys/param.h>
+
+void rand_bytes(void *buf, size_t num);
+
+#endif /* ! __EC_TEST_TPM_TEST_TESTLIB_COMMON_H */
+
diff --git a/test/tpm_test/testlib/trng.h b/test/tpm_test/testlib/trng.h
new file mode 100644
index 0000000000..07c82f3333
--- /dev/null
+++ b/test/tpm_test/testlib/trng.h
@@ -0,0 +1,6 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Dummy empty file, just to make test compilation work. */
diff --git a/test/tpm_test/testlib/util.h b/test/tpm_test/testlib/util.h
new file mode 100644
index 0000000000..07c82f3333
--- /dev/null
+++ b/test/tpm_test/testlib/util.h
@@ -0,0 +1,6 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Dummy empty file, just to make test compilation work. */