print "#include <stdio.h>" print '#include "mont.h"' print "" print "void mont_mult_internal(uint64_t *out, const uint64_t *a, const uint64_t *b, const uint64_t *n, uint64_t m0, uint64_t *t, size_t nw);" p256 = 115792089210356248762697446949407573530086143415290314195533631308867097853951 make_test(2, 3, 255) make_test(2, 240, 255) make_test(189, 240, 255) make_test(189, 240, 32984723984723984723847) make_test(189000000, 7878787878, 32984723984723984723847) make_test( 1890000003439483948394839843434, 78787878780003984834673498384734, 3298472398472398472384798743287438734875384758435834539400000033988787) for x in range(100): modulus_len = x // 10 + 5 # 40 bit .. 112 bits modulus = bin2int( sha256(b"modulus" + struct.pack(">I", x)).digest()[:-modulus_len]) | 1 a = bin2int(sha256(b"a" + struct.pack(">I", x)).digest()) % modulus b = bin2int(sha256(b"b" + struct.pack(">I", x)).digest()) % modulus make_test(a, b, modulus) for x in range(100): a = bin2int(sha256(b"a" + struct.pack(">I", x)).digest()) % p256 b = bin2int(sha256(b"b" + struct.pack(">I", x)).digest()) % p256 make_test(a, b, p256) make_main()
def make_limb(seed): result = bin2int(sha256(struct.pack(">I", seed)).digest()) & ((2**255) - 1) return result