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

39 statements  

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()