[Cryptech-Commits] [core/coretest_hashes] 01/01: Refactored code to allow additions of test cases. Adding dual block message test cases as specified by NIST. Adding code for running huge message test. This test case si disabled due to bugs in coretest.

git at cryptech.is git at cryptech.is
Tue Apr 1 07:56:09 UTC 2014


This is an automated email from the git hooks/post-receive script.

joachim at secworks.se pushed a commit to branch master
in repository core/coretest_hashes.

commit 5705e4676b4351c77b64a143fd6039a4ebd4d509
Author: Joachim Strömbergson <joachim at secworks.se>
Date:   Tue Apr 1 09:56:02 2014 +0200

    Refactored code to allow additions of test cases. Adding dual block message test cases as specified by NIST. Adding code for running huge message test. This test case si disabled due to bugs in coretest.
---
 src/sw/hash_tester.py | 459 ++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 335 insertions(+), 124 deletions(-)

diff --git a/src/sw/hash_tester.py b/src/sw/hash_tester.py
index 73d64e2..c76c273 100755
--- a/src/sw/hash_tester.py
+++ b/src/sw/hash_tester.py
@@ -13,9 +13,8 @@
 # http://pyserial.sourceforge.net/
 #
 # 
-# Author: Joachim Strombergson
-# Copyright (c) 2014, Secworks Sweden AB
-# All rights reserved.
+# Author: Joachim Strömbergson
+# Copyright (c) 2014, SUNET
 # 
 # Redistribution and use in source and binary forms, with or 
 # without modification, are permitted provided that the following 
@@ -52,13 +51,24 @@ import serial
 import os
 import time
 import threading
+import hashlib
 
  
 #-------------------------------------------------------------------
 # Defines.
 #-------------------------------------------------------------------
+# Serial port defines.
+# CONFIGURE YOUR DEVICE HERE!
+SERIAL_DEVICE = '/dev/cu.usbserial-A801SA6T'
+BAUD_RATE = 9600
+DATA_BITS = 8
+STOP_BITS = 1
+
+
+# Verbose operation on/off
 VERBOSE = False
 
+
 # Memory map.
 SOC                   = '\x55'
 EOC                   = '\xaa'
@@ -138,6 +148,33 @@ NAME0_ADDR            = '\x00'
 NAME1_ADDR            = '\x01'
 VERSION_ADDR          = '\x02'
 
+sha1_block_addr = [SHA1_ADDR_BLOCK0,  SHA1_ADDR_BLOCK1,
+                   SHA1_ADDR_BLOCK2,  SHA1_ADDR_BLOCK3,
+                   SHA1_ADDR_BLOCK4,  SHA1_ADDR_BLOCK5,
+                   SHA1_ADDR_BLOCK6,  SHA1_ADDR_BLOCK7,
+                   SHA1_ADDR_BLOCK8,  SHA1_ADDR_BLOCK9,
+                   SHA1_ADDR_BLOCK10, SHA1_ADDR_BLOCK11,
+                   SHA1_ADDR_BLOCK12, SHA1_ADDR_BLOCK13,
+                   SHA1_ADDR_BLOCK14, SHA1_ADDR_BLOCK15]
+
+sha1_digest_addr = [SHA1_ADDR_DIGEST0, SHA1_ADDR_DIGEST1,
+                    SHA1_ADDR_DIGEST2, SHA1_ADDR_DIGEST3,
+                    SHA1_ADDR_DIGEST4]
+
+sha256_block_addr = [SHA256_ADDR_BLOCK0,  SHA256_ADDR_BLOCK1,
+                     SHA256_ADDR_BLOCK2,  SHA256_ADDR_BLOCK3,
+                     SHA256_ADDR_BLOCK4,  SHA256_ADDR_BLOCK5,
+                     SHA256_ADDR_BLOCK6,  SHA256_ADDR_BLOCK7,
+                     SHA256_ADDR_BLOCK8,  SHA256_ADDR_BLOCK9,
+                     SHA256_ADDR_BLOCK10, SHA256_ADDR_BLOCK11,
+                     SHA256_ADDR_BLOCK12, SHA256_ADDR_BLOCK13,
+                     SHA256_ADDR_BLOCK14, SHA256_ADDR_BLOCK15]
+
+sha256_digest_addr = [SHA256_ADDR_DIGEST0,  SHA256_ADDR_DIGEST1,
+                      SHA256_ADDR_DIGEST2,  SHA256_ADDR_DIGEST3,
+                      SHA256_ADDR_DIGEST4,  SHA256_ADDR_DIGEST5,
+                      SHA256_ADDR_DIGEST6,  SHA256_ADDR_DIGEST7]
+
 
 #-------------------------------------------------------------------
 # print_response()
@@ -190,12 +227,16 @@ def read_serial_thread(serialport):
         
     buffer = []
     while True:
-        response = serialport.read()
-        buffer.append(response)
-        if response == '\x55':
-            print_response(buffer)
-            buffer = []
-
+        if serialport.isOpen():
+            response = serialport.read()
+            buffer.append(response)
+            if ((response == '\x55') and len(buffer) > 7):
+                print_response(buffer)
+                buffer = []
+        else:
+            print "No open device yet."
+            time.sleep(0.1)
+            
 
 #-------------------------------------------------------------------
 # write_serial_bytes()
@@ -211,8 +252,173 @@ def write_serial_bytes(tx_cmd, serialport):
 
     # Allow the device to complete the transaction.
     time.sleep(0.1)
+
+
+#-------------------------------------------------------------------
+# single_block_test_sha256()
+#
+# Write a given block to SHA-256 and perform single block
+# processing.
+#-------------------------------------------------------------------
+def single_block_test_sha256(block, ser):
+    # Write block to SHA-2.
+    for i in range(len(block) / 4):
+        message = [SOC, WRITE_CMD, SHA256_ADDR_PREFIX,] + [sha256_block_addr[i]] +\
+                  block[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start initial block hashing, wait and check status.
+    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
+    time.sleep(0.1)
+    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_STATUS, EOC], ser)
+
+    # Extract contents of the digest registers.
+    for i in range(8):
+        message = [SOC, READ_CMD, SHA256_ADDR_PREFIX] + [sha256_digest_addr[i]] + [EOC]
+        write_serial_bytes(message, ser)
+    print""
+
+
+#-------------------------------------------------------------------
+# double_block_test_sha256()
+#
+# Run double block message test.
+#-------------------------------------------------------------------
+def double_block_test_sha256(block1, block2, ser):
+    # Write block1 to SHA-256.
+    for i in range(len(block1) / 4):
+        message = [SOC, WRITE_CMD, SHA256_ADDR_PREFIX,] + [sha256_block_addr[i]] +\
+                  block1[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start initial block hashing, wait and check status.
+    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
+    time.sleep(0.1)
+    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_STATUS, EOC], ser)
+
+    # Extract contents of the digest registers.
+    for i in range(8):
+        message = [SOC, READ_CMD, SHA256_ADDR_PREFIX] + [sha256_digest_addr[i]] + [EOC]
+        write_serial_bytes(message, ser)
+    print""
+
+    # Write block2 to SHA-256.
+    for i in range(len(block2) / 4):
+        message = [SOC, WRITE_CMD, SHA256_ADDR_PREFIX,] + [sha256_block_addr[i]] +\
+                  block2[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start next block hashing, wait and check status.
+    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x02', EOC], ser)
+    time.sleep(0.1)
+    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_STATUS, EOC], ser)
+
+    # Extract contents of the digest registers.
+    for i in range(8):
+        message = [SOC, READ_CMD, SHA256_ADDR_PREFIX] + [sha256_digest_addr[i]] + [EOC]
+        write_serial_bytes(message, ser)
+    print""
+
+
+#-------------------------------------------------------------------
+# huge_message_test_sha256()
+
+# Test with a message with a huge number (n) number of blocks.
+#-------------------------------------------------------------------
+def huge_message_test_sha256(block, n, ser):
+    # Write block to SHA-256.
+    for i in range(len(block) / 4):
+        message = [SOC, WRITE_CMD, SHA256_ADDR_PREFIX,] + [sha256_block_addr[i]] +\
+                  block[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start initial block hashing, wait.
+    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
+    time.sleep(0.1)
+    print "Block 0 done."
+
+    # First blocl done.
+    n = n - 1
+
+    for i in range(n):
+        # Start next block hashing, wait.
+        write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x02', EOC], ser)
+        time.sleep(0.1)
+        print "Block %d done." % (i + 1)
+
+        # Extract contents of the digest registers.
+        for i in range(8):
+            message = [SOC, READ_CMD, SHA256_ADDR_PREFIX] + [sha256_digest_addr[i]] + [EOC]
+            write_serial_bytes(message, ser)
+            print""
+
+
+#-------------------------------------------------------------------
+# single_block_test_sha1()
+#
+# Write a given block to SHA-1 and perform single block
+# processing.
+#-------------------------------------------------------------------
+def single_block_test_sha1(block, ser):
+    # Write block to SHA-1.
+    for i in range(len(block) / 4):
+        message = [SOC, WRITE_CMD, SHA1_ADDR_PREFIX,] + [sha1_block_addr[i]] +\
+                  block[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start initial block hashing, wait and check status.
+    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
+    time.sleep(0.1)
+    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_STATUS,   EOC], ser)
+
+    # Extract the digest.
+    for i in range(5):
+        message = [SOC, READ_CMD, SHA1_ADDR_PREFIX] + [sha1_digest_addr[i]] + [EOC]
+        write_serial_bytes(message, ser)
+    print""
     
-    
+
+#-------------------------------------------------------------------
+# double_block_test_sha1
+#
+# Run double block message test for SHA-1.
+#-------------------------------------------------------------------
+def double_block_test_sha1(block1, block2, ser):
+    # Write block1 to SHA-1.
+    for i in range(len(block1) / 4):
+        message = [SOC, WRITE_CMD, SHA1_ADDR_PREFIX,] + [sha1_block_addr[i]] +\
+                  block1[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start initial block hashing, wait and check status.
+    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
+    time.sleep(0.1)
+    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_STATUS,   EOC], ser)
+
+    # Extract the digest.
+    for i in range(5):
+        message = [SOC, READ_CMD, SHA1_ADDR_PREFIX] + [sha1_digest_addr[i]] + [EOC]
+        write_serial_bytes(message, ser)
+    print""
+
+    # Write block2 to SHA-1.
+    for i in range(len(block2) / 4):
+        message = [SOC, WRITE_CMD, SHA1_ADDR_PREFIX,] + [sha1_block_addr[i]] +\
+                  block2[(i * 4) : ((i * 4 ) + 4)] + [EOC]
+        write_serial_bytes(message, ser)
+
+    # Start next block hashing, wait and check status.
+    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x02', EOC], ser)
+    time.sleep(0.1)
+    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_STATUS,   EOC], ser)
+
+    # Extract the digest.
+    for i in range(5):
+        message = [SOC, READ_CMD, SHA1_ADDR_PREFIX] + [sha1_digest_addr[i]] + [EOC]
+        write_serial_bytes(message, ser)
+    print""
+
+
 #-------------------------------------------------------------------
 # main()
 #
@@ -221,11 +427,11 @@ def write_serial_bytes(tx_cmd, serialport):
 def main():
     # Open device
     ser = serial.Serial()
-    ser.port='/dev/cu.usbserial-A801SA6T'
-    ser.baudrate=9600
-    ser.bytesize=8
+    ser.port=SERIAL_DEVICE
+    ser.baudrate=BAUD_RATE
+    ser.bytesize=DATA_BITS
     ser.parity='N'
-    ser.stopbits=1
+    ser.stopbits=STOP_BITS
     ser.timeout=1
     ser.writeTimeout=0
 
@@ -247,67 +453,75 @@ def main():
     my_thread.daemon = True
     my_thread.start()
 
-    # TC1-1: Read name and version from SHA-1 core.
-    print "TC1-1: Reading name, type and version words from SHA-1 core."
+
+    # TC1: Read name and version from SHA-1 core.
+    print "TC1: Reading name, type and version words from SHA-1 core."
     write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_NAME0, EOC], ser)
     write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_NAME1, EOC], ser)
     write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_VERSION, EOC], ser)
     print""
 
-    # TC1-2: Writing and reading a block into the SHA-1 core.
-    print "TC1-2: Writing and reading a block into the SHA-1 core."
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK0,  '\x61', '\x62', '\x63', '\x80', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK1,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK2,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK3,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK4,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK5,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK6,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK7,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK8,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK9,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK10, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK11, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK12, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK13, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK14, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK15, '\x00', '\x00', '\x00', '\x18', EOC], ser)
-    print "TC1-2: All block words written. Time to read."
-
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK0,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK1,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK2,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK3,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK4,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK5,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK6,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK7,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK8,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK9,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK10, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK11, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK12, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK13, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK14, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_BLOCK15, EOC], ser)
-    print "TC1-2: All block words read."
-    print""
 
-    # TC1-3: Running single block procssing on SHA-1 with the current block.
-    print "TC1-3: Starting the SHA-1 core on single block procssing with the current block."
-    write_serial_bytes([SOC, WRITE_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
-    time.sleep(0.1)
-    print "TC1-3: Reading SHA-1 status and digest."
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_STATUS,   EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_DIGEST0,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_DIGEST1,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_DIGEST2,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_DIGEST3,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA1_ADDR_PREFIX, SHA1_ADDR_DIGEST4,  EOC], ser)
-    print""
-    
-    # TC2-1: Read name and version from SHA-256 core.
-    print "TC2-1: Reading name, type and version words from SHA-256 core."
+    # TC2: Single block message test as specified by NIST.
+    print "TC2: Single block message test for SHA-1."
+    tc2_block = ['\x61', '\x62', '\x63', '\x80', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                 '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x18']
+
+    tc2_sha1_expected = [0xa9993e36, 0x4706816a, 0xba3e2571,
+                         0x7850c26c, 0x9cd0d89d]
+
+    print "TC2: Expected digest values as specified by NIST:"
+    for i in tc2_sha1_expected:
+        print("0x%08x " % i)
+    print("")
+    single_block_test_sha1(tc2_block, ser)
+
+
+    # TC3: Double block message test as specified by NIST.
+    print "TC3: Double block message test for SHA-1."
+    tc3_1_block = ['\x61', '\x62', '\x63', '\x64', '\x62', '\x63', '\x64', '\x65',
+                   '\x63', '\x64', '\x65', '\x66', '\x64', '\x65', '\x66', '\x67',
+                   '\x65', '\x66', '\x67', '\x68', '\x66', '\x67', '\x68', '\x69',
+                   '\x67', '\x68', '\x69', '\x6A', '\x68', '\x69', '\x6A', '\x6B',
+                   '\x69', '\x6A', '\x6B', '\x6C', '\x6A', '\x6B', '\x6C', '\x6D',
+                   '\x6B', '\x6C', '\x6D', '\x6E', '\x6C', '\x6D', '\x6E', '\x6F',
+                   '\x6D', '\x6E', '\x6F', '\x70', '\x6E', '\x6F', '\x70', '\x71',
+                   '\x80', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00']
+
+    tc3_2_block = ['\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
+                   '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x01', '\xC0']
+
+    tc3_1_sha1_expected = [0xF4286818, 0xC37B27AE, 0x0408F581,
+                           0x84677148, 0x4A566572]
+
+    tc3_2_sha1_expected = [0x84983E44, 0x1C3BD26E, 0xBAAE4AA1,
+                           0xF95129E5, 0xE54670F1]
+
+    print "TC3: Expected digest values for first block as specified by NIST:"
+    for i in tc3_1_sha1_expected:
+        print("0x%08x " % i)
+    print("")
+    print "TC3: Expected digest values for second block as specified by NIST:"
+    for i in tc3_2_sha1_expected:
+        print("0x%08x " % i)
+    print("")
+    double_block_test_sha1(tc3_1_block, tc3_2_block, ser)
+
+
+    # TC4: Read name and version from SHA-256 core.
+    print "TC4: Reading name, type and version words from SHA-256 core."
     my_cmd = [SOC, READ_CMD, SHA256_ADDR_PREFIX, NAME0_ADDR, EOC]
     write_serial_bytes(my_cmd, ser)
     my_cmd = [SOC, READ_CMD, SHA256_ADDR_PREFIX, NAME1_ADDR, EOC]
@@ -317,61 +531,58 @@ def main():
     print""
 
 
-    # TC2-2: Writing and reading a block into the SHA-256 core.
-    print "TC2-2: Writing and reading a block into the SHA-256 core."
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK0,  '\x61', '\x62', '\x63', '\x80', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK1,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK2,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK3,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK4,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK5,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK6,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK7,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK8,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK9,  '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK10, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK11, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK12, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK13, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK14, '\x00', '\x00', '\x00', '\x00', EOC], ser)
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK15, '\x00', '\x00', '\x00', '\x18', EOC], ser)
-    print "TC1-2: All block words written. Time to read."
-
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK0,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK1,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK2,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK3,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK4,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK5,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK6,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK7,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK8,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK9,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK10, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK11, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK12, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK13, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK14, EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_BLOCK15, EOC], ser)
-    print "TC2-2: All block words read."
-    print""
-
-
-    # TC2-3: Running single block procssing on SHA-256 with the current block.
-    print "TC2-3: Starting the SHA-256 core on single block procssing with the current block."
-    write_serial_bytes([SOC, WRITE_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_CTRL, '\x00', '\x00', '\x00', '\x01', EOC], ser)
-    time.sleep(0.1)
-    print "TC2-3: Reading SHA-256 status and digest."
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_STATUS,   EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST0,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST1,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST2,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST3,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST4,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST5,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST6,  EOC], ser)
-    write_serial_bytes([SOC, READ_CMD, SHA256_ADDR_PREFIX, SHA256_ADDR_DIGEST7,  EOC], ser)
-    print""
+    # TC5: Single block message test as specified by NIST.
+    print "TC5: Single block message test for SHA-256."
+
+    tc5_sha256_expected = [0xBA7816BF, 0x8F01CFEA, 0x414140DE, 0x5DAE2223,
+                           0xB00361A3, 0x96177A9C, 0xB410FF61, 0xF20015AD]
+
+    print "TC5: Expected digest values as specified by NIST:"
+    for i in tc5_sha256_expected:
+        print("0x%08x " % i)
+    print("")
+    single_block_test_sha256(tc2_block, ser)
+
+
+    # TC6: Double block message test as specified by NIST.
+    print "TC6: Double block message test for SHA-256."
+
+    tc6_1_sha256_expected = [0x85E655D6, 0x417A1795, 0x3363376A, 0x624CDE5C,
+                             0x76E09589, 0xCAC5F811, 0xCC4B32C1, 0xF20E533A]
+
+    tc6_2_sha256_expected = [0x248D6A61, 0xD20638B8, 0xE5C02693, 0x0C3E6039,
+                             0xA33CE459, 0x64FF2167, 0xF6ECEDD4, 0x19DB06C1]
+
+    print "TC6: Expected digest values for first block as specified by NIST:"
+    for i in tc6_1_sha256_expected:
+        print("0x%08x " % i)
+    print("")
+    print "TC6: Expected digest values for second block as specified by NIST:"
+    for i in tc6_2_sha256_expected:
+        print("0x%08x " % i)
+    print("")
+    double_block_test_sha256(tc3_1_block, tc3_2_block, ser)
+
+    # TC7: Huge message test.
+#    n = 10
+#    print "TC7: Message with %d blocks test for SHA-256." % n
+#    tc7_block = ['\xaa', '\x55', '\xaa', '\x55', '\xde', '\xad', '\xbe', '\xef',
+#                 '\x55', '\xaa', '\x55', '\xaa', '\xf0', '\x0f', '\xf0', '\x0f',
+#                 '\xaa', '\x55', '\xaa', '\x55', '\xde', '\xad', '\xbe', '\xef',
+#                 '\x55', '\xaa', '\x55', '\xaa', '\xf0', '\x0f', '\xf0', '\x0f',
+#                 '\xaa', '\x55', '\xaa', '\x55', '\xde', '\xad', '\xbe', '\xef',
+#                 '\x55', '\xaa', '\x55', '\xaa', '\xf0', '\x0f', '\xf0', '\x0f',
+#                 '\xaa', '\x55', '\xaa', '\x55', '\xde', '\xad', '\xbe', '\xef',
+#                 '\x55', '\xaa', '\x55', '\xaa', '\xf0', '\x0f', '\xf0', '\x0f']
+#
+#    tc7_expected = [0xf407ff0d, 0xb9dce2f6, 0x9b9759a9, 0xd3cdc805,
+#                    0xf250086d, 0x73bbefd5, 0xa972e0f7, 0x61a9c13e]
+#
+#    print "TC7: Expected digest values after %d blocks:" %n
+#    for i in tc7_expected:
+#        print("0x%08x " % i)
+#    print("")
+#    huge_message_test_sha256(tc7_block, n, ser)
     
     # Exit nicely.
     if VERBOSE:



More information about the Commits mailing list