def test_payload_nojson(): key = bitjws.PrivateKey() # Use a payload that is not JSON encoded. ser = json.loads(bitjws.multisig_sign_serialize([key])) ser['payload'] = bitjws.base64url_encode(b'test').decode('utf8') # Sign the new payload. signdata = '{}.{}'.format(ser['signatures'][0]['protected'], ser['payload']) sig = bitjws.ALGORITHM_AVAILABLE['CUSTOM-BITCOIN-SIGN'].sign(key, signdata) sig64 = bitjws.base64url_encode(sig).decode('utf8') ser['signatures'][0]['signature'] = sig64 serenc = json.dumps(ser) with pytest.raises(bitjws.InvalidMessage): # The new payload was not JSON encoded, so it cannot be # decoded as that. bitjws.multisig_validate_deserialize(serenc) # But we can get its raw value. headers, payload = bitjws.multisig_validate_deserialize( serenc, decode_payload=False) assert len(headers) == 1 assert payload == b'test'
def test_payload_nojson(): key = bitjws.PrivateKey() # Use a payload that is not JSON encoded. ser = json.loads(bitjws.multisig_sign_serialize([key])) ser['payload'] = bitjws.base64url_encode(b'test').decode('utf8') # Sign the new payload. signdata = '{}.{}'.format(ser['signatures'][0]['protected'], ser['payload']) sig = bitjws.ALGORITHM_AVAILABLE['CUSTOM-BITCOIN-SIGN'].sign( key, signdata) sig64 = bitjws.base64url_encode(sig).decode('utf8') ser['signatures'][0]['signature'] = sig64 serenc = json.dumps(ser) with pytest.raises(bitjws.InvalidMessage): # The new payload was not JSON encoded, so it cannot be # decoded as that. bitjws.multisig_validate_deserialize(serenc) # But we can get its raw value. headers, payload = bitjws.multisig_validate_deserialize(serenc, decode_payload=False) assert len(headers) == 1 assert payload == b'test'
def test_bad_signature(): wif = 'L2Ai1TBwKfyPshmqosKRBvJ47qUCDKesfZXh2zLoYoB7NHgdPS6d' key = bitjws.PrivateKey(bitjws.wif_to_privkey(wif)) assert bitjws.privkey_to_wif(key.private_key) == wif ser = bitjws.sign_serialize(key) # Drop the last byte from the signature. ser = ser[:-1] with pytest.raises(bitjws.jws.InvalidMessage): # It will fail to decode as base64 due to padding. bitjws.validate_deserialize(ser) # Drop another byte. ser = ser[:-1] with pytest.raises(bitjws.jws.InvalidMessage): # Although it can be decoded now, the length is incorrect. bitjws.validate_deserialize(ser) # Replace the signature by something that has the correct # length before decoding but becomes invalid after it. dummy = bitjws.base64url_encode(b'a' * 88) ser = ser[:ser.rfind('.')] + '.' + dummy.decode('utf8') with pytest.raises(bitjws.jws.InvalidMessage): # Now it fails because the dummy signature above produces # 66 bytes (instead of 65) after being decoded. bitjws.validate_deserialize(ser)
def test_multisig_invalidsig(): key = bitjws.PrivateKey() ser = bitjws.multisig_sign_serialize([key]) assert all(bitjws.multisig_validate_deserialize(ser)) serobj = json.loads(ser) dummy = bitjws.base64url_encode(b'a' * 88) serobj['signatures'][0]['signature'] = dummy.decode('utf8') ser = json.dumps(serobj) with pytest.raises(bitjws.jws.InvalidMessage): # Invalid signature length. bitjws.multisig_validate_deserialize(ser)
def test_payload_nojson(): key = bitjws.PrivateKey() ser = bitjws.sign_serialize(key) header64 = ser.split('.')[0] # Sign a new payload, 'test' new_payload = bitjws.base64url_encode(b'test').decode('utf8') signdata = '{}.{}'.format(header64, new_payload) sig = bitjws.ALGORITHM_AVAILABLE['CUSTOM-BITCOIN-SIGN'].sign( key, signdata) sig64 = bitjws.base64url_encode(sig).decode('utf8') new = '{}.{}'.format(signdata, sig64) with pytest.raises(bitjws.InvalidMessage): # The new payload was not JSON encoded, so it cannot be # decoded as that. bitjws.validate_deserialize(new) # But we can get its raw value. header, payload = bitjws.validate_deserialize(new, decode_payload=False) assert header is not None assert payload == b'test'
def _encode_header(newheader, origraw): mod = bitjws.base64url_encode(json.dumps(newheader).encode('utf8')) result = mod.decode('utf8') + origraw[origraw.find('.'):] return result