moto/moto/signer/models.py
2023-11-30 14:55:51 -01:00

216 lines
7.6 KiB
Python

from typing import Any, Dict, List, Optional
from moto.core import BackendDict, BaseBackend, BaseModel
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService
class SigningProfile(BaseModel):
def __init__(
self,
backend: "SignerBackend",
name: str,
platform_id: str,
signing_material: Dict[str, str],
signature_validity_period: Optional[Dict[str, Any]],
):
self.name = name
self.platform_id = platform_id
self.signature_validity_period = signature_validity_period or {
"value": 135,
"type": "MONTHS",
}
self.backend = backend
self.status = "Active"
self.arn = f"arn:aws:signer:{backend.region_name}:{backend.account_id}:/signing-profiles/{name}"
self.profile_version = mock_random.get_random_hex(10)
self.profile_version_arn = f"{self.arn}/{self.profile_version}"
self.signing_material = signing_material
def cancel(self) -> None:
self.status = "Canceled"
def to_dict(self, full: bool = True) -> Dict[str, Any]:
small: Dict[str, Any] = {
"arn": self.arn,
"profileVersion": self.profile_version,
"profileVersionArn": self.profile_version_arn,
}
if full:
small.update(
{
"status": self.status,
"profileName": self.name,
"platformId": self.platform_id,
"signatureValidityPeriod": self.signature_validity_period,
"signingMaterial": self.signing_material,
"platformDisplayName": next(
(
p["displayName"]
for p in SignerBackend.platforms
if p["platformId"] == self.platform_id
),
None,
),
}
)
tags = self.backend.list_tags_for_resource(self.arn)
if tags:
small.update({"tags": tags})
return small
class SignerBackend(BaseBackend):
"""Implementation of signer APIs."""
platforms = [
{
"platformId": "AWSIoTDeviceManagement-SHA256-ECDSA",
"displayName": "AWS IoT Device Management SHA256-ECDSA ",
"partner": "AWSIoTDeviceManagement",
"target": "SHA256-ECDSA",
"category": "AWS",
"signingConfiguration": {
"encryptionAlgorithmOptions": {
"allowedValues": ["ECDSA"],
"defaultValue": "ECDSA",
},
"hashAlgorithmOptions": {
"allowedValues": ["SHA256"],
"defaultValue": "SHA256",
},
},
"signingImageFormat": {
"supportedFormats": ["JSONDetached"],
"defaultFormat": "JSONDetached",
},
"maxSizeInMB": 2048,
"revocationSupported": False,
},
{
"platformId": "AWSLambda-SHA384-ECDSA",
"displayName": "AWS Lambda",
"partner": "AWSLambda",
"target": "SHA384-ECDSA",
"category": "AWS",
"signingConfiguration": {
"encryptionAlgorithmOptions": {
"allowedValues": ["ECDSA"],
"defaultValue": "ECDSA",
},
"hashAlgorithmOptions": {
"allowedValues": ["SHA384"],
"defaultValue": "SHA384",
},
},
"signingImageFormat": {
"supportedFormats": ["JSONDetached"],
"defaultFormat": "JSONDetached",
},
"maxSizeInMB": 250,
"revocationSupported": True,
},
{
"platformId": "AmazonFreeRTOS-TI-CC3220SF",
"displayName": "Amazon FreeRTOS SHA1-RSA CC3220SF-Format",
"partner": "AmazonFreeRTOS",
"target": "SHA1-RSA-TISHA1",
"category": "AWS",
"signingConfiguration": {
"encryptionAlgorithmOptions": {
"allowedValues": ["RSA"],
"defaultValue": "RSA",
},
"hashAlgorithmOptions": {
"allowedValues": ["SHA1"],
"defaultValue": "SHA1",
},
},
"signingImageFormat": {
"supportedFormats": ["JSONEmbedded"],
"defaultFormat": "JSONEmbedded",
},
"maxSizeInMB": 16,
"revocationSupported": False,
},
{
"platformId": "AmazonFreeRTOS-Default",
"displayName": "Amazon FreeRTOS SHA256-ECDSA",
"partner": "AmazonFreeRTOS",
"target": "SHA256-ECDSA",
"category": "AWS",
"signingConfiguration": {
"encryptionAlgorithmOptions": {
"allowedValues": ["ECDSA", "RSA"],
"defaultValue": "ECDSA",
},
"hashAlgorithmOptions": {
"allowedValues": ["SHA256"],
"defaultValue": "SHA256",
},
},
"signingImageFormat": {
"supportedFormats": ["JSONEmbedded"],
"defaultFormat": "JSONEmbedded",
},
"maxSizeInMB": 16,
"revocationSupported": False,
},
]
def __init__(self, region_name: str, account_id: str):
super().__init__(region_name, account_id)
self.signing_profiles: Dict[str, SigningProfile] = dict()
self.tagger = TaggingService()
def cancel_signing_profile(self, profile_name: str) -> None:
self.signing_profiles[profile_name].cancel()
def get_signing_profile(self, profile_name: str) -> SigningProfile:
return self.signing_profiles[profile_name]
def put_signing_profile(
self,
profile_name: str,
signature_validity_period: Optional[Dict[str, Any]],
platform_id: str,
signing_material: Dict[str, str],
tags: Dict[str, str],
) -> SigningProfile:
"""
The following parameters are not yet implemented: Overrides, SigningParameters
"""
profile = SigningProfile(
backend=self,
name=profile_name,
platform_id=platform_id,
signing_material=signing_material,
signature_validity_period=signature_validity_period,
)
self.signing_profiles[profile_name] = profile
self.tag_resource(profile.arn, tags)
return profile
def list_signing_platforms(self) -> List[Dict[str, Any]]:
"""
Pagination is not yet implemented. The parameters category, partner, target are not yet implemented
"""
return SignerBackend.platforms
def list_tags_for_resource(self, resource_arn: str) -> Dict[str, str]:
return self.tagger.get_tag_dict_for_resource(resource_arn)
def tag_resource(self, resource_arn: str, tags: Dict[str, str]) -> None:
self.tagger.tag_resource(
resource_arn, TaggingService.convert_dict_to_tags_input(tags)
)
def untag_resource(self, resource_arn: str, tag_keys: List[str]) -> None:
self.tagger.untag_resource_using_names(resource_arn, tag_keys)
# Using the lambda-regions
# boto3.Session().get_available_regions("signer") still returns an empty list
signer_backends = BackendDict(SignerBackend, "lambda")