aboutsummaryrefslogtreecommitdiff
path: root/tests/test-rsa.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-rsa.py')
-rw-r--r--tests/test-rsa.py118
1 files changed, 59 insertions, 59 deletions
diff --git a/tests/test-rsa.py b/tests/test-rsa.py
index d0538ed..39f46cd 100644
--- a/tests/test-rsa.py
+++ b/tests/test-rsa.py
@@ -45,10 +45,10 @@ from textwrap import TextWrapper
import sys, os.path
def KeyLengthType(arg):
- val = int(arg)
- if val % 8 != 0:
- raise ValueError
- return val
+ val = int(arg)
+ if val % 8 != 0:
+ raise ValueError
+ return val
parser = ArgumentParser(description = __doc__)
parser.add_argument("--pad-to-modulus", action = "store_true",
@@ -71,22 +71,22 @@ scriptname = os.path.basename(sys.argv[0])
wrapper = TextWrapper(width = 78, initial_indent = " " * 2, subsequent_indent = " " * 2)
def printlines(*lines, **kwargs):
- for line in lines:
- args.output.write(line.format(**kwargs) + "\n")
+ for line in lines:
+ args.output.write(line.format(**kwargs) + "\n")
def trailing_comma(item, sequence):
- return "" if item == sequence[-1] else ","
+ return "" if item == sequence[-1] else ","
def print_hex(name, value, comment):
- value = hexlify(value).decode("ascii")
- printlines("static const uint8_t {name}[] = {{ /* {comment}, {length:d} bytes */",
- wrapper.fill(", ".join("0x" + value[i : i + 2] for i in range(0, len(value), 2)))
- "}};", "",
- name = name, comment = comment, length = len(value))
+ value = hexlify(value).decode("ascii")
+ printlines("static const uint8_t {name}[] = {{ /* {comment}, {length:d} bytes */",
+ wrapper.fill(", ".join("0x" + value[i : i + 2] for i in range(0, len(value), 2)))
+ "}};", "",
+ name = name, comment = comment, length = len(value))
def pad_to_blocksize(value, blocksize):
- extra = len(value) % blocksize
- return value if extra == 0 else (b"\x00" * (blocksize - extra)) + value
+ extra = len(value) % blocksize
+ return value if extra == 0 else (b"\x00" * (blocksize - extra)) + value
# Funnily enough, PyCrypto and Cryptlib use exactly the same names for
# RSA key components, see Cryptlib documentation pages 186-187 & 339.
@@ -109,48 +109,48 @@ fields = ("n", "e", "d", "p", "q", "dP", "dQ", "u", "m", "s")
for k_len in args.key_lengths:
- k = RSA.generate(k_len) # Cryptlib insists u < p, probably with good reason,
- while k.u >= k.p: # and I'm sure not going to argue the math with Peter,
- k = RSA.generate(k_len) # so keep trying until we pass this test
-
- m = EMSA_PKCS1_V1_5_ENCODE(h, k_len/8)
- s = PKCS115_SigScheme(k).sign(h)
- assert len(m) == len(s)
-
- if args.pad_to_modulus:
- blocksize = k_len/8
- if args.extra_word:
- blocksize += 4
- else:
- blocksize = 4
-
- printlines("/* {k_len:d}-bit RSA private key (PKCS #{pkcs:d})",
- k.exportKey(format = "PEM", pkcs = args.pkcs_encoding),
- "*/", "",
- k_len = k_len, pkcs = args.pkcs_encoding)
-
- # PyCrypto doesn't precalculate dP or dQ, and for some reason it
- # does u backwards (uses (1/p % q) and swaps the roles of p and q in
- # the CRT calculation to compensate), so we just calculate our own.
-
- for name in fields:
- if name in "ms":
- continue
- elif name == "dP":
- value = k.d % (k.p - 1)
- elif name == "dQ":
- value = k.d % (k.q - 1)
- elif name == "u":
- value = inverse(k.q, k.p)
- else:
- value = getattr(k, name)
+ k = RSA.generate(k_len) # Cryptlib insists u < p, probably with good reason,
+ while k.u >= k.p: # and I'm sure not going to argue the math with Peter,
+ k = RSA.generate(k_len) # so keep trying until we pass this test
- print_hex("{}_{:d}".format(name, k_len),
- long_to_bytes(value, blocksize = blocksize),
- "key component {}".format(name))
+ m = EMSA_PKCS1_V1_5_ENCODE(h, k_len/8)
+ s = PKCS115_SigScheme(k).sign(h)
+ assert len(m) == len(s)
- print_hex("m_{:d}".format(k_len), pad_to_blocksize(m, blocksize), "message to be signed")
- print_hex("s_{:d}".format(k_len), pad_to_blocksize(s, blocksize), "signed message")
+ if args.pad_to_modulus:
+ blocksize = k_len/8
+ if args.extra_word:
+ blocksize += 4
+ else:
+ blocksize = 4
+
+ printlines("/* {k_len:d}-bit RSA private key (PKCS #{pkcs:d})",
+ k.exportKey(format = "PEM", pkcs = args.pkcs_encoding),
+ "*/", "",
+ k_len = k_len, pkcs = args.pkcs_encoding)
+
+ # PyCrypto doesn't precalculate dP or dQ, and for some reason it
+ # does u backwards (uses (1/p % q) and swaps the roles of p and q in
+ # the CRT calculation to compensate), so we just calculate our own.
+
+ for name in fields:
+ if name in "ms":
+ continue
+ elif name == "dP":
+ value = k.d % (k.p - 1)
+ elif name == "dQ":
+ value = k.d % (k.q - 1)
+ elif name == "u":
+ value = inverse(k.q, k.p)
+ else:
+ value = getattr(k, name)
+
+ print_hex("{}_{:d}".format(name, k_len),
+ long_to_bytes(value, blocksize = blocksize),
+ "key component {}".format(name))
+
+ print_hex("m_{:d}".format(k_len), pad_to_blocksize(m, blocksize), "message to be signed")
+ print_hex("s_{:d}".format(k_len), pad_to_blocksize(s, blocksize), "signed message")
printlines("typedef struct {{ const uint8_t *val; size_t len; }} rsa_tc_bn_t;",
"typedef struct {{ size_t size; rsa_tc_bn_t {fields}; }} rsa_tc_t;",
@@ -158,9 +158,9 @@ printlines("typedef struct {{ const uint8_t *val; size_t len; }} rsa_tc_bn_t;",
"static const rsa_tc_t rsa_tc[] = {{",
fields = ", ".join(fields))
for k_len in args.key_lengths:
- printlines(" {{ {k_len:d},", k_len = k_len)
- for field in fields:
- printlines(" {{ {field}_{k_len:d}, sizeof({field}_{k_len:d}) }}{comma}",
- field = field, k_len = k_len, comma = trailing_comma(field, fields))
- printlines(" }}{comma}", comma = trailing_comma(k_len, args.key_lengths))
+ printlines(" {{ {k_len:d},", k_len = k_len)
+ for field in fields:
+ printlines(" {{ {field}_{k_len:d}, sizeof({field}_{k_len:d}) }}{comma}",
+ field = field, k_len = k_len, comma = trailing_comma(field, fields))
+ printlines(" }}{comma}", comma = trailing_comma(k_len, args.key_lengths))
printlines("}};")