Add Registration encoding/fix hashable JWKRSA

This commit is contained in:
James Kasten
2015-04-18 05:48:55 +00:00
committed by Jakub Warmuz
parent 5b0efa2e64
commit 82dded9128
4 changed files with 60 additions and 11 deletions
+4 -3
View File
@@ -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 {
+9 -7
View File
@@ -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())
+2 -1
View File
@@ -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)
+45
View File
@@ -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."""