Projekt

Obecné

Profil

Stáhnout (3.54 KB) Statistiky
| Větev: | Tag: | Revize:
1 5e31b492 David Friesecký
from flask import Response, request
2 b1fa358f Jan Pašek
from injector import inject
3 1de95cdf Captain_Trojan
import base64
4 b1fa358f Jan Pašek
5
from src.exceptions.certificate_not_found_exception import CertificateNotFoundException
6
from src.exceptions.private_key_not_found_exception import PrivateKeyNotFoundException
7 5cd65ab4 Captain_Trojan
from src.services.crl_ocsp.crl_ocsp_service import CrlOcspService
8 b1fa358f Jan Pašek
from src.controllers.return_codes import *
9 5e31b492 David Friesecký
from src.utils.logger import Logger
10 b1fa358f Jan Pašek
11
E_WRONG_PARAMETERS = {"success": False, "data": "Invalid request, wrong parameters."}
12
E_NO_CERTIFICATES_FOUND = {"success": False, "data": "No such certificate found."}
13
14
15
class CrlOcspController:
16
17
    @inject
18 5cd65ab4 Captain_Trojan
    def __init__(self, crl_service: CrlOcspService):
19 b1fa358f Jan Pašek
        self.crl_service = crl_service
20
21
    def get_crl(self, ca_id: str):
22
        """
23
        Generate and download a CRL for a selected certificate authority
24
        :param ca_id: certificate authority whose CRL is requested
25
        :return: download response / error
26
        """
27 5e31b492 David Friesecký
28
        # TODO check log
29
        Logger.info(f"\n\t{request.referrer}"
30
                    f"\n\t{request.method}   {request.path}   {request.scheme}"
31
                    f"\n\tCertificate ID = {ca_id}")
32
33 b1fa358f Jan Pašek
        # convert id from string to int
34
        try:
35
            identifier = int(ca_id)
36
        except ValueError:
37 5e31b492 David Friesecký
            Logger.error(f"Invalid request, wrong parameters 'id'[{ca_id}].")
38 b1fa358f Jan Pašek
            return E_WRONG_PARAMETERS, C_BAD_REQUEST
39
40
        # generate the CRL
41
        try:
42
            crl = self.crl_service.generate_crl_response(identifier)
43 5cd65ab4 Captain_Trojan
        except CertificateNotFoundException:
44 5e31b492 David Friesecký
            Logger.error(f"No such certificate found 'ID = {identifier}'.")
45 b1fa358f Jan Pašek
            return E_NO_CERTIFICATES_FOUND, C_NOT_FOUND
46
47
        return Response(crl, mimetype="application/x-x509-ca-cert",
48
                        headers={"Content-Disposition": f"attachment;filename={ca_id}_crl.pem"})
49 1de95cdf Captain_Trojan
50
    def get_ocsp_from_base64(self, ca_id, base64_der_ocsp_request):
51
        """
52
        Generate an OCSP Response for a base-64 encoded DER encoded OCSP Request.
53
        :param ca_id: certificate authority ID
54
        :param base64_der_ocsp_request: encoded request
55
        :return: DER OCSP response
56
        """
57 5e31b492 David Friesecký
58
        Logger.info(f"\n\t{request.referrer}"
59
                    f"\n\t{request.method}   {request.path}   {request.scheme}"
60
                    f"\n\tCertificate ID = {ca_id}")
61
62 1de95cdf Captain_Trojan
        return self.get_ocsp_from_der(ca_id, base64.b64decode(base64_der_ocsp_request))
63
64
    def get_ocsp_from_der(self, ca_id, der_ocsp_request):
65
        """
66
        Generate an OCSP Response for a DER encoded OCSP Request.
67
        :param ca_id: certificate authority ID
68
        :param der_ocsp_request: encoded request
69
        :return: DER OCSP response
70
        """
71 5e31b492 David Friesecký
72
        Logger.info(f"\n\t{request.referrer}"
73
                    f"\n\t{request.method}   {request.path}   {request.scheme}"
74
                    f"\n\tCertificate ID = {ca_id}")
75
76 1de95cdf Captain_Trojan
        if len(der_ocsp_request) == 0:
77 5e31b492 David Friesecký
            Logger.error(f"Invalid request, wrong parameters 'der_ocsp_request'.")
78 1de95cdf Captain_Trojan
            return E_WRONG_PARAMETERS, C_BAD_REQUEST
79
80
        try:
81
            ca_id = int(ca_id)
82
        except ValueError:
83 5e31b492 David Friesecký
            Logger.error(f"Invalid request, wrong parameters 'id'[{ca_id}].")
84 1de95cdf Captain_Trojan
            return E_WRONG_PARAMETERS, C_BAD_REQUEST
85
86
        try:
87
            ocsp_response = self.crl_service.generate_ocsp_response(ca_id, der_ocsp_request)
88 5cd65ab4 Captain_Trojan
        except CertificateNotFoundException:
89 5e31b492 David Friesecký
            Logger.error(f"No such certificate found 'ID = {ca_id}'.")
90 1de95cdf Captain_Trojan
            return E_NO_CERTIFICATES_FOUND, C_NOT_FOUND
91
92
        return Response(ocsp_response, mimetype="application/ocsp-response")