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