48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""Crypto API Views"""
|
|
from cryptography.hazmat.backends import default_backend
|
|
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
|
from cryptography.x509 import load_pem_x509_certificate
|
|
from rest_framework.serializers import ModelSerializer, ValidationError
|
|
from rest_framework.viewsets import ModelViewSet
|
|
|
|
from passbook.crypto.models import CertificateKeyPair
|
|
|
|
|
|
class CertificateKeyPairSerializer(ModelSerializer):
|
|
"""CertificateKeyPair Serializer"""
|
|
|
|
def validate_certificate_data(self, value):
|
|
"""Verify that input is a valid PEM x509 Certificate"""
|
|
try:
|
|
load_pem_x509_certificate(value.encode("utf-8"), default_backend())
|
|
except ValueError:
|
|
raise ValidationError("Unable to load certificate.")
|
|
return value
|
|
|
|
def validate_key_data(self, value):
|
|
"""Verify that input is a valid PEM RSA Key"""
|
|
# Since this field is optional, data can be empty.
|
|
if value == "":
|
|
return value
|
|
try:
|
|
load_pem_private_key(
|
|
str.encode("\n".join([x.strip() for x in value.split("\n")])),
|
|
password=None,
|
|
backend=default_backend(),
|
|
)
|
|
except ValueError:
|
|
raise ValidationError("Unable to load private key.")
|
|
return value
|
|
|
|
class Meta:
|
|
|
|
model = CertificateKeyPair
|
|
fields = ["pk", "name", "certificate_data", "key_data"]
|
|
|
|
|
|
class CertificateKeyPairViewSet(ModelViewSet):
|
|
"""CertificateKeyPair Viewset"""
|
|
|
|
queryset = CertificateKeyPair.objects.all()
|
|
serializer_class = CertificateKeyPairSerializer
|