Skip to content

Commit d2afa9b

Browse files
committed
Add compressed certs
1 parent 463716e commit d2afa9b

File tree

2 files changed

+58
-20
lines changed

2 files changed

+58
-20
lines changed

tests/device/test_opaque.py

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,27 @@
2525
import pytest
2626

2727

28+
def get_test_cert():
29+
private_key = ec.generate_private_key(
30+
ALGORITHM.EC_P256.to_curve(), default_backend()
31+
)
32+
name = x509.Name(
33+
[x509.NameAttribute(x509.oid.NameOID.COMMON_NAME, "Test Certificate")]
34+
)
35+
one_day = datetime.timedelta(1, 0, 0)
36+
certificate = (
37+
x509.CertificateBuilder()
38+
.subject_name(name)
39+
.issuer_name(name)
40+
.not_valid_before(datetime.datetime.today() - one_day)
41+
.not_valid_after(datetime.datetime.today() + one_day)
42+
.serial_number(int(uuid.uuid4()))
43+
.public_key(private_key.public_key())
44+
.sign(private_key, hashes.SHA256(), default_backend())
45+
)
46+
return certificate
47+
48+
2849
def test_put_empty(session):
2950
# Can't put an empty object
3051
with pytest.raises(ValueError):
@@ -74,27 +95,37 @@ def test_put_too_big(session):
7495

7596

7697
def test_certificate(session):
77-
private_key = ec.generate_private_key(
78-
ALGORITHM.EC_P256.to_curve(), default_backend()
79-
)
80-
name = x509.Name(
81-
[x509.NameAttribute(x509.oid.NameOID.COMMON_NAME, "Test Certificate")]
82-
)
83-
one_day = datetime.timedelta(1, 0, 0)
84-
certificate = (
85-
x509.CertificateBuilder()
86-
.subject_name(name)
87-
.issuer_name(name)
88-
.not_valid_before(datetime.datetime.today() - one_day)
89-
.not_valid_after(datetime.datetime.today() + one_day)
90-
.serial_number(int(uuid.uuid4()))
91-
.public_key(private_key.public_key())
92-
.sign(private_key, hashes.SHA256(), default_backend())
93-
)
94-
98+
certificate = get_test_cert()
9599
certobj = Opaque.put_certificate(
96100
session, 0, "Test certificate Opaque", 1, CAPABILITY.NONE, certificate
97101
)
98102

99103
assert certificate == certobj.get_certificate()
100104
certobj.delete()
105+
106+
107+
def test_compressed_certificate(session):
108+
certificate = get_test_cert()
109+
110+
certobj = Opaque.put_certificate(
111+
session,
112+
0,
113+
"Test certificate Opaque",
114+
1,
115+
CAPABILITY.NONE,
116+
certificate,
117+
)
118+
compressed_certobj = Opaque.put_certificate(
119+
session,
120+
0,
121+
"Test certificate Opaque Compressed",
122+
1,
123+
CAPABILITY.NONE,
124+
certificate,
125+
compress=True,
126+
)
127+
assert certobj.get_certificate() == compressed_certobj.get_certificate(
128+
decompress=True
129+
)
130+
assert certobj.get() != compressed_certobj.get()
131+
assert len(certobj.get()) > len(compressed_certobj.get())

yubihsm/objects.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from typing import ClassVar, Union, Optional, TypeVar, NamedTuple, Type
3535
import copy
3636
import struct
37+
import gzip
3738

3839

3940
LABEL_LENGTH = 40
@@ -357,6 +358,7 @@ def put_certificate(
357358
domains: int,
358359
capabilities: CAPABILITY,
359360
certificate: x509.Certificate,
361+
compress: bool = False,
360362
) -> "Opaque":
361363
"""Import an X509 certificate into the YubiHSM as an Opaque.
362364
@@ -370,6 +372,8 @@ def put_certificate(
370372
:return: A reference to the newly created object.
371373
"""
372374
encoded_cert = certificate.public_bytes(Encoding.DER)
375+
if compress:
376+
encoded_cert = gzip.compress(encoded_cert)
373377
return cls.put(
374378
session,
375379
object_id,
@@ -380,12 +384,15 @@ def put_certificate(
380384
encoded_cert,
381385
)
382386

383-
def get_certificate(self) -> x509.Certificate:
387+
def get_certificate(self, decompress: bool = False) -> x509.Certificate:
384388
"""Read an Opaque object from the YubiHSM, parsed as a certificate.
385389
386390
:return: The certificate stored for the object.
387391
"""
388-
return x509.load_der_x509_certificate(self.get(), default_backend())
392+
cert_data = self.get()
393+
if decompress:
394+
cert_data = gzip.decompress(cert_data)
395+
return x509.load_der_x509_certificate(cert_data, default_backend())
389396

390397

391398
class AuthenticationKey(YhsmObject):

0 commit comments

Comments
 (0)