mirror of
https://github.com/certbot/certbot.git
synced 2026-08-03 03:41:53 +02:00
Add Registration encoding/fix hashable JWKRSA
This commit is contained in:
@@ -126,9 +126,10 @@ class JWKRSA(JWK):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def fields_from_json(cls, jobj):
|
def fields_from_json(cls, jobj):
|
||||||
return cls(key=Crypto.PublicKey.RSA.construct(
|
return cls(key=util.HashableRSAKey(
|
||||||
(cls._decode_param(jobj['n']),
|
Crypto.PublicKey.RSA.construct(
|
||||||
cls._decode_param(jobj['e']))))
|
(cls._decode_param(jobj['n']),
|
||||||
|
cls._decode_param(jobj['e'])))))
|
||||||
|
|
||||||
def fields_to_json(self):
|
def fields_to_json(self):
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import unittest
|
|||||||
from Crypto.PublicKey import RSA
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
from letsencrypt.acme.jose import errors
|
from letsencrypt.acme.jose import errors
|
||||||
|
from letsencrypt.acme.jose import util
|
||||||
|
|
||||||
|
|
||||||
RSA256_KEY = RSA.importKey(pkg_resources.resource_string(
|
RSA256_KEY = RSA.importKey(pkg_resources.resource_string(
|
||||||
@@ -46,15 +47,15 @@ class JWKRSATest(unittest.TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
from letsencrypt.acme.jose.jwk import JWKRSA
|
from letsencrypt.acme.jose.jwk import JWKRSA
|
||||||
self.jwk256 = JWKRSA(key=RSA256_KEY.publickey())
|
self.jwk256 = JWKRSA(key=util.HashableRSAKey(RSA256_KEY.publickey()))
|
||||||
self.jwk256_private = JWKRSA(key=RSA256_KEY)
|
self.jwk256_private = JWKRSA(key=util.HashableRSAKey(RSA256_KEY))
|
||||||
self.jwk256json = {
|
self.jwk256json = {
|
||||||
'kty': 'RSA',
|
'kty': 'RSA',
|
||||||
'e': 'AQAB',
|
'e': 'AQAB',
|
||||||
'n': 'rHVztFHtH92ucFJD_N_HW9AsdRsUuHUBBBDlHwNlRd3fp5'
|
'n': 'rHVztFHtH92ucFJD_N_HW9AsdRsUuHUBBBDlHwNlRd3fp5'
|
||||||
'80rv2-6QWE30cWgdmJS86ObRz6lUTor4R0T-3C5Q',
|
'80rv2-6QWE30cWgdmJS86ObRz6lUTor4R0T-3C5Q',
|
||||||
}
|
}
|
||||||
self.jwk512 = JWKRSA(key=RSA512_KEY.publickey())
|
self.jwk512 = JWKRSA(key=util.HashableRSAKey(RSA512_KEY.publickey()))
|
||||||
self.jwk512json = {
|
self.jwk512json = {
|
||||||
'kty': 'RSA',
|
'kty': 'RSA',
|
||||||
'e': 'AQAB',
|
'e': 'AQAB',
|
||||||
@@ -72,10 +73,11 @@ class JWKRSATest(unittest.TestCase):
|
|||||||
|
|
||||||
def test_load(self):
|
def test_load(self):
|
||||||
from letsencrypt.acme.jose.jwk import JWKRSA
|
from letsencrypt.acme.jose.jwk import JWKRSA
|
||||||
self.assertEqual(JWKRSA(key=RSA256_KEY), JWKRSA.load(
|
self.assertEqual(
|
||||||
pkg_resources.resource_string(
|
JWKRSA(key=util.HashableRSAKey(RSA256_KEY)), JWKRSA.load(
|
||||||
'letsencrypt.client.tests',
|
pkg_resources.resource_string(
|
||||||
os.path.join('testdata', 'rsa256_key.pem'))))
|
'letsencrypt.client.tests',
|
||||||
|
os.path.join('testdata', 'rsa256_key.pem'))))
|
||||||
|
|
||||||
def test_public(self):
|
def test_public(self):
|
||||||
self.assertEqual(self.jwk256, self.jwk256_private.public())
|
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
|
# on new-reg key server ignores 'key' and populates it based on
|
||||||
# JWS.signature.combined.jwk
|
# 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=())
|
contact = jose.Field('contact', omitempty=True, default=())
|
||||||
recovery_token = jose.Field('recoveryToken', omitempty=True)
|
recovery_token = jose.Field('recoveryToken', omitempty=True)
|
||||||
agreement = jose.Field('agreement', omitempty=True)
|
agreement = jose.Field('agreement', omitempty=True)
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
"""Tests for letsencrypt.acme.messages2."""
|
"""Tests for letsencrypt.acme.messages2."""
|
||||||
import datetime
|
import datetime
|
||||||
|
import os
|
||||||
|
import pkg_resources
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
import pytz
|
import pytz
|
||||||
|
from Crypto.PublicKey import RSA
|
||||||
|
|
||||||
from letsencrypt.acme import challenges
|
from letsencrypt.acme import challenges
|
||||||
from letsencrypt.acme import jose
|
from letsencrypt.acme import jose
|
||||||
@@ -73,6 +76,48 @@ class ConstantTest(unittest.TestCase):
|
|||||||
self.assertEqual('MockConstant(b)', repr(self.const_b))
|
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):
|
class ChallengeResourceTest(unittest.TestCase):
|
||||||
"""Tests for letsencrypt.acme.messages2.ChallengeResource."""
|
"""Tests for letsencrypt.acme.messages2.ChallengeResource."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user