aboutsummaryrefslogtreecommitdiff
path: root/sw/modexp_tester.c
diff options
context:
space:
mode:
Diffstat (limited to 'sw/modexp_tester.c')
-rw-r--r--sw/modexp_tester.c105
1 files changed, 79 insertions, 26 deletions
diff --git a/sw/modexp_tester.c b/sw/modexp_tester.c
index 21bebbd..e07f147 100644
--- a/sw/modexp_tester.c
+++ b/sw/modexp_tester.c
@@ -121,13 +121,13 @@ static void check_modulus_mem(void)
{
uint8_t i;
uint32_t j;
-
+
printf("Testing modulus mem access.\n");
tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
// Write test data to modulus mempory.
for (i = 0 ; i < 64; i = i + 1) {
- j = ((i * 4 + 3) << 24) + ((i * 4 + 2) << 16) +
+ j = ((i * 4 + 3) << 24) + ((i * 4 + 2) << 16) +
((i * 4 + 1) << 8) + i * 4;
tc_w32(MODEXP_MODULUS_DATA, j);
}
@@ -153,13 +153,13 @@ static void check_exponent_mem(void)
{
uint8_t i;
uint32_t j;
-
+
printf("Testing exponent mem access.\n");
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
// Write test data to exponent memory.
for (i = 0 ; i < 64; i = i + 1) {
- j = ((i * 4 + 3) << 24) + ((i * 4 + 2) << 16) +
+ j = ((i * 4 + 3) << 24) + ((i * 4 + 2) << 16) +
((i * 4 + 1) << 8) + i * 4;
tc_w32(MODEXP_EXPONENT_DATA, j);
}
@@ -186,13 +186,13 @@ static void check_message_mem(void)
{
uint8_t i;
uint32_t j;
-
+
printf("Testing message mem access.\n");
tc_w32(MODEXP_MESSAGE_PTR_RST, 0x00000000);
// Write test data to message memory.
for (i = 0 ; i < 64; i = i + 1) {
- j = ((i * 4 + 3) << 24) + ((i * 4 + 2) << 16) +
+ j = ((i * 4 + 3) << 24) + ((i * 4 + 2) << 16) +
((i * 4 + 1) << 8) + i * 4;
tc_w32(MODEXP_MESSAGE_DATA, j);
}
@@ -226,7 +226,7 @@ static void clear_mems()
tc_w32(MODEXP_EXPONENT_DATA, 0x00000000);
tc_w32(MODEXP_MODULUS_DATA, 0x00000000);
}
-
+
tc_w32(MODEXP_MESSAGE_PTR_RST, 0x00000000);
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
@@ -263,7 +263,7 @@ static void dump_mems()
printf("0x%08x 0x%08x 0x%08x 0x%08x\n",
tc_r32(MODEXP_RESULT_DATA), tc_r32(MODEXP_RESULT_DATA),
tc_r32(MODEXP_RESULT_DATA), tc_r32(MODEXP_RESULT_DATA));
-
+
tc_w32(MODEXP_MESSAGE_PTR_RST, 0x00000000);
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
@@ -290,15 +290,15 @@ static void tc1()
tc_w32(MODEXP_MESSAGE_PTR_RST, 0x00000000);
tc_w32(MODEXP_MESSAGE_DATA, 0x00000003);
tc_w32(MODEXP_LENGTH, 0x00000001);
-
+
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
tc_w32(MODEXP_EXPONENT_DATA, 0x00000007);
tc_w32(MODEXP_EXPONENT_LENGTH, 0x00000001);
-
+
tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
tc_w32(MODEXP_MODULUS_DATA, 0x0000000b);
tc_w32(MODEXP_MODULUS_LENGTH, 0x00000001);
-
+
// Start processing and wait for ready.
tc_w32(MODEXP_ADDR_CTRL, 0x00000001);
check(tc_wait_ready(MODEXP_ADDR_STATUS));
@@ -333,23 +333,23 @@ static void tc2()
tc_w32(MODEXP_MESSAGE_DATA, 0x000000fb);
tc_w32(MODEXP_MESSAGE_DATA, 0x00000000);
tc_w32(MODEXP_LENGTH, 0x00000001);
-
+
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
tc_w32(MODEXP_EXPONENT_DATA, 0x000000fb);
tc_w32(MODEXP_EXPONENT_DATA, 0x00000000);
tc_w32(MODEXP_EXPONENT_LENGTH, 0x00000001);
-
+
tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
tc_w32(MODEXP_MODULUS_DATA, 0x00000101);
tc_w32(MODEXP_MODULUS_DATA, 0x00000000);
tc_w32(MODEXP_MODULUS_LENGTH, 0x00000001);
-
+
// Start processing and wait for ready.
printf("TC2: Starting processing. Waiting for ready...\n");
tc_w32(MODEXP_ADDR_CTRL, 0x00000001);
check(tc_wait_ready(MODEXP_ADDR_STATUS));
printf("TC2: Ready seen.\n");
-
+
// Check result with expected value.
tc_w32(MODEXP_RESULT_PTR_RST, 0x00000000);
result = tc_r32(MODEXP_RESULT_DATA);
@@ -373,27 +373,25 @@ static void tc3()
{
uint32_t result;
- clear_mems();
-
printf("Running TC3: 0x81 ** 0x41 mod 0x87 = 0x36\n");
// Write operands and set associated lengths.
tc_w32(MODEXP_MESSAGE_PTR_RST, 0x00000000);
tc_w32(MODEXP_MESSAGE_DATA, 0x00000081);
tc_w32(MODEXP_LENGTH, 0x00000001);
-
+
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
tc_w32(MODEXP_EXPONENT_DATA, 0x00000041);
tc_w32(MODEXP_EXPONENT_LENGTH, 0x00000001);
-
+
tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
tc_w32(MODEXP_MODULUS_DATA, 0x00000087);
tc_w32(MODEXP_MODULUS_LENGTH, 0x00000001);
-
+
// Start processing and wait for ready.
tc_w32(MODEXP_ADDR_CTRL, 0x00000001);
check(tc_wait_ready(MODEXP_ADDR_STATUS));
-
+
// Check result with expected value.
tc_w32(MODEXP_RESULT_PTR_RST, 0x00000000);
result = tc_r32(MODEXP_RESULT_DATA);
@@ -418,6 +416,7 @@ static void tc3()
static void tc4()
{
uint32_t result0, result1;
+ uint32_t ready = 0;
printf("Running TC4: 0x00000001946473e1 ** 0xh000000010e85e74f mod 0x0000000170754797 = 0x000000007761ed4f\n");
@@ -426,7 +425,7 @@ static void tc4()
tc_w32(MODEXP_MESSAGE_DATA, 0x00000001);
tc_w32(MODEXP_MESSAGE_DATA, 0x946473e1);
tc_w32(MODEXP_LENGTH, 0x00000002);
-
+
tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
tc_w32(MODEXP_EXPONENT_DATA, 0x00000001);
tc_w32(MODEXP_EXPONENT_DATA, 0x0e85e74f);
@@ -436,10 +435,12 @@ static void tc4()
tc_w32(MODEXP_MODULUS_DATA, 0x00000001);
tc_w32(MODEXP_MODULUS_DATA, 0x70754797);
tc_w32(MODEXP_MODULUS_LENGTH, 0x00000002);
-
+
// Start processing and wait for ready.
tc_w32(MODEXP_ADDR_CTRL, 0x00000001);
- check(tc_wait_ready(MODEXP_ADDR_STATUS));
+
+ while (!ready)
+ ready = tc_r32(MODEXP_ADDR_STATUS);
// Check result with expected value.
tc_w32(MODEXP_RESULT_PTR_RST, 0x00000000);
@@ -448,18 +449,70 @@ static void tc4()
if ((result0 == 0x00000000) && (result1 == 0x7761ed4f))
printf("TC4: OK\n");
else
- printf("TC4: Error. Expected 0x000000007761ed4f, got 0x%08x%08x\n",
+ printf("TC4: Error. Expected 0x000000007761ed4f, got 0x%08x%08x\n",
result0, result1);
}
//------------------------------------------------------------------
+// tc5()
+//
+// c = m ** e % N with 128 bit operands.
+//------------------------------------------------------------------
+static void tc5()
+{
+ uint32_t result0, result1, result2, result3;
+
+ printf("Running TC5: 128 bit operands.\n");
+
+ // Write operands and set associated lengths.
+ tc_w32(MODEXP_MESSAGE_PTR_RST, 0x00000000);
+ tc_w32(MODEXP_MESSAGE_DATA, 0x29462882);
+ tc_w32(MODEXP_MESSAGE_DATA, 0x12caa2d5);
+ tc_w32(MODEXP_MESSAGE_DATA, 0xb80e1c66);
+ tc_w32(MODEXP_MESSAGE_DATA, 0x1006807f);
+
+ tc_w32(MODEXP_EXPONENT_PTR_RST, 0x00000000);
+ tc_w32(MODEXP_EXPONENT_DATA, 0x3285c343);
+ tc_w32(MODEXP_EXPONENT_DATA, 0x2acbcb0f);
+ tc_w32(MODEXP_EXPONENT_DATA, 0x4d023228);
+ tc_w32(MODEXP_EXPONENT_DATA, 0x2ecc73db);
+
+ tc_w32(MODEXP_MODULUS_PTR_RST, 0x00000000);
+ tc_w32(MODEXP_MODULUS_DATA, 0x267d2f2e);
+ tc_w32(MODEXP_MODULUS_DATA, 0x51c216a7);
+ tc_w32(MODEXP_MODULUS_DATA, 0xda752ead);
+ tc_w32(MODEXP_MODULUS_DATA, 0x48d22d89);
+
+ tc_w32(MODEXP_EXPONENT_LENGTH, 0x00000004);
+ tc_w32(MODEXP_MODULUS_LENGTH, 0x00000004);
+
+ // Start processing and wait for ready.
+ tc_w32(MODEXP_ADDR_CTRL, 0x00000001);
+ check(tc_wait_ready(MODEXP_ADDR_STATUS));
+
+ // Check result with expected value.
+ tc_w32(MODEXP_RESULT_PTR_RST, 0x00000000);
+ result0 = tc_r32(MODEXP_RESULT_DATA);
+ result1 = tc_r32(MODEXP_RESULT_DATA);
+ result2 = tc_r32(MODEXP_RESULT_DATA);
+ result3 = tc_r32(MODEXP_RESULT_DATA);
+ if ((result0 == 0x0ddc404d) && (result1 == 0x91600596) &&
+ (result2 == 0x7425a8d8) && (result3 == 0xa066ca56))
+ printf("TC5: OK\n");
+ else
+ printf("TC5: Error. Expected 0x0ddc404d 0x91600596 0x7425a8d8 0xa066ca56, got 0x%08x %08x0x %08x %08x\n",
+ result0, result1, result2, result3);
+}
+
+
+//------------------------------------------------------------------
// main()
//------------------------------------------------------------------
int main(void)
{
check_modexp_access();
- tc_set_debug(1);
+ // tc_set_debug(1);
// check_modulus_mem();
// check_exponent_mem();