import os import unittest from BaDCA import Keys, CSRs, Certificates class BaDCAKeysTestCase(unittest.TestCase): obj = None def setUp(self): """ Called prior to every test """ if self.obj is None: self.obj = Certificates.Certificate() else: self.Reset() def test01(self): """ Test reading of a certificate from a file """ assert self.obj.readFromFile('tests/certs/test1.pem') == 1, \ "Failed to read the Certificate" def test02(self): """ Can we get a public key from a certificate? """ assert self.obj.readFromFile('tests/certs/test1.pem') == 1, \ "Failed to read the Certificate" key = self.obj.getKey() assert key is not None, "Failed to get public key from certificate" def test03(self): """ Can we get information from a certificate? """ assert self.obj.readFromFile('tests/certs/test1.pem') == 1, \ "Failed to read the Certificate" assert self.obj.getInformation("Version") == 3, \ "Failed to get correct version from certificate information" assert self.obj.getInformation("public_key", "strength") == 2048, \ "Failed to get correct key strength from certificate information" assert self.obj.getInformation("notBefore") == "Feb 11 22:42:35 2006 GMT", \ "Failed to get correct net before date/time" assert self.obj.getInformation("notAfter") == "Mar 13 22:42:35 2006 GMT", \ "Failed to get correct net after date/time" assert self.obj.getInformation("subject", "C") == 'GB', \ "Failed to get correct country from certificate" assert self.obj.getInformation("subject", "O") == 'ASF Development Authority', \ "Failed to get correct organisation from certificate" assert self.obj.getInformation("subject", "CN") == 'asylum.zones.apache.org', \ "Failed to get correct common name from certificate" assert self.obj.getInformation("subject", "Email") == 'dreid@apache.org', \ "Failed to get correct email address from certificate" assert self.obj.getInformation("issuer", "C") == 'GB', \ "Failed to get correct country from certificate" assert self.obj.getInformation("issuer", "O") == 'ASF Development Authority', \ "Failed to get correct organisation from certificate" assert self.obj.getInformation("issuer", "OU") == 'Server Certificates', \ "Failed to get correct organisation from certificate" assert self.obj.getInformation("issuer", "CN") == 'CA Administrator', \ "Failed to get correct common name from certificate" assert self.obj.getInformation("issuer", "Email") == 'dreid@apache.org', \ "Failed to get correct email address from certificate" assert self.obj.getInformation("serial") == 'B80A8A59ACEB819B64C60F726A32E935', \ "Failed to get correct serial from certificate" assert self.obj.getFingerprint() == \ '42:56:45:63:4F:1E:DA:62:35:6A:7D:EE:4C:D1:12:CB:1A:33:D6:92', \ "Incorrect fingerprint returned for certificate" # print "info = " + str(self.obj.info) def test04(self): """ Checking certificate fingerprint """ assert self.obj.readFromFile('tests/certs/test1.pem') == 1, \ "Failed to read the Certificate" assert self.obj.getFingerprint() == \ '42:56:45:63:4F:1E:DA:62:35:6A:7D:EE:4C:D1:12:CB:1A:33:D6:92', \ "Incorrect fingerprint returned for certificate" def test05(self): """ Checking certificate purposes """ assert self.obj.readFromFile('tests/certs/test1.pem') == 1, \ "Failed to read the Certificate" # These should all be no for non CA for c in ( 'SSL client', 'S/MIME encryption' ): errstr = "Purpose '%s' was incorrectly reflected for non-CA" % c assert self.obj.checkPurpose(c, 0) == 0, errstr # These should be yes for non CA for c in ( 'Any Purpose', 'OCSP helper' ): errstr = "Purpose '%s' was incorrectly reflected for non-CA" % c assert self.obj.checkPurpose(c, 0) == 1, errstr # These should all be no for CA for c in ( 'SSL client', 'S/MIME encryption', 'OCSP helper' ): errstr = "Purpose '%s' was incorrectly reflected for CA" % c assert self.obj.checkPurpose(c, 1) == 0, errstr # This should be yes for CA errstr = "Purpose 'Any Purpose' was incorrectly reflected for CA" assert self.obj.checkPurpose('Any Purpose', 1) == 1, errstr def test06(self): """ Checking key object from certificate """ assert self.obj.readFromFile('tests/certs/test1.pem') == 1, \ "Failed to read the Certificate" key = self.obj.getKey() assert key is not None, "Failed to get key object" assert key.hasPublic(), "Key object has not public key" assert key.addSearchDirectory('tests/keys/private') == 1, \ "Unable to add certificate path to key" def test07(self): """ Create a certificate from a CSR """ csr = CSRs.CSR('tests/csr/test2.csr') assert csr is not None, "Failed to get the CSR object" assert self.obj.readFromFile('tests/certs/ca1.pem') == 1, \ "Failed to read the CA certificate" self.obj.addKeyPath('tests/keys/private') key = self.obj.getKey() assert key.hasPrivate(), "Failed to find private key!" newcert = self.obj.signRequest(csr) assert newcert is not None, \ "Failed to create a certificate object from the CSR" newcert.writeToFile() def test08(self): """ Create a certificate from a CSR using options """ csr = CSRs.CSR('tests/csr/test2.csr') assert csr is not None, "Failed to get the CSR object" assert self.obj.readFromFile('tests/certs/ca1.pem') == 1, \ "Failed to read the CA certificate" self.obj.addKeyPath('tests/keys/private') options = { 'attributes': { 'subjectKeyIdentifier': 'hash', "authorityKeyIdentifier": "keyid:always,issuer:always", "subjectAltName": "email:copy", "issuerAltName": "issuer:copy", }, 'remove': [ 'CN', 'emailAddress', 'ST' ], 'ignore': [ 'C', 'O', 'OU', 'ST' ], } newcert = self.obj.signRequest(csr, options) assert newcert is not None, \ "Failed to create a certificate object from the CSR" newcert.writeToFile() if __name__ == "__main__": unittest.main()