Exemple #1
0
class DocumentTestCase(unittest.TestCase):
    def setUp(self):
        self.gpg = GPG()
        self.gpg.import_keys(PUB_KEY)

    def testGetCertificateID(self):
        "Test result value of document ID"
        source = DocumentSourceMock((200, CORRECT_CERTIFICATE_WITH_VALID_SIGNATURE))
        document = Document(source)
        self.assertTrue(document.verify())
        self.assertEquals(document.get_id(), '64D0 F8CA 822B BDF0 FF59  42F6 A363 ED80 D8A5 CEFF')

    def testGetSignature(self):
        "Test result value of document signature"
        source = DocumentSourceMock((200, CORRECT_CERTIFICATE_WITH_VALID_SIGNATURE))
        document = Document(source)
        self.assertTrue(document.verify())
        self.assertEquals(document.get_signature(), VALID_SIGNATURE)

    def testGetBody(self):
        "Test result value of document body"
        source = DocumentSourceMock((200, CORRECT_CERTIFICATE_WITH_VALID_SIGNATURE))
        document = Document(source)
        self.assertTrue(document.verify())
        self.assertEquals(document.get_body(), VALID_BODY)

    def testGetRawData(self):
        "Test result value of document raw data"
        source = DocumentSourceMock((200, CORRECT_CERTIFICATE_WITH_VALID_SIGNATURE))
        document = Document(source)
        self.assertTrue(document.verify())
        self.assertEquals(document.get_raw_data(), CORRECT_CERTIFICATE_WITH_VALID_SIGNATURE)
Exemple #2
0
 def verify(self):
     if self.data is None:
         return False
     if self.data[0] != 200:
         return None
     gpg = GPG()
     try:
         verified = gpg.verify(self.data[1])
     except Exception:
         return False
     return verified
Exemple #3
0
class GPGTestCase(unittest.TestCase):
    def setUp(self):
        self.gpg = GPG()

    def testCorrectnessOfRFC1991LiteralDataPacket(self):
        "Test correctness of RFC1991 literal data packet generation"
        self.assertEquals(null_date(self.gpg.store(CERT).data), null_date(CERT_RFC1991_LITERAL_DATA_PACKET))
Exemple #4
0
def make_document(data):
    """
    Make OpenPGP document containing one-pass signature packet,
    literal packet and binary signature packet

    See details in RFC4880
    """
    g = GPG(gnupghome=settings.GNUPG_HOME)
    header = "%s%s" % (chr(144), chr(13)) #0x90 0x0D
    signature_packet = extract_signature_packet(extract_signature(data))
    body = strip_signature(data).rstrip()
    literal_packet = g.store(body).data
    one_pass_signature_packet = make_one_pass_signature_packet(signature_packet)
    return "%s%s%s%s" % (
        header,
        one_pass_signature_packet,
        literal_packet,
        signature_packet
    )
Exemple #5
0
class DocumentVerificationTestCase(unittest.TestCase):

    def setUp(self):
        self.gpg = GPG()
        self.gpg.import_keys(PUB_KEY)

    def testCorrectCertificateWithValidSignature(self):
        "Test correct certificate with valid signature"
        source = DocumentSourceMock((200, CORRECT_CERTIFICATE_WITH_VALID_SIGNATURE))
        document = Document(source)
        self.assertTrue(document.verify())

    def testCorrectCertificateWithInvalidSignature(self):
        "Test correct certificate with invalid signature"
        source = DocumentSourceMock((200, CORRECT_CERTIFICATE_WITH_INVALID_SIGNATURE))
        document = Document(source)
        self.assertFalse(document.verify())

    def testIncorrectCertificateWithValidSignature(self):
        "Test incorrect certificate with valid signature"
        source = DocumentSourceMock((200, INCORRECT_CERTIFICATE_WITH_VALID_SIGNATURE))
        document = Document(source)
        self.assertTrue(document.verify())
Exemple #6
0
 def setUp(self):
     self.gpg = GPG()
     self.gpg.import_keys(PUB_KEY)
    def index(self, email=None, pgp=None, mime=None, sn=None, **params):
        cherrypy.response.headers["Content-Type"] = "text/html"
        page = [render_header()]
        if cherrypy.request.method == "POST":
            # TODO: check email for validity
            if email is None or email == "":
                return self._render_error_page(_("Missing parameter"), _("Email parameter is mandatory."))
            # TODO: check serial number for validity
            if sn is None or sn == "":
                return self._render_error_page(
                    _("Missing parameter"), _("Certificate serial number parameter is mandatory.")
                )
            document_source = DocumentSource(settings.ISSUER, sn=sn)
            document = Document(document_source)
            verified = document.verify()
            # document.verify() returns False if verification failed
            # and None upon another error
            if verified != False:
                _id = document.get_id()
                if mime:
                    signature = document.get_signature()
                    body = document.get_body()
                    message = MIMESignedMessage(settings.SMTP_USERNAME, email, render_subject(_id), body, signature)
                else:
                    if not pgp:
                        body = document.get_raw_data()
                        message = TextMessage(settings.SMTP_USERNAME, email, render_subject(_id), body)
                if pgp:
                    gnupg = GPG(gnupghome=ws_settings.GNUPG_HOME)
                    received = gnupg.receive_keys(pgp, always_trust=True)
                    if received:
                        if mime:
                            encrypted = gnupg.encrypt(message.as_string(), pgp, always_trust=True)
                            if encrypted:
                                message = MIMEEncryptedMessage(
                                    settings.SMTP_USERNAME, email, render_subject(_id), str(encrypted)
                                )
                            else:
                                return self._render_error_page(
                                    _("Something went wrong"), _("Encryption problem. Sorry for the inconvenience!")
                                )
                        else:
                            message = make_document(document.get_raw_data())
                            encrypted = gnupg.encrypt(message, pgp, always_trust=True, no_literal=True)
                            if encrypted:
                                message = TextMessage(
                                    settings.SMTP_USERNAME, email, render_subject(_id), str(encrypted)
                                )
                            else:
                                return self._render_error_page(
                                    _("Something went wrong"), _("Encryption problem. Sorry for the inconvenience!")
                                )
                    else:
                        return self._render_error_page(
                            _("Something went wrong"), _("Can not receive key. Sorry for the inconvenience!")
                        )

                m = Mailer(suppress_exceptions=False)
                try:
                    m.send(message)
                except MailerException:
                    return self._render_error_page(
                        _("Something went wrong"), _("Please try again later. Sorry for the inconvenience!")
                    )
                page.append(
                    render_message(
                        _("Request was completed successfully"),
                        _("Your receipt will be emailed shortly. Thank you for your patience!"),
                    )
                )
            else:
                return self._render_error_page(
                    _("Something went wrong"), _("Please try again later. Sorry for the inconvenience!")
                )
        else:
            page.append(
                render_message(
                    _("Malformed request"),
                    _(
                        "You should use POST request with Content-Type: application/x-www-form-urlencoded and appropriate parameters list."
                    ),
                )
            )
        page.append(render_footer())
        return page
Exemple #8
0
 def setUp(self):
     self.gpg = GPG()