aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--tests/test-rsa.c46
-rw-r--r--tests/test-rsa.h18
3 files changed, 47 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index 23e4de9..20d13e4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ config.log
config.status
tests/test-aes-key-wrap
tests/test-hash
+tests/test-rsa
diff --git a/tests/test-rsa.c b/tests/test-rsa.c
index 95b366a..23d1b8b 100644
--- a/tests/test-rsa.c
+++ b/tests/test-rsa.c
@@ -49,12 +49,11 @@ static int _set_register(const off_t addr,
w1[i] = value & 0xFF;
value >>= 8;
}
- printf("Setting register %#lx %s\n", (unsigned long) addr, name);
+ printf("Setting register %#lx %s...\n", (unsigned long) addr, name);
check(hal_io_write(addr, w1, sizeof(w1)));
check(hal_io_read(addr, w2, sizeof(w2)));
if (memcmp(w1, w2, sizeof(w1)) != 0)
printf("MISMATCH\n");
- printf("\n");
return 0;
}
@@ -70,11 +69,10 @@ static int _get_blockmem(const off_t reset_addr,
const size_t length)
{
size_t i;
- assert(reset_name != NULL && data_name != NULL && value != NULL && length % 4 == 0 && length <= sizeof(value));
- printf("Setting register %#lx %s\n", (unsigned long) reset_addr, reset_name);
+ assert(reset_name != NULL && data_name != NULL && value != NULL && length % 4 == 0);
+ printf("Setting register %#lx %s...\n", (unsigned long) reset_addr, reset_name);
check(hal_io_write(reset_addr, one, sizeof(one)));
- printf("\n");
- printf("Getting blockmem %#lx %s\n", (unsigned long) data_addr, data_name);
+ printf("Getting blockmem %#lx %s...\n", (unsigned long) data_addr, data_name);
for (i = 0; i < length; i += 4)
check(hal_io_read(data_addr, &value[i], 4));
return 0;
@@ -95,13 +93,11 @@ static int _set_blockmem(const off_t reset_addr,
{
size_t i;
assert(reset_name != NULL && data_name != NULL && value != NULL && buffer_length >= value_length && value_length % 4 == 0);
- printf("Setting register %#lx %s\n", (unsigned long) reset_addr, reset_name);
+ printf("Setting register %#lx %s...\n", (unsigned long) reset_addr, reset_name);
check(hal_io_write(reset_addr, one, sizeof(one)));
- printf("\n");
- printf("Setting blockmem %#lx %s\n", (unsigned long) data_addr, data_name);
+ printf("Setting blockmem %#lx %s...\n", (unsigned long) data_addr, data_name);
for (i = 0; i < value_length; i += 4)
check(hal_io_write(data_addr, &value[i], 4));
- printf("\n");
check(_get_blockmem(reset_addr, reset_name, data_addr, data_name, buffer, value_length));
if (memcmp(value, buffer, value_length))
printf("MISMATCH\n");
@@ -116,8 +112,8 @@ static int _set_blockmem(const off_t reset_addr,
#define set_register(_field_, _value_) \
_set_register(_field_, #_field_, _value_)
-#define get_blockmem(_field_, _value_) \
- _get_blockmem(_field_##_PTR_RST, #_field_ "_PTR_RST", _field_##_DATA, #_field_ "_DATA", _value_, sizeof(_value_))
+#define get_blockmem(_field_, _value_, _length_) \
+ _get_blockmem(_field_##_PTR_RST, #_field_ "_PTR_RST", _field_##_DATA, #_field_ "_DATA", _value_, _length_)
#define set_blockmem(_field_, _value_, _buffer_) \
_set_blockmem(_field_##_PTR_RST, #_field_ "_PTR_RST", _field_##_DATA, #_field_ "_DATA", (_value_).val, (_value_).len, _buffer_, sizeof(_buffer_))
@@ -130,6 +126,8 @@ static int test(const rsa_tc_t * const tc)
{
uint8_t b[4096];
+ hal_io_set_debug(1);
+
printf("Signature test for %lu-bit RSA key\n", (unsigned long) tc->size);
check(set_blockmem(MODEXP_MODULUS, tc->n, b));
@@ -145,11 +143,15 @@ static int test(const rsa_tc_t * const tc)
check(set_register(MODEXP_ADDR_CTRL, 1));
+ hal_io_set_debug(0);
+
printf("Waiting for ready\n");
check(hal_io_wait(MODEXP_ADDR_STATUS, STATUS_READY, NULL));
printf("\n");
- check(get_blockmem(MODEXP_RESULT, b));
+ hal_io_set_debug(1);
+
+ check(get_blockmem(MODEXP_RESULT, b, tc->n.len));
printf("Comparing results with known value...");
if (memcmp(b, tc->s.val, tc->s.len))
@@ -172,11 +174,15 @@ static int test(const rsa_tc_t * const tc)
check(set_register(MODEXP_ADDR_CTRL, 1));
+ hal_io_set_debug(0);
+
printf("Waiting for ready\n");
check(hal_io_wait(MODEXP_ADDR_STATUS, STATUS_READY, NULL));
printf("\n");
- check(get_blockmem(MODEXP_RESULT, b));
+ hal_io_set_debug(1);
+
+ check(get_blockmem(MODEXP_RESULT, b, tc->n.len));
printf("Comparing results with known value...");
if (memcmp(b, tc->m.val, tc->m.len))
@@ -201,13 +207,17 @@ int main(int argc, char *argv[])
check(hal_io_read(MODEXP_ADDR_VERSION, version, sizeof(version)));
printf("\"%8.8s\" \"%4.4s\"\n\n", name, version);
- hal_io_set_debug(1);
-
/*
- * Run all the test cases.
+ * Run the test cases.
*/
- for (i = 0; i < sizeof(rsa_tc)/sizeof(*rsa_tc); i++)
+#if 0
+#define N (sizeof(rsa_tc)/sizeof(*rsa_tc))
+#else
+#define N (1)
+#endif
+
+ for (i = 0; i < N; i++)
if (test(&rsa_tc[i]))
return 1;
diff --git a/tests/test-rsa.h b/tests/test-rsa.h
index b6e6ba6..5ae3ada 100644
--- a/tests/test-rsa.h
+++ b/tests/test-rsa.h
@@ -40,6 +40,24 @@ static const uint8_t n_1024[] = { /* key component n, 128 bytes */
};
static const uint8_t e_1024[] = { /* key component e, 4 bytes */
+#if 1
+ /*
+ * Test Joachim's theory that it's just a known bug with short
+ * numbers: pad e out to same size as modulus, so an extra 124
+ * leading zeros.
+ */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+#endif
0x00, 0x01, 0x00, 0x01
};