############################################################# # Problem 0: Find base point def GetCurveParameters(): # Certicom secp256-k1 # Hints: https://en.bitcoin.it/wiki/Secp256k1 _p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F _a = 0x0000000000000000000000000000000000000000000000000000000000000000 _b = 0x0000000000000000000000000000000000000000000000000000000000000007 _Gx = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF _Gy = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF _Gz = 0x0000000000000000000000000000000000000000000000000000000000000001 _n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 _h = 0x01 return _p, _a, _b, _Gx, _Gy, _Gz, _n, _h ############################################################# # Problem 1: Evaluate 4G def compute4G(G, callback_get_INFINITY): """Compute 4G""" """ Your code here """ result = callback_get_INFINITY() return result ############################################################# # Problem 2: Evaluate 5G def compute5G(G, callback_get_INFINITY): """Compute 5G""" """ Your code here """ result = callback_get_INFINITY() return result ############################################################# # Problem 3: Evaluate dG # Problem 4: Double-and-Add algorithm def double_and_add(n, point, callback_get_INFINITY): """Calculate n * point using the Double-and-Add algorithm.""" """ Your code here """ result = callback_get_INFINITY() num_doubles = 0 num_additions = 0 return result, num_doubles, num_additions ############################################################# # Problem 5: Optimized Double-and-Add algorithm def optimized_double_and_add(n, point, callback_get_INFINITY): """Optimized Double-and-Add algorithm that simplifies sequences of consecutive 1's.""" """ Your code here """ result = callback_get_INFINITY() num_doubles = 0 num_additions = 0 return result, num_doubles, num_additions ############################################################# # Problem 6: Sign a Bitcoin transaction with a random k and private key d def sign_transaction(private_key, hashID, callback_getG, callback_get_n, callback_randint): """Sign a bitcoin transaction using the private key.""" """ Your code here """ G = callback_getG() n = callback_get_n() signature = callback_randint() return signature ############################################################## # Step 7: Verify the digital signature with the public key Q def verify_signature(public_key, hashID, signature, callback_getG, callback_get_n, callback_get_INFINITY): """Verify the digital signature.""" """ Your code here """ G = callback_getG() n = callback_get_n() infinity_point = callback_get_INFINITY() is_valid_signature = TRUE if callback_get_n() > 0 else FALSE return is_valid_signature