summaryrefslogtreecommitdiff
path: root/test/tpm_test/rsa_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/tpm_test/rsa_test.py')
-rw-r--r--test/tpm_test/rsa_test.py458
1 files changed, 227 insertions, 231 deletions
diff --git a/test/tpm_test/rsa_test.py b/test/tpm_test/rsa_test.py
index e411df57b0..1d377b3ae2 100644
--- a/test/tpm_test/rsa_test.py
+++ b/test/tpm_test/rsa_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
# Copyright 2015 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.
@@ -6,6 +6,9 @@
"""Module for testing rsa functions using extended commands."""
import binascii
+import os
+import struct
+
import Crypto
import Crypto.Hash.SHA
import Crypto.Hash.SHA256
@@ -14,10 +17,7 @@ import Crypto.Hash.SHA512
from Crypto.PublicKey import RSA
import Crypto.Signature.PKCS1_PSS
import Crypto.Signature.PKCS1_v1_5
-import hashlib
-import os
import rsa
-import struct
import subcmd
import utils
@@ -93,91 +93,93 @@ _RSA_CMD_FORMAT = '{o:c}{p:c}{h:c}{kl:s}{ml:s}{msg}{dl:s}{dig}'
def _decrypt_cmd(padding, hashing, key_len, msg):
- op = _RSA_OPCODES['DECRYPT']
- msg_len = len(msg)
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', msg_len), msg=msg,
- dl='', dig='')
+ rsa_op = _RSA_OPCODES['DECRYPT']
+ msg_len = len(msg)
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', msg_len), msg=msg,
+ dl='', dig='')
def _encrypt_cmd(padding, hashing, key_len, msg):
- op = _RSA_OPCODES['ENCRYPT']
- msg_len = len(msg)
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', msg_len), msg=msg,
- dl='', dig='')
+ rsa_op = _RSA_OPCODES['ENCRYPT']
+ msg_len = len(msg)
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', msg_len), msg=msg,
+ dl='', dig='')
def _sign_cmd(padding, hashing, key_len, digest):
- op = _RSA_OPCODES['SIGN']
- digest_len = len(digest)
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', digest_len), msg=digest,
- dl='', dig='')
+ rsa_op = _RSA_OPCODES['SIGN']
+ digest_len = len(digest)
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', digest_len), msg=digest,
+ dl='', dig='')
def _verify_cmd(padding, hashing, key_len, sig, digest):
- op = _RSA_OPCODES['VERIFY']
- sig_len = len(sig)
- digest_len = len(digest)
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', sig_len), msg=sig,
- dl=struct.pack('>H', digest_len), dig=digest)
+ rsa_op = _RSA_OPCODES['VERIFY']
+ sig_len = len(sig)
+ digest_len = len(digest)
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', sig_len), msg=sig,
+ dl=struct.pack('>H', digest_len), dig=digest)
def _keytest_cmd(key_len):
- op = _RSA_OPCODES['KEYTEST']
- return _RSA_CMD_FORMAT.format(o=op, p=0, h=_HASH['NONE'],
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', 0), msg='',
- dl='', dig='')
+ rsa_op = _RSA_OPCODES['KEYTEST']
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=0, h=_HASH['NONE'],
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', 0), msg='',
+ dl='', dig='')
-def _keygen_cmd(key_len, e, label):
- op = _RSA_OPCODES['KEYGEN']
- padding = _RSA_PADDING['NONE']
- hashing = _HASH['NONE']
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', len(label)), msg=label,
- dl=struct.pack('>H', 0), dig='')
+def _keygen_cmd(key_len, exponent, label):
+ assert exponent == 65537
+ rsa_op = _RSA_OPCODES['KEYGEN']
+ padding = _RSA_PADDING['NONE']
+ hashing = _HASH['NONE']
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', len(label)), msg=label,
+ dl=struct.pack('>H', 0), dig='')
def _primegen_cmd(seed):
- op = _RSA_OPCODES['PRIMEGEN']
- padding = _RSA_PADDING['NONE']
- hashing = _HASH['NONE']
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', len(seed) * 8 * 2),
- ml=struct.pack('>H', len(seed)), msg=seed,
- dl=struct.pack('>H', 0), dig='')
+ rsa_op = _RSA_OPCODES['PRIMEGEN']
+ padding = _RSA_PADDING['NONE']
+ hashing = _HASH['NONE']
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', len(seed) * 8 * 2),
+ ml=struct.pack('>H', len(seed)), msg=seed,
+ dl=struct.pack('>H', 0), dig='')
def _x509_verify_cmd(key_len):
- op = _RSA_OPCODES['X509_VERIFY']
- padding = _RSA_PADDING['NONE']
- hashing = _HASH['NONE']
- return _RSA_CMD_FORMAT.format(o=op, p=padding, h=hashing,
- kl=struct.pack('>H', key_len),
- ml=struct.pack('>H', 0), msg='',
- dl=struct.pack('>H', 0), dig='')
+ rsa_op = _RSA_OPCODES['X509_VERIFY']
+ padding = _RSA_PADDING['NONE']
+ hashing = _HASH['NONE']
+ return _RSA_CMD_FORMAT.format(o=rsa_op, p=padding, h=hashing,
+ kl=struct.pack('>H', key_len),
+ ml=struct.pack('>H', 0), msg='',
+ dl=struct.pack('>H', 0), dig='')
_PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
- 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131,
- 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
- 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
- 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373,
- 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457,
- 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
- 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
- 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733,
- 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827,
- 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929,
- 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019,
+ 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
+ 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193,
+ 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269,
+ 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
+ 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431,
+ 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
+ 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
+ 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673,
+ 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761,
+ 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857,
+ 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
+ 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019,
1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171,
1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249,
@@ -564,28 +566,28 @@ _PRIMES = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
def _prime_from_seed(seed):
- ROUNDS = 7
-
- def _window(s, primes):
- w = [0] * 4096
- for i in primes:
- rem = s % i
- if rem != 0:
- rem = i - rem
- for j in range(rem, len(w), i):
- w[j] = 1
- return w
-
- # Set LSB, and top two bits.
- candidate = chr(ord(seed[0]) | 192) + seed[1:-1] + chr(ord(seed[-1]) | 1)
- candidate = int(binascii.b2a_hex(candidate), 16)
- assert len(bin(candidate)[2:]) == len(seed) * 8
- w = _window(candidate, _PRIMES[:4096])
- for i, bit in enumerate(w):
- if not bit:
- if rsa.prime.randomized_primality_testing(candidate + i, ROUNDS):
- return candidate + i
- return None
+ rounds = 7
+
+ def _window(candidate, primes):
+ window = [0] * 4096
+ for i in primes:
+ rem = candidate % i
+ if rem != 0:
+ rem = i - rem
+ for j in range(rem, len(window), i):
+ window[j] = 1
+ return window
+
+ # Set LSB, and top two bits.
+ candidate = chr(ord(seed[0]) | 192) + seed[1:-1] + chr(ord(seed[-1]) | 1)
+ candidate = int(binascii.b2a_hex(candidate), 16)
+ assert len(bin(candidate)[2:]) == len(seed) * 8
+ window = _window(candidate, _PRIMES[:4096])
+ for i, bit in enumerate(window):
+ if not bit:
+ if rsa.prime.randomized_primality_testing(candidate + i, rounds):
+ return candidate + i
+ return None
#
@@ -633,7 +635,8 @@ _KEYTEST_INPUTS = (
_KEYGEN_INPUTS = (
(768, 65537, '', None),
(1024, 65537, 'rsa_test', None),
- (2048, 65537, 'RSA key by vendor', 20811475686431332186511278472307159547870512766846593830860105577496044159545322178313772755518365593670114793803805067608811418757734989708137784444223785391864604211835387393923163468734914392307047296990698533218399115126417934050463597455237478939601236799120239663591264311485133747167378663829046579164891864068853210530642835833947569643788911200934265596274935082689832626616967124524353322373059893974744194447740045242468136414689225322177212281193879756355471091445748150740871146034049776312457888356154834233819876846764944450478069436248506560967902863015152471662817623176815923756421011384149834497587L),
+ # pylint: disable=line-too-long
+ (2048, 65537, 'RSA key by vendor', 20811475686431332186511278472307159547870512766846593830860105577496044159545322178313772755518365593670114793803805067608811418757734989708137784444223785391864604211835387393923163468734914392307047296990698533218399115126417934050463597455237478939601236799120239663591264311485133747167378663829046579164891864068853210530642835833947569643788911200934265596274935082689832626616967124524353322373059893974744194447740045242468136414689225322177212281193879756355471091445748150740871146034049776312457888356154834233819876846764944450478069436248506560967902863015152471662817623176815923756421011384149834497587),
(2048, 65537, '', None),
)
@@ -650,169 +653,162 @@ _PRIMEGEN_INPUTS = (
)
def _encrypt_tests(tpm):
- msg = 'Hello CR50!'
-
- for data in _ENCRYPT_INPUTS:
- padding, hashing, key_len = data
- test_name = 'RSA-ENC:%s:%s:%d' % data
- cmd = _encrypt_cmd(_RSA_PADDING[padding], _HASH[hashing], key_len, msg)
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- ciphertext = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
-
- cmd = _decrypt_cmd(_RSA_PADDING[padding], _HASH[hashing],
- key_len, ciphertext)
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- plaintext = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- if padding == 'NULL':
- # Check for leading zeros.
- if reduce(lambda x, y: x | y,
- map(ord, plaintext[:len(plaintext) - len(msg)])):
- raise subcmd.TpmTestError('%s error:%s%s' % (
- test_name, utils.hex_dump(msg), utils.hex_dump(plaintext)))
- else:
- plaintext = plaintext[len(plaintext) - len(msg):]
- if msg != plaintext:
- raise subcmd.TpmTestError('%s error:%s%s' % (
- test_name, utils.hex_dump(msg), utils.hex_dump(plaintext)))
+ msg = 'Hello CR50!'
+
+ for data in _ENCRYPT_INPUTS:
+ padding, hashing, key_len = data
+ test_name = 'RSA-ENC:%s:%s:%d' % data
+ cmd = _encrypt_cmd(_RSA_PADDING[padding], _HASH[hashing], key_len, msg)
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ ciphertext = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+
+ cmd = _decrypt_cmd(_RSA_PADDING[padding], _HASH[hashing],
+ key_len, ciphertext)
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ plaintext = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ if padding == 'NULL' and msg != plaintext[-len(msg):]:
+ raise subcmd.TpmTestError('%s error:%s%s' %
+ (test_name, utils.hex_dump(msg),
+ utils.hex_dump(plaintext)))
print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def _sign_tests(tpm):
- for data in _SIGN_INPUTS:
- msg = rsa.randnum.read_random_bits(256)
- padding, hashing, key_len = data
- test_name = 'RSA-SIGN:%s:%s:%d' % data
+ for data in _SIGN_INPUTS:
+ msg = rsa.randnum.read_random_bits(256)
+ padding, hashing, key_len = data
+ test_name = 'RSA-SIGN:%s:%s:%d' % data
- key = _KEYS[key_len]
- verifier = _SIGNER[padding].new(key)
- h = _HASHER[hashing].new()
- h.update(msg)
+ key = _KEYS[key_len]
+ verifier = _SIGNER[padding].new(key)
+ msg_hash = _HASHER[hashing].new()
+ msg_hash.update(msg)
- cmd = _sign_cmd(_RSA_PADDING[padding], _HASH[hashing], key_len, h.digest())
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- signature = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ cmd = _sign_cmd(_RSA_PADDING[padding], _HASH[hashing],
+ key_len, msg_hash.digest())
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ signature = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- signer = _SIGNER[padding].new(key)
- expected_signature = signer.sign(h)
-
- if not verifier.verify(h, signature):
- raise subcmd.TpmTestError('%s error' % (
- test_name,))
- print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
+ if not verifier.verify(msg_hash, signature):
+ raise subcmd.TpmTestError('%s error' % (test_name,))
+ print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def _verify_tests(tpm):
- for data in _VERIFY_INPUTS:
- msg = rsa.randnum.read_random_bits(256)
- padding, hashing, key_len = data
- test_name = 'RSA-VERIFY:%s:%s:%d' % data
-
- key = _KEYS[key_len]
- signer = _SIGNER[padding].new(key)
- h = _HASHER[hashing].new()
- h.update(msg)
- signature = signer.sign(h)
-
- cmd = _verify_cmd(_RSA_PADDING[padding], _HASH[hashing],
- key_len, signature, h.digest())
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- verified = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- expected = '\x01'
- if verified != expected:
- raise subcmd.TpmTestError('%s error:%s%s' % (
- test_name, utils.hex_dump(verified), utils.hex_dump(expected)))
- print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
+ for data in _VERIFY_INPUTS:
+ msg = rsa.randnum.read_random_bits(256)
+ padding, hashing, key_len = data
+ test_name = 'RSA-VERIFY:%s:%s:%d' % data
+
+ key = _KEYS[key_len]
+ signer = _SIGNER[padding].new(key)
+ msg_hash = _HASHER[hashing].new()
+ msg_hash.update(msg)
+ signature = signer.sign(msg_hash)
+
+ cmd = _verify_cmd(_RSA_PADDING[padding], _HASH[hashing],
+ key_len, signature, msg_hash.digest())
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ verified = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ expected = '\x01'
+ if verified != expected:
+ raise subcmd.TpmTestError('%s error:%s%s' % (
+ test_name, utils.hex_dump(verified), utils.hex_dump(expected)))
+ print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def _keytest_tests(tpm):
- for data in _KEYTEST_INPUTS:
- key_len, = data
- test_name = 'RSA-KEYTEST:%d' % data
- cmd = _keytest_cmd(key_len)
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- valid = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- expected = '\x01'
- if valid != expected:
- raise subcmd.TpmTestError('%s error:%s%s' % (
- test_name, utils.hex_dump(valid), utils.hex_dump(expected)))
- print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
+ for data in _KEYTEST_INPUTS:
+ key_len, = data
+ test_name = 'RSA-KEYTEST:%d' % data
+ cmd = _keytest_cmd(key_len)
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ valid = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ expected = '\x01'
+ if valid != expected:
+ raise subcmd.TpmTestError('%s error:%s%s' % (
+ test_name, utils.hex_dump(valid), utils.hex_dump(expected)))
+ print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def _keygen_tests(tpm):
- for data in _KEYGEN_INPUTS:
- key_len, e, label, expected_N = data
- test_name = 'RSA-KEYGEN:%d:%d:%s' % data[:-1]
- cmd = _keygen_cmd(key_len, e, label)
-
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- result = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- result_len = len(result)
- if result_len != int(key_len / 8 * 1.5):
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
-
- N = int(binascii.b2a_hex(result[0:result_len * 2 / 3]), 16)
- if expected_N and N != expected_N:
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
- p = int(binascii.b2a_hex(result[result_len * 2 / 3:]), 16)
- q = N / p
- if not rsa.prime.is_prime(p):
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
- if not rsa.prime.is_prime(q):
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
- if p == q:
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
- print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
+ for data in _KEYGEN_INPUTS:
+# N, p, q - are common names for RSA, so allow it's use
+# pylint: disable=invalid-name
+ key_len, exponent, label, expected_N = data
+ test_name = 'RSA-KEYGEN:%d:%d:%s' % data[:-1]
+ cmd = _keygen_cmd(key_len, exponent, label)
+
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ result = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ result_len = len(result)
+ if result_len != int(key_len / 8 * 1.5):
+ raise subcmd.TpmTestError('%s error:%s' % (
+ test_name, utils.hex_dump(result)))
+
+ N = int(binascii.b2a_hex(result[0:result_len * 2 / 3]), 16)
+ if expected_N and N != expected_N:
+ raise subcmd.TpmTestError('%s error:%s' %
+ (test_name, utils.hex_dump(result)))
+ p = int(binascii.b2a_hex(result[result_len * 2 / 3:]), 16)
+ q = N / p
+ if not rsa.prime.is_prime(p):
+ raise subcmd.TpmTestError('%s error:%s' %
+ (test_name, utils.hex_dump(result)))
+ if not rsa.prime.is_prime(q):
+ raise subcmd.TpmTestError('%s error:%s' %
+ (test_name, utils.hex_dump(result)))
+ if p == q:
+ raise subcmd.TpmTestError('%s error:%s' %
+ (test_name, utils.hex_dump(result)))
+ print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def _primegen_tests(tpm):
- for data in _PRIMEGEN_INPUTS:
- key_len = data
- test_name = 'RSA-PRIMEGEN:%d' % data
- seed = rsa.randnum.read_random_bits(key_len / 2)
- assert len(seed) == key_len / 16
- # dcrypto interface is little-endian.
- cmd = _primegen_cmd(seed[::-1])
-
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- result = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- result_len = len(result)
- if result_len != key_len / 16:
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
-
- p = int(binascii.b2a_hex(result[::-1]), 16)
- if not rsa.prime.is_prime(p):
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
- calculated = _prime_from_seed(seed)
- if p != calculated:
- raise subcmd.TpmTestError('%s error:%s' % (
- test_name, utils.hex_dump(result)))
- print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
+ for data in _PRIMEGEN_INPUTS:
+ key_len = data
+ test_name = 'RSA-PRIMEGEN:%d' % data
+ seed = rsa.randnum.read_random_bits(key_len / 2)
+ assert len(seed) == key_len / 16
+ # dcrypto interface is little-endian.
+ cmd = _primegen_cmd(seed[::-1])
+
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ result = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ result_len = len(result)
+ if result_len != key_len / 16:
+ raise subcmd.TpmTestError('%s error:%s' % (
+ test_name, utils.hex_dump(result)))
+
+ prime = int(binascii.b2a_hex(result[::-1]), 16)
+ if not rsa.prime.is_prime(prime):
+ raise subcmd.TpmTestError('%s error:%s' % (
+ test_name, utils.hex_dump(result)))
+ calculated = _prime_from_seed(seed)
+ if prime != calculated:
+ raise subcmd.TpmTestError('%s error:%s' % (
+ test_name, utils.hex_dump(result)))
+ print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def _x509_verify_tests(tpm):
- test_name = 'RSA-X509-2048-VERIFY'
- cmd = _x509_verify_cmd(2048)
- wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
- valid = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
- expected = '\x01'
- if valid != expected:
- raise subcmd.TpmTestError('%s error:%s%s' % (
- test_name, utils.hex_dump(valid), utils.hex_dump(expected)))
- print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
+ test_name = 'RSA-X509-2048-VERIFY'
+ cmd = _x509_verify_cmd(2048)
+ wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.RSA, cmd))
+ valid = tpm.unwrap_ext_response(subcmd.RSA, wrapped_response)
+ expected = '\x01'
+ if valid != expected:
+ raise subcmd.TpmTestError('%s error:%s%s' % (
+ test_name, utils.hex_dump(valid), utils.hex_dump(expected)))
+ print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))
def rsa_test(tpm):
- _encrypt_tests(tpm)
- _sign_tests(tpm)
- _verify_tests(tpm)
- _keytest_tests(tpm)
- _keygen_tests(tpm)
- _primegen_tests(tpm)
- _x509_verify_tests(tpm)
+ """Run RSA tests"""
+ _encrypt_tests(tpm)
+ _sign_tests(tpm)
+ _verify_tests(tpm)
+ _keytest_tests(tpm)
+ _keygen_tests(tpm)
+ _primegen_tests(tpm)
+ _x509_verify_tests(tpm)