def _parse_ecc_ssleay(data): """ Parse binary structure of the old SSLeay file format used by OpenSSL. For ECDSA keys. """ private_key = SigningKey.from_der(compatHMAC(data)) secret_mult = private_key.privkey.secret_multiplier return Python_ECDSAKey(None, None, private_key.curve.name, secret_mult)
ec["publicKey"] = ec_rfc5915["publicKey"] p8["version"] = 0 p8["privateKeyAlgorithm"] = AlgorithmIdentifier() p8["privateKeyAlgorithm"]["algorithm"] = "1.2.840.10045.2.1" p8["privateKeyAlgorithm"]["parameters"] = ObjectIdentifier( ec_rfc5915["parameters"]) p8["privateKey"] = DER_Encode(ec) der = DER_Encode(p8) #print; dumpasn1(der) #print; dumpasn1(der_test_keys["ec_pkcs8"]) print print "Reencoded PKCS #8 {} static data".format( "matches" if der == der_test_keys["ec_pkcs8"] else "doesn't match") # Try doing same thing with ecdsa package ASN.1 utilities. sk = SigningKey.from_der(der_test_keys["ec_rfc5915"]) vk = ECDSA_DER.encode_bitstring("\x00\x04" + sk.get_verifying_key().to_string()) ec = ECDSA_DER.encode_sequence( ECDSA_DER.encode_integer(1), ECDSA_DER.encode_octet_string(sk.to_string()), ECDSA_DER.encode_constructed(1, vk)) p8 = ECDSA_DER.encode_sequence( ECDSA_DER.encode_integer(0), ECDSA_DER.encode_sequence(encoded_oid_ecPublicKey, sk.curve.encoded_oid), ECDSA_DER.encode_octet_string(ec)) print print "ECDSA-library PKCS #8 encoding {} pyasn1 PKCS #8 encoding".format( "matches" if p8 == der_test_keys["ec_pkcs8"] else "doesn't match")
def _parse_eddsa_private_key(data): """Parse a DER encoded EdDSA key.""" priv_key = SigningKey.from_der(data) return Python_EdDSAKey(priv_key.verifying_key, private_key=priv_key)