Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
with self.subTest(msg='decode', data=data):
decoded_value = der_decode(data)
self.assertEqual(decoded_value, value)
self.assertEqual(hash(decoded_value), hash(value))
self.assertEqual(repr(decoded_value), repr(value))
self.assertEqual(str(decoded_value), str(value))
for cls, args in self.encode_errors:
with self.subTest(msg='encode error', cls=cls.__name__, args=args):
with self.assertRaises(ASN1EncodeError):
der_encode(cls(*args))
for data in self.decode_errors:
with self.subTest(msg='decode error', data=data):
with self.assertRaises(ASN1DecodeError):
der_decode(codecs.decode(data, 'hex'))
raise ASN1DecodeError('Incomplete data')
length = data[offset]
offset += 1
if length > 0x80:
len_size = length & 0x7f
length = int.from_bytes(data[offset:offset+len_size], 'big')
offset += len_size
elif length == 0x80:
raise ASN1DecodeError('Indefinite length not allowed')
if offset+length > len(data):
raise ASN1DecodeError('Incomplete data')
if not partial_ok and offset+length < len(data):
raise ASN1DecodeError('Data contains unexpected bytes at end')
if asn1_class == UNIVERSAL and tag in _der_class_by_tag:
cls = _der_class_by_tag[tag]
value = cls.decode(constructed, data[offset:offset+length])
elif constructed:
value = TaggedDERObject(tag, der_decode(data[offset:offset+length]),
asn1_class)
else:
value = RawDERObject(tag, data[offset:offset+length], asn1_class)
if partial_ok:
return value, offset+length
else:
return value
def decode(cls, constructed, content):
"""Decode a DER UTF-8 string"""
if constructed:
raise ASN1DecodeError('UTF8 STRING should not be constructed')
return content.decode('utf-8')
def decode_pkcs8_private(cls, alg_params, data):
"""Decode a PKCS#8 format EC private key"""
try:
key_data = der_decode(data)
except ASN1DecodeError:
key_data = None
if (isinstance(key_data, tuple) and len(key_data) > 1 and
key_data[0] == 1 and isinstance(key_data[1], bytes)):
private_key = key_data[1]
if (len(key_data) > 2 and
isinstance(key_data[2], TaggedDERObject) and
key_data[2].tag == 1 and
isinstance(key_data[2].value, BitString) and
key_data[2].value.unused == 0):
public_key = key_data[2].value.value
else:
public_key = None
return cls._lookup_curve(alg_params), private_key, public_key
not isinstance(data, bytes)):
raise KeyEncryptionError('Invalid PKCS#8 encrypted key format')
alg, params = alg_params
if alg == _ES2:
cipher = _pbes2(params, passphrase)
elif alg in _pkcs8_handler:
handler, hash_alg, cipher_name = _pkcs8_handler[alg]
cipher = handler(params, passphrase, hash_alg, cipher_name)
else:
raise KeyEncryptionError('Unknown PKCS#8 encryption algorithm')
try:
return der_decode(cipher.decrypt(data))
except (ASN1DecodeError, UnicodeDecodeError):
raise KeyEncryptionError('Invalid PKCS#8 encrypted key data')
def decode(cls, constructed, content):
"""Decode a DER null value"""
if constructed:
raise ASN1DecodeError('NULL should not be constructed')
if content:
raise ASN1DecodeError('NULL should not have associated content')
return None
def decode(cls, constructed, content):
"""Decode a sequence of DER values"""
if not constructed:
raise ASN1DecodeError('SEQUENCE should always be constructed')
offset = 0
length = len(content)
value = []
while offset < length:
item, consumed = der_decode(content[offset:], partial_ok=True)
value.append(item)
offset += consumed
return tuple(value)
def decode_pkcs8_private(cls, alg_params, data):
"""Decode a PKCS#8 format EdDSA private key"""
# pylint: disable=unused-argument
try:
return (der_decode(data),)
except ASN1DecodeError:
return None
def decode_pkcs8_private(cls, alg_params, data):
"""Decode a PKCS#8 format RSA private key"""
if alg_params is not None:
return None
try:
key_data = der_decode(data)
except ASN1DecodeError:
return None
return cls.decode_pkcs1_private(key_data)
def _decode_pem_public(pem_name, data):
"""Decode a PEM format public key"""
try:
key_data = der_decode(data)
except ASN1DecodeError:
raise KeyImportError('Invalid PEM public key') from None
if pem_name:
return _decode_pkcs1_public(pem_name, key_data)
else:
return _decode_pkcs8_public(key_data)