From e2e4ce45846440fe40b820b1894506465995a9b6 Mon Sep 17 00:00:00 2001 From: Viren Nadkarni Date: Fri, 31 May 2024 00:05:47 +0530 Subject: [PATCH] EC2: Fix inconsistent private/public key pair attribute (#7732) --- moto/ec2/models/key_pairs.py | 11 +++++++---- moto/ec2/utils.py | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/moto/ec2/models/key_pairs.py b/moto/ec2/models/key_pairs.py index 2d9b49b5861b..55cc3dc121e5 100644 --- a/moto/ec2/models/key_pairs.py +++ b/moto/ec2/models/key_pairs.py @@ -23,14 +23,16 @@ def __init__( self, name: str, fingerprint: str, - material: str, + material: Optional[str], + material_public: str, tags: Dict[str, str], ec2_backend: Any, ): self.id = random_key_pair_id() self.name = name - self.fingerprint = fingerprint - self.material = material + self.fingerprint = fingerprint # public key fingerprint + self.material = material # PEM encoded private key + self.material_public = material_public # public key in OpenSSH format self.create_time = utcnow() self.ec2_backend = ec2_backend self.add_tags(tags or {}) @@ -108,7 +110,8 @@ def import_key_pair( fingerprint = public_key_fingerprint(public_key) keypair = KeyPair( key_name, - material=public_key_material, + material_public=public_key_material, + material=None, fingerprint=fingerprint, tags=tags, ec2_backend=self, diff --git a/moto/ec2/utils.py b/moto/ec2/utils.py index 44d507c60eff..6387be29d3a7 100644 --- a/moto/ec2/utils.py +++ b/moto/ec2/utils.py @@ -569,11 +569,17 @@ def random_ed25519_key_pair() -> Dict[str, str]: format=serialization.PrivateFormat.OpenSSH, encryption_algorithm=serialization.NoEncryption(), ) - fingerprint = public_key_fingerprint(private_key.public_key()) + public_key = private_key.public_key() + public_key_material = public_key.public_bytes( + encoding=serialization.Encoding.OpenSSH, + format=serialization.PublicFormat.OpenSSH, + ) + fingerprint = public_key_fingerprint(public_key) return { "fingerprint": fingerprint, "material": private_key_material.decode("ascii"), + "material_public": public_key_material.decode("ascii"), } @@ -586,11 +592,17 @@ def random_rsa_key_pair() -> Dict[str, str]: format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption(), ) - fingerprint = public_key_fingerprint(private_key.public_key()) + public_key = private_key.public_key() + public_key_material = public_key.public_bytes( + encoding=serialization.Encoding.OpenSSH, + format=serialization.PublicFormat.OpenSSH, + ) + fingerprint = public_key_fingerprint(public_key) return { "fingerprint": fingerprint, "material": private_key_material.decode("ascii"), + "material_public": public_key_material.decode("ascii"), }