From a1476217655be21dde7453fd35d80b8fae3ecb1a Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 24 Dec 2015 10:27:18 -0500 Subject: Make indexing a CRL O(1) instead of O(n). This drops support for slicing, if that's important someone say something and I can add it back --- src/cryptography/hazmat/backends/openssl/x509.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cryptography/hazmat/backends/openssl/x509.py b/src/cryptography/hazmat/backends/openssl/x509.py index 7b9f71cd..4bddee4c 100644 --- a/src/cryptography/hazmat/backends/openssl/x509.py +++ b/src/cryptography/hazmat/backends/openssl/x509.py @@ -6,6 +6,7 @@ from __future__ import absolute_import, division, print_function import datetime import ipaddress +import operator from email.utils import parseaddr @@ -872,8 +873,10 @@ class _CertificateRevocationList(object): yield self._revoked_cert(i) def __getitem__(self, idx): - # TODO: indexing is O(n) - return list(self)[idx] + idx = operator.index(idx) + if not 0 <= idx < len(self): + raise IndexError + return self._revoked_cert(idx) def __len__(self): revoked = self._backend._lib.X509_CRL_get_REVOKED(self._x509_crl) -- cgit v1.2.3 From 9f71bf79971d5365a4a89cfbc6b29197a57e9042 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 24 Dec 2015 11:04:21 -0500 Subject: tests on indexing --- tests/test_x509.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/test_x509.py b/tests/test_x509.py index ab4d6660..099dfd5f 100644 --- a/tests/test_x509.py +++ b/tests/test_x509.py @@ -332,7 +332,6 @@ class TestCertificateRevocationList(object): @pytest.mark.requires_backend_interface(interface=X509Backend) class TestRevokedCertificate(object): - def test_revoked_basics(self, backend): crl = _load_cert( os.path.join("x509", "custom", "crl_all_reasons.pem"), @@ -460,6 +459,18 @@ class TestRevokedCertificate(object): with pytest.raises(ValueError): crl[0].extensions + def test_indexing(self, backend): + crl = _load_cert( + os.path.join("x509", "custom", "crl_empty.pem"), + x509.load_pem_x509_crl, + backend + ) + + with pytest.raises(IndexError): + crl[-1] + with pytest.raises(IndexError): + crl[0] + @pytest.mark.requires_backend_interface(interface=RSABackend) @pytest.mark.requires_backend_interface(interface=X509Backend) -- cgit v1.2.3 From a3fa8d6872d32005e6e600e27a48343d2f21d13d Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 24 Dec 2015 11:34:24 -0500 Subject: full indexing support + testsg --- src/cryptography/hazmat/backends/openssl/x509.py | 16 ++++++++++++---- tests/test_x509.py | 11 ++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/cryptography/hazmat/backends/openssl/x509.py b/src/cryptography/hazmat/backends/openssl/x509.py index 4bddee4c..2f7d082f 100644 --- a/src/cryptography/hazmat/backends/openssl/x509.py +++ b/src/cryptography/hazmat/backends/openssl/x509.py @@ -873,10 +873,18 @@ class _CertificateRevocationList(object): yield self._revoked_cert(i) def __getitem__(self, idx): - idx = operator.index(idx) - if not 0 <= idx < len(self): - raise IndexError - return self._revoked_cert(idx) + if isinstance(idx, slice): + start, stop, step = idx.indices(len(self)) + return [ + self._revoked_cert(idx) for idx in range(start, stop, step) + ] + else: + idx = operator.index(idx) + if idx < 0: + idx += len(self) + if not 0 <= idx < len(self): + raise IndexError + return self._revoked_cert(idx) def __len__(self): revoked = self._backend._lib.X509_CRL_get_REVOKED(self._x509_crl) diff --git a/tests/test_x509.py b/tests/test_x509.py index 099dfd5f..755b65fa 100644 --- a/tests/test_x509.py +++ b/tests/test_x509.py @@ -461,15 +461,20 @@ class TestRevokedCertificate(object): def test_indexing(self, backend): crl = _load_cert( - os.path.join("x509", "custom", "crl_empty.pem"), + os.path.join("x509", "custom", "crl_all_reasons.pem"), x509.load_pem_x509_crl, backend ) with pytest.raises(IndexError): - crl[-1] + crl[-13] with pytest.raises(IndexError): - crl[0] + crl[12] + + assert crl[-1].serial_number == crl[11].serial_number + assert len(crl[2:4]) == 2 + assert crl[2:4][0].serial_number == crl[2].serial_number + assert crl[2:4][1].serial_number == crl[3].serial_number @pytest.mark.requires_backend_interface(interface=RSABackend) -- cgit v1.2.3 From de85d5a3e790dde1da669bbb49a17aadc1ad7122 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 24 Dec 2015 11:37:08 -0500 Subject: please the great flake8 in the sky --- src/cryptography/hazmat/backends/openssl/x509.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cryptography/hazmat/backends/openssl/x509.py b/src/cryptography/hazmat/backends/openssl/x509.py index 2f7d082f..a470adbd 100644 --- a/src/cryptography/hazmat/backends/openssl/x509.py +++ b/src/cryptography/hazmat/backends/openssl/x509.py @@ -875,9 +875,7 @@ class _CertificateRevocationList(object): def __getitem__(self, idx): if isinstance(idx, slice): start, stop, step = idx.indices(len(self)) - return [ - self._revoked_cert(idx) for idx in range(start, stop, step) - ] + return [self._revoked_cert(i) for i in range(start, stop, step)] else: idx = operator.index(idx) if idx < 0: -- cgit v1.2.3