Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/jose/backends/_asn1.py: 36%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""ASN1 encoding helpers for converting between PKCS1 and PKCS8.
3Required by rsa_backend but not cryptography_backend.
4"""
6from pyasn1.codec.der import decoder, encoder
7from pyasn1.type import namedtype, univ
9RSA_ENCRYPTION_ASN1_OID = "1.2.840.113549.1.1.1"
12class RsaAlgorithmIdentifier(univ.Sequence):
13 """ASN1 structure for recording RSA PrivateKeyAlgorithm identifiers."""
15 componentType = namedtype.NamedTypes(
16 namedtype.NamedType("rsaEncryption", univ.ObjectIdentifier()), namedtype.NamedType("parameters", univ.Null())
17 )
20class PKCS8PrivateKey(univ.Sequence):
21 """ASN1 structure for recording PKCS8 private keys."""
23 componentType = namedtype.NamedTypes(
24 namedtype.NamedType("version", univ.Integer()),
25 namedtype.NamedType("privateKeyAlgorithm", RsaAlgorithmIdentifier()),
26 namedtype.NamedType("privateKey", univ.OctetString()),
27 )
30class PublicKeyInfo(univ.Sequence):
31 """ASN1 structure for recording PKCS8 public keys."""
33 componentType = namedtype.NamedTypes(
34 namedtype.NamedType("algorithm", RsaAlgorithmIdentifier()), namedtype.NamedType("publicKey", univ.BitString())
35 )
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())
42 try:
43 decoded_key = decoded_values[0]
44 except IndexError:
45 raise ValueError("Invalid private key encoding")
47 return decoded_key["privateKey"]
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
55 pkcs8_key = PKCS8PrivateKey()
56 pkcs8_key["version"] = 0
57 pkcs8_key["privateKeyAlgorithm"] = algorithm
58 pkcs8_key["privateKey"] = pkcs1_key
60 return encoder.encode(pkcs8_key)
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
68 pkcs8_key = PublicKeyInfo()
69 pkcs8_key["algorithm"] = algorithm
70 pkcs8_key["publicKey"] = univ.BitString.fromOctetString(pkcs1_key)
72 return encoder.encode(pkcs8_key)
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())
79 try:
80 decoded_key = decoded_values[0]
81 except IndexError:
82 raise ValueError("Invalid public key encoding.")
84 return decoded_key["publicKey"].asOctets()