mirror of
https://github.com/certbot/certbot.git
synced 2026-06-07 07:42:08 -04:00
Add Registration encoding/fix hashable JWKRSA
This commit is contained in:
parent
ab616a598f
commit
495e1adaca
4 changed files with 60 additions and 11 deletions
|
|
@ -126,9 +126,10 @@ class JWKRSA(JWK):
|
|||
|
||||
@classmethod
|
||||
def fields_from_json(cls, jobj):
|
||||
return cls(key=Crypto.PublicKey.RSA.construct(
|
||||
(cls._decode_param(jobj['n']),
|
||||
cls._decode_param(jobj['e']))))
|
||||
return cls(key=util.HashableRSAKey(
|
||||
Crypto.PublicKey.RSA.construct(
|
||||
(cls._decode_param(jobj['n']),
|
||||
cls._decode_param(jobj['e'])))))
|
||||
|
||||
def fields_to_json(self):
|
||||
return {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ import unittest
|
|||
from Crypto.PublicKey import RSA
|
||||
|
||||
from letsencrypt.acme.jose import errors
|
||||
from letsencrypt.acme.jose import util
|
||||
|
||||
|
||||
RSA256_KEY = RSA.importKey(pkg_resources.resource_string(
|
||||
|
|
@ -42,15 +43,15 @@ class JWKRSATest(unittest.TestCase):
|
|||
|
||||
def setUp(self):
|
||||
from letsencrypt.acme.jose.jwk import JWKRSA
|
||||
self.jwk256 = JWKRSA(key=RSA256_KEY.publickey())
|
||||
self.jwk256_private = JWKRSA(key=RSA256_KEY)
|
||||
self.jwk256 = JWKRSA(key=util.HashableRSAKey(RSA256_KEY.publickey()))
|
||||
self.jwk256_private = JWKRSA(key=util.HashableRSAKey(RSA256_KEY))
|
||||
self.jwk256json = {
|
||||
'kty': 'RSA',
|
||||
'e': 'AQAB',
|
||||
'n': 'rHVztFHtH92ucFJD_N_HW9AsdRsUuHUBBBDlHwNlRd3fp5'
|
||||
'80rv2-6QWE30cWgdmJS86ObRz6lUTor4R0T-3C5Q',
|
||||
}
|
||||
self.jwk512 = JWKRSA(key=RSA512_KEY.publickey())
|
||||
self.jwk512 = JWKRSA(key=util.HashableRSAKey(RSA512_KEY.publickey()))
|
||||
self.jwk512json = {
|
||||
'kty': 'RSA',
|
||||
'e': 'AQAB',
|
||||
|
|
@ -68,10 +69,11 @@ class JWKRSATest(unittest.TestCase):
|
|||
|
||||
def test_load(self):
|
||||
from letsencrypt.acme.jose.jwk import JWKRSA
|
||||
self.assertEqual(JWKRSA(key=RSA256_KEY), JWKRSA.load(
|
||||
pkg_resources.resource_string(
|
||||
'letsencrypt.client.tests',
|
||||
os.path.join('testdata', 'rsa256_key.pem'))))
|
||||
self.assertEqual(
|
||||
JWKRSA(key=util.HashableRSAKey(RSA256_KEY)), JWKRSA.load(
|
||||
pkg_resources.resource_string(
|
||||
'letsencrypt.client.tests',
|
||||
os.path.join('testdata', 'rsa256_key.pem'))))
|
||||
|
||||
def test_public(self):
|
||||
self.assertEqual(self.jwk256, self.jwk256_private.public())
|
||||
|
|
|
|||
|
|
@ -136,7 +136,8 @@ class Registration(ResourceBody):
|
|||
|
||||
# on new-reg key server ignores 'key' and populates it based on
|
||||
# JWS.signature.combined.jwk
|
||||
key = jose.Field('key', omitempty=True, decoder=jose.JWK.from_json)
|
||||
key = jose.Field('key', omitempty=True,
|
||||
decoder=jose.JWK.from_json, encoder=jose.JWK.to_json)
|
||||
contact = jose.Field('contact', omitempty=True, default=())
|
||||
recovery_token = jose.Field('recoveryToken', omitempty=True)
|
||||
agreement = jose.Field('agreement', omitempty=True)
|
||||
|
|
|
|||
|
|
@ -1,9 +1,12 @@
|
|||
"""Tests for letsencrypt.acme.messages2."""
|
||||
import datetime
|
||||
import os
|
||||
import pkg_resources
|
||||
import unittest
|
||||
|
||||
import mock
|
||||
import pytz
|
||||
from Crypto.PublicKey import RSA
|
||||
|
||||
from letsencrypt.acme import challenges
|
||||
from letsencrypt.acme import jose
|
||||
|
|
@ -66,6 +69,48 @@ class ConstantTest(unittest.TestCase):
|
|||
self.assertEqual('MockConstant(b)', repr(self.const_b))
|
||||
|
||||
|
||||
class RegistrationTest(unittest.TestCase):
|
||||
"""Tests for letsencrypt.acme.messages2.Registration."""
|
||||
|
||||
def setUp(self):
|
||||
from letsencrypt.acme.messages2 import Registration
|
||||
|
||||
rsa_key = RSA.importKey(pkg_resources.resource_string(
|
||||
'letsencrypt.client.tests', os.path.join(
|
||||
'testdata', 'rsa256_key.pem')))
|
||||
|
||||
self.key = jose.jwk.JWKRSA(key=jose.util.HashableRSAKey(
|
||||
rsa_key.publickey()))
|
||||
|
||||
self.contact = ("mailto:letsencrypt-client@letsencrypt.org",)
|
||||
self.recovery_token = "XYZ"
|
||||
self.agreement = "https://letsencrypt.org/terms"
|
||||
self.reg = Registration(
|
||||
key=self.key, contact=self.contact,
|
||||
recovery_token=self.recovery_token, agreement=self.agreement)
|
||||
|
||||
self.json_key = {
|
||||
'kty': 'RSA',
|
||||
'e': 'AQAB',
|
||||
'n': 'rHVztFHtH92ucFJD_N_HW9AsdRsUuHUBBBDlHwNlRd3fp5'
|
||||
'80rv2-6QWE30cWgdmJS86ObRz6lUTor4R0T-3C5Q',
|
||||
}
|
||||
|
||||
self.json_reg = {
|
||||
"contact": self.contact,
|
||||
"recoveryToken": self.recovery_token,
|
||||
"agreement": self.agreement,
|
||||
"key": self.json_key,
|
||||
}
|
||||
|
||||
def test_to_json(self):
|
||||
self.assertEqual(self.reg.to_json(), self.json_reg)
|
||||
|
||||
def test_from_json(self):
|
||||
from letsencrypt.acme.messages2 import Registration
|
||||
|
||||
self.assertEqual(Registration.from_json(self.json_reg), self.reg)
|
||||
|
||||
class ChallengeResourceTest(unittest.TestCase):
|
||||
"""Tests for letsencrypt.acme.messages2.ChallengeResource."""
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue