KMS: Add RSASSA_PKCS1_V1_5_SHA_256, 384, 512
signing algorithms (#6729)
This commit is contained in:
parent
fedca69991
commit
866c28a309
@ -11,6 +11,7 @@ from cryptography.exceptions import InvalidSignature
|
|||||||
from cryptography.hazmat.backends import default_backend
|
from cryptography.hazmat.backends import default_backend
|
||||||
from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
|
from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
|
||||||
from cryptography.hazmat.primitives import hashes, serialization
|
from cryptography.hazmat.primitives import hashes, serialization
|
||||||
|
from cryptography.hazmat.primitives._asymmetric import AsymmetricPadding
|
||||||
from cryptography.hazmat.primitives.asymmetric import rsa, padding
|
from cryptography.hazmat.primitives.asymmetric import rsa, padding
|
||||||
|
|
||||||
|
|
||||||
@ -181,52 +182,50 @@ class RSAPrivateKey(AbstractPrivateKey):
|
|||||||
public_exponent=65537, key_size=self.key_size
|
public_exponent=65537, key_size=self.key_size
|
||||||
)
|
)
|
||||||
|
|
||||||
def sign(self, message: bytes, signing_algorithm: str) -> bytes:
|
def __padding_and_hash_algorithm(
|
||||||
validate_signing_algorithm(
|
self, signing_algorithm: str
|
||||||
signing_algorithm, SigningAlgorithm.rsa_signing_algorithms()
|
) -> Tuple[AsymmetricPadding, hashes.HashAlgorithm]:
|
||||||
)
|
|
||||||
|
|
||||||
if signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_256:
|
if signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_256:
|
||||||
pad = padding.PSS(
|
pad = padding.PSS(
|
||||||
mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH
|
mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH
|
||||||
)
|
) # type: AsymmetricPadding
|
||||||
algorithm = hashes.SHA256() # type: Any
|
algorithm = hashes.SHA256() # type: Any
|
||||||
elif signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_384:
|
elif signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_384:
|
||||||
pad = padding.PSS(
|
pad = padding.PSS(
|
||||||
mgf=padding.MGF1(hashes.SHA384()), salt_length=padding.PSS.MAX_LENGTH
|
mgf=padding.MGF1(hashes.SHA384()), salt_length=padding.PSS.MAX_LENGTH
|
||||||
)
|
)
|
||||||
algorithm = hashes.SHA384()
|
algorithm = hashes.SHA384()
|
||||||
else:
|
elif signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_512:
|
||||||
pad = padding.PSS(
|
pad = padding.PSS(
|
||||||
mgf=padding.MGF1(hashes.SHA512()), salt_length=padding.PSS.MAX_LENGTH
|
mgf=padding.MGF1(hashes.SHA512()), salt_length=padding.PSS.MAX_LENGTH
|
||||||
)
|
)
|
||||||
algorithm = hashes.SHA512()
|
algorithm = hashes.SHA512()
|
||||||
return self.private_key.sign(message, pad, algorithm)
|
elif signing_algorithm == SigningAlgorithm.RSASSA_PKCS1_V1_5_SHA_256:
|
||||||
|
pad = padding.PKCS1v15()
|
||||||
|
algorithm = hashes.SHA256()
|
||||||
|
elif signing_algorithm == SigningAlgorithm.RSASSA_PKCS1_V1_5_SHA_384:
|
||||||
|
pad = padding.PKCS1v15()
|
||||||
|
algorithm = hashes.SHA384()
|
||||||
|
else:
|
||||||
|
pad = padding.PKCS1v15()
|
||||||
|
algorithm = hashes.SHA512()
|
||||||
|
return pad, algorithm
|
||||||
|
|
||||||
|
def sign(self, message: bytes, signing_algorithm: str) -> bytes:
|
||||||
|
validate_signing_algorithm(
|
||||||
|
signing_algorithm, SigningAlgorithm.rsa_signing_algorithms()
|
||||||
|
)
|
||||||
|
pad, hash_algorithm = self.__padding_and_hash_algorithm(signing_algorithm)
|
||||||
|
return self.private_key.sign(message, pad, hash_algorithm)
|
||||||
|
|
||||||
def verify(self, message: bytes, signature: bytes, signing_algorithm: str) -> bool:
|
def verify(self, message: bytes, signature: bytes, signing_algorithm: str) -> bool:
|
||||||
validate_signing_algorithm(
|
validate_signing_algorithm(
|
||||||
signing_algorithm, SigningAlgorithm.rsa_signing_algorithms()
|
signing_algorithm, SigningAlgorithm.rsa_signing_algorithms()
|
||||||
)
|
)
|
||||||
|
pad, hash_algorithm = self.__padding_and_hash_algorithm(signing_algorithm)
|
||||||
if signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_256:
|
|
||||||
pad = padding.PSS(
|
|
||||||
mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH
|
|
||||||
)
|
|
||||||
algorithm = hashes.SHA256() # type: Any
|
|
||||||
elif signing_algorithm == SigningAlgorithm.RSASSA_PSS_SHA_384:
|
|
||||||
pad = padding.PSS(
|
|
||||||
mgf=padding.MGF1(hashes.SHA384()), salt_length=padding.PSS.MAX_LENGTH
|
|
||||||
)
|
|
||||||
algorithm = hashes.SHA384()
|
|
||||||
else:
|
|
||||||
pad = padding.PSS(
|
|
||||||
mgf=padding.MGF1(hashes.SHA512()), salt_length=padding.PSS.MAX_LENGTH
|
|
||||||
)
|
|
||||||
algorithm = hashes.SHA512()
|
|
||||||
|
|
||||||
public_key = self.private_key.public_key()
|
public_key = self.private_key.public_key()
|
||||||
try:
|
try:
|
||||||
public_key.verify(signature, message, pad, algorithm)
|
public_key.verify(signature, message, pad, hash_algorithm)
|
||||||
return True
|
return True
|
||||||
except InvalidSignature:
|
except InvalidSignature:
|
||||||
return False
|
return False
|
||||||
|
@ -1170,7 +1170,14 @@ def test_sign_and_verify_ignoring_grant_tokens():
|
|||||||
list(
|
list(
|
||||||
itertools.product(
|
itertools.product(
|
||||||
["RSA_2048", "RSA_3072", "RSA_4096"],
|
["RSA_2048", "RSA_3072", "RSA_4096"],
|
||||||
["RSASSA_PSS_SHA_256", "RSASSA_PSS_SHA_384", "RSASSA_PSS_SHA_512"],
|
[
|
||||||
|
"RSASSA_PSS_SHA_256",
|
||||||
|
"RSASSA_PSS_SHA_384",
|
||||||
|
"RSASSA_PSS_SHA_512",
|
||||||
|
"RSASSA_PKCS1_V1_5_SHA_256",
|
||||||
|
"RSASSA_PKCS1_V1_5_SHA_384",
|
||||||
|
"RSASSA_PKCS1_V1_5_SHA_512",
|
||||||
|
],
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user