_asn1.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. """ASN1 encoding helpers for converting between PKCS1 and PKCS8.
  2. Required by rsa_backend but not cryptography_backend.
  3. """
  4. from pyasn1.codec.der import decoder, encoder
  5. from pyasn1.type import namedtype, univ
  6. RSA_ENCRYPTION_ASN1_OID = "1.2.840.113549.1.1.1"
  7. class RsaAlgorithmIdentifier(univ.Sequence):
  8. """ASN1 structure for recording RSA PrivateKeyAlgorithm identifiers."""
  9. componentType = namedtype.NamedTypes(
  10. namedtype.NamedType("rsaEncryption", univ.ObjectIdentifier()), namedtype.NamedType("parameters", univ.Null())
  11. )
  12. class PKCS8PrivateKey(univ.Sequence):
  13. """ASN1 structure for recording PKCS8 private keys."""
  14. componentType = namedtype.NamedTypes(
  15. namedtype.NamedType("version", univ.Integer()),
  16. namedtype.NamedType("privateKeyAlgorithm", RsaAlgorithmIdentifier()),
  17. namedtype.NamedType("privateKey", univ.OctetString()),
  18. )
  19. class PublicKeyInfo(univ.Sequence):
  20. """ASN1 structure for recording PKCS8 public keys."""
  21. componentType = namedtype.NamedTypes(
  22. namedtype.NamedType("algorithm", RsaAlgorithmIdentifier()), namedtype.NamedType("publicKey", univ.BitString())
  23. )
  24. def rsa_private_key_pkcs8_to_pkcs1(pkcs8_key):
  25. """Convert a PKCS8-encoded RSA private key to PKCS1."""
  26. decoded_values = decoder.decode(pkcs8_key, asn1Spec=PKCS8PrivateKey())
  27. try:
  28. decoded_key = decoded_values[0]
  29. except IndexError:
  30. raise ValueError("Invalid private key encoding")
  31. return decoded_key["privateKey"]
  32. def rsa_private_key_pkcs1_to_pkcs8(pkcs1_key):
  33. """Convert a PKCS1-encoded RSA private key to PKCS8."""
  34. algorithm = RsaAlgorithmIdentifier()
  35. algorithm["rsaEncryption"] = RSA_ENCRYPTION_ASN1_OID
  36. pkcs8_key = PKCS8PrivateKey()
  37. pkcs8_key["version"] = 0
  38. pkcs8_key["privateKeyAlgorithm"] = algorithm
  39. pkcs8_key["privateKey"] = pkcs1_key
  40. return encoder.encode(pkcs8_key)
  41. def rsa_public_key_pkcs1_to_pkcs8(pkcs1_key):
  42. """Convert a PKCS1-encoded RSA private key to PKCS8."""
  43. algorithm = RsaAlgorithmIdentifier()
  44. algorithm["rsaEncryption"] = RSA_ENCRYPTION_ASN1_OID
  45. pkcs8_key = PublicKeyInfo()
  46. pkcs8_key["algorithm"] = algorithm
  47. pkcs8_key["publicKey"] = univ.BitString.fromOctetString(pkcs1_key)
  48. return encoder.encode(pkcs8_key)
  49. def rsa_public_key_pkcs8_to_pkcs1(pkcs8_key):
  50. """Convert a PKCS8-encoded RSA private key to PKCS1."""
  51. decoded_values = decoder.decode(pkcs8_key, asn1Spec=PublicKeyInfo())
  52. try:
  53. decoded_key = decoded_values[0]
  54. except IndexError:
  55. raise ValueError("Invalid public key encoding.")
  56. return decoded_key["publicKey"].asOctets()