Source code for signer.models

"""Contains Models For Signers App."""



from django.db import models
from django.utils.translation import gettext_lazy as _
from trustpoint_core import oid
from trustpoint_core.serializer import CredentialSerializer

from pki.models.credential import CredentialModel
from util.db import CustomDeleteActionModel


[docs] class SignerModel(CustomDeleteActionModel): """Contains fields for signer model."""
[docs] unique_name = models.CharField(max_length=30, unique=True)
[docs] credential = models.OneToOneField( CredentialModel, related_name='signer', on_delete=models.PROTECT, )
[docs] is_active = models.BooleanField( _('Active'), default=True, )
[docs] created_at = models.DateTimeField(verbose_name=_('Created'), auto_now_add=True)
[docs] updated_at = models.DateTimeField(verbose_name=_('Updated'), auto_now=True)
def __str__(self) -> str: """To represent the signer object with its unique name. Returns: Give out signer objects unique name. """ return self.unique_name @property
[docs] def common_name(self) -> str: """Returns common name.""" return self.credential.certificate_or_error.common_name
@property
[docs] def signature_suite(self) -> oid.SignatureSuite: """The signature suite for the CA public key certificate.""" return oid.SignatureSuite.from_certificate(self.credential.get_certificate_serializer().as_crypto())
@property
[docs] def public_key_info(self) -> oid.PublicKeyInfo: """The public key info for the CA certificate's public key.""" return self.signature_suite.public_key_info
@property
[docs] def hash_algorithm(self) -> str: """Returns the hash algorithm name used by this signer's certificate.""" if self.credential.hash_algorithm is None: return 'unknown' return self.credential.hash_algorithm.name
@classmethod
[docs] def create_new_signer( cls, unique_name: str, credential_serializer: CredentialSerializer, ) -> 'SignerModel': """Create a new SignerModel instance.""" credential_model = CredentialModel.save_credential_serializer( credential_serializer=credential_serializer, credential_type=CredentialModel.CredentialTypeChoice.SIGNER, ) signer = cls( unique_name=unique_name, credential=credential_model, ) signer.save() return signer
[docs] class SignedMessageModel(models.Model): """Model to store signed messages, its signature and certificate(with public key)."""
[docs] signer = models.ForeignKey(SignerModel, on_delete=models.CASCADE, related_name='signed_messages')
[docs] hash_value = models.CharField(max_length=256)
[docs] signature = models.TextField()
[docs] created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str: """String representation of SignedMessage object. Returns: String formated name of signer and when it was signed. """ return f'Signature by {self.signer.unique_name} on {self.created_at.strftime("%Y-%m-%d %H:%M:%S")}'