6
6
import pytest
7
7
from cryptography .hazmat .backends import default_backend
8
8
from cryptography .hazmat .primitives .asymmetric import ec
9
+
9
10
from cryptojwt .exception import BadSignature
10
11
from cryptojwt .exception import UnknownAlgorithm
11
12
from cryptojwt .exception import WrongNumberOfParts
17
18
from cryptojwt .jws .exception import NoSuitableSigningKeys
18
19
from cryptojwt .jws .exception import SignerAlgError
19
20
from cryptojwt .jws .jws import JWS
20
- from cryptojwt .jws .jws import SIGNER_ALGS
21
21
from cryptojwt .jws .jws import JWSig
22
+ from cryptojwt .jws .jws import SIGNER_ALGS
22
23
from cryptojwt .jws .jws import factory
23
24
from cryptojwt .jws .rsa import RSASigner
24
25
from cryptojwt .jws .utils import left_hash
@@ -40,16 +41,16 @@ def full_path(local_file):
40
41
41
42
JWK_a = {
42
43
"keys" : [{
43
- 'alg' : 'RSA' ,
44
- 'use' : 'foo' ,
45
- 'e' : 'AQAB' ,
46
- 'n' : (
47
- 'wf-wiusGhA-gleZYQAOPQlNUIucPiqXdPVyieDqQbXXOPBe3nuggtV'
48
- 'zeq7pVFH1dZz4dY2Q2LA5DaegvP8kRvoSB_87ds3dy3Rfym_GUSc5B'
49
- '0l1TgEobcyaep8jguRoHto6GWHfCfKqoUYZq4N8vh4LLMQwLR6zi6J'
50
- 'tu82nB5k8' )
51
- }]
52
- }
44
+ 'alg' : 'RSA' ,
45
+ 'use' : 'foo' ,
46
+ 'e' : 'AQAB' ,
47
+ 'n' : (
48
+ 'wf-wiusGhA-gleZYQAOPQlNUIucPiqXdPVyieDqQbXXOPBe3nuggtV'
49
+ 'zeq7pVFH1dZz4dY2Q2LA5DaegvP8kRvoSB_87ds3dy3Rfym_GUSc5B'
50
+ '0l1TgEobcyaep8jguRoHto6GWHfCfKqoUYZq4N8vh4LLMQwLR6zi6J'
51
+ 'tu82nB5k8' )
52
+ }]
53
+ }
53
54
54
55
# 64*8 = 256 bits
55
56
HMAC_KEY = [3 , 35 , 53 , 75 , 43 , 15 , 165 , 188 , 131 , 126 , 6 , 101 , 119 , 123 , 166 ,
@@ -66,13 +67,13 @@ def full_path(local_file):
66
67
'-nrmbSpfn8Rz3y3oXLydvUqj8869PkcEzoJIY5Xf7xDN1Co_qyT9qge'
67
68
'-3C6DEwGVHXOwRoXRGQ_h50Vsh60MB5MIuDN188EeZnQ30dtCTBB9KDTSEA2DunplhwLCq4xphnMNUaeHdEk' ,
68
69
'kid' : 'rsa1'
69
- },
70
+ },
70
71
{
71
72
"k" :
72
73
b"YTEyZjBlMDgxMGI4YWU4Y2JjZDFiYTFlZTBjYzljNDU3YWM0ZWNiNzhmNmFlYTNkNTY0NzMzYjE" ,
73
74
"kty" : "oct" ,
74
- }]
75
- }
75
+ }]
76
+ }
76
77
77
78
JWKS_b = {
78
79
"keys" : [
@@ -83,23 +84,23 @@ def full_path(local_file):
83
84
"kty" : "RSA" ,
84
85
"kid" : "rsa1" ,
85
86
"use" : "sig"
86
- },
87
+ },
87
88
{
88
89
"k" :
89
90
b"YTEyZjBlMDgxMGI4YWU4Y2JjZDFiYTFlZTBjYzljNDU3YWM0ZWNiNzhmNmFlYTNkNTY0NzMzYjE" ,
90
91
"kty" : "oct" ,
91
92
"use" : "sig"
92
- },
93
+ },
93
94
{
94
95
"kty" : "EC" ,
95
96
"kid" : "ec1" ,
96
97
"use" : "sig" ,
97
98
"x" : "q0WbWhflRbxyQZKFuQvh2nZvg98ak-twRoO5uo2L7Po" ,
98
99
"y" : "GOd2jL_6wa0cfnyA0SmEhok9fkYEnAHFKLLM79BZ8_E" ,
99
100
"crv" : "P-256"
100
- }
101
- ]
102
- }
101
+ }
102
+ ]
103
+ }
103
104
104
105
JWK_b = {
105
106
"keys" : [
@@ -113,22 +114,24 @@ def full_path(local_file):
113
114
"use" : "sig" ,
114
115
"x5c" : [
115
116
"MIIDPjCCAiqgAwIBAgIQsRiM0jheFZhKk49YD0SK1TAJBgUrDgMCHQUAMC0xKzApBgNVBAMTImFjY291bnRzLmFjY2Vzc2NvbnRyb2wud2luZG93cy5uZXQwHhcNMTQwMTAxMDcwMDAwWhcNMTYwMTAxMDcwMDAwWjAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkSCWg6q9iYxvJE2NIhSyOiKvqoWCO2GFipgH0sTSAs5FalHQosk9ZNTztX0ywS/AHsBeQPqYygfYVJL6/EgzVuwRk5txr9e3n1uml94fLyq/AXbwo9yAduf4dCHTP8CWR1dnDR+Qnz/4PYlWVEuuHHONOw/blbfdMjhY+C/BYM2E3pRxbohBb3x//CfueV7ddz2LYiH3wjz0QS/7kjPiNCsXcNyKQEOTkbHFi3mu0u13SQwNddhcynd/GTgWN8A+6SN1r4hzpjFKFLbZnBt77ACSiYx+IHK4Mp+NaVEi5wQtSsjQtI++XsokxRDqYLwus1I1SihgbV/STTg5enufuwIDAQABo2IwYDBeBgNVHQEEVzBVgBDLebM6bK3BjWGqIBrBNFeNoS8wLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldIIQsRiM0jheFZhKk49YD0SK1TAJBgUrDgMCHQUAA4IBAQCJ4JApryF77EKC4zF5bUaBLQHQ1PNtA1uMDbdNVGKCmSf8M65b8h0NwlIjGGGy/unK8P6jWFdm5IlZ0YPTOgzcRZguXDPj7ajyvlVEQ2K2ICvTYiRQqrOhEhZMSSZsTKXFVwNfW6ADDkN3bvVOVbtpty+nBY5UqnI7xbcoHLZ4wYD251uj5+lo13YLnsVrmQ16NCBYq2nQFNPuNJw6t3XUbwBHXpF46aLT1/eGf/7Xx6iy8yPJX4DyrpFTutDz882RWofGEO5t4Cw+zZg70dJ/hH/ODYRMorfXEW+8uKmXMKmX2wyxMKvfiPbTy5LmAU8Jvjs2tLg4rOBcXWLAIarZ"
116
- ],
117
+ ],
117
118
"x5t" : "kriMPdmBvx68skT8-mPAB3BseeA"
118
- },
119
+ },
119
120
{
120
121
"e" : "AQAB" ,
121
122
"issuer" : "https://login.microsoftonline.com/{tenantid}/v2.0/" ,
122
123
"kid" : "MnC_VZcATfM5pOYiJHMba9goEKY" ,
123
124
"kty" : "RSA" ,
124
125
"n" :
125
- "vIqz-4-ER_vNWLON9yv8hIYV737JQ6rCl6XfzOC628seYUPf0TaGk91CFxefhzh23V9Tkq-RtwN1Vs_z57hO82kkzL-cQHZX3bMJD-GEGOKXCEXURN7VMyZWMAuzQoW9vFb1k3cR1RW_EW_P-C8bb2dCGXhBYqPfHyimvz2WarXhntPSbM5XyS5v5yCw5T_Vuwqqsio3V8wooWGMpp61y12NhN8bNVDQAkDPNu2DT9DXB1g0CeFINp_KAS_qQ2Kq6TSvRHJqxRR68RezYtje9KAqwqx4jxlmVAQy0T3-T-IAbsk1wRtWDndhO6s1Os-dck5TzyZ_dNOhfXgelixLUQ" ,
126
+ "vIqz-4-ER_vNWLON9yv8hIYV737JQ6rCl6XfzOC628seYUPf0TaGk91CFxefhzh23V9Tkq"
127
+ "-RtwN1Vs_z57hO82kkzL-cQHZX3bMJD-GEGOKXCEXURN7VMyZWMAuzQoW9vFb1k3cR1RW_EW_P"
128
+ "-C8bb2dCGXhBYqPfHyimvz2WarXhntPSbM5XyS5v5yCw5T_Vuwqqsio3V8wooWGMpp61y12NhN8bNVDQAkDPNu2DT9DXB1g0CeFINp_KAS_qQ2Kq6TSvRHJqxRR68RezYtje9KAqwqx4jxlmVAQy0T3-T-IAbsk1wRtWDndhO6s1Os-dck5TzyZ_dNOhfXgelixLUQ" ,
126
129
"use" : "sig" ,
127
130
"x5c" : [
128
131
"MIIC4jCCAcqgAwIBAgIQQNXrmzhLN4VGlUXDYCRT3zANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTE0MTAyODAwMDAwMFoXDTE2MTAyNzAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALyKs/uPhEf7zVizjfcr/ISGFe9+yUOqwpel38zgutvLHmFD39E2hpPdQhcXn4c4dt1fU5KvkbcDdVbP8+e4TvNpJMy/nEB2V92zCQ/hhBjilwhF1ETe1TMmVjALs0KFvbxW9ZN3EdUVvxFvz/gvG29nQhl4QWKj3x8opr89lmq14Z7T0mzOV8kub+cgsOU/1bsKqrIqN1fMKKFhjKaetctdjYTfGzVQ0AJAzzbtg0/Q1wdYNAnhSDafygEv6kNiquk0r0RyasUUevEXs2LY3vSgKsKseI8ZZlQEMtE9/k/iAG7JNcEbVg53YTurNTrPnXJOU88mf3TToX14HpYsS1ECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAfolx45w0i8CdAUjjeAaYdhG9+NDHxop0UvNOqlGqYJexqPLuvX8iyUaYxNGzZxFgGI3GpKfmQP2JQWQ1E5JtY/n8iNLOKRMwqkuxSCKJxZJq4Sl/m/Yv7TS1P5LNgAj8QLCypxsWrTAmq2HSpkeSk4JBtsYxX6uhbGM/K1sEktKybVTHu22/7TmRqWTmOUy9wQvMjJb2IXdMGLG3hVntN/WWcs5w8vbt1i8Kk6o19W2MjZ95JaECKjBDYRlhG1KmSBtrsKsCBQoBzwH/rXfksTO9JoUYLXiW0IppB7DhNH4PJ5hZI91R8rR0H3/bKkLSuDaKLWSqMhozdhXsIIKvJQ=="
129
- ],
132
+ ],
130
133
"x5t" : "MnC_VZcATfM5pOYiJHMba9goEKY"
131
- },
134
+ },
132
135
{
133
136
"e" : "AQAB" ,
134
137
"issuer" : "https://login.microsoftonline.com/9188040d-6c67-4c5b"
@@ -142,9 +145,9 @@ def full_path(local_file):
142
145
"use" : "sig" ,
143
146
"x5c" : [
144
147
"MIICWzCCAcSgAwIBAgIJAKVzMH2FfC12MA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xMzExMTExODMzMDhaFw0xNjExMTAxODMzMDhaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5ymq/xwmst1nstPr8YFOTyD1J5N4idYmrph7AyAv95RbWXfDRqy8CMRG7sJq+UWOKVOA4MVrd/NdV+ejj1DE5MPSiG+mZK/5iqRCDFvPYqOyRj539xaTlARNY4jeXZ0N6irZYKqSfYACjkkKxbLKcijSu1pJ48thXOTED0oNa6UCAwEAAaOBijCBhzAdBgNVHQ4EFgQURCN+4cb0pvkykJCUmpjyfUfnRMowWQYDVR0jBFIwUIAURCN+4cb0pvkykJCUmpjyfUfnRMqhLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAKVzMH2FfC12MAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOBgQB8v8G5/vUl8k7xVuTmMTDA878AcBKBrJ/Hp6RShmdqEGVI7SFR7IlBN1//NwD0n+IqzmnRV2PPZ7iRgMF/Fyvqi96Gd8X53ds/FaiQpZjUUtcO3fk0hDRQPtCYMII5jq+YAYjSybvF84saB7HGtucVRn2nMZc5cAC42QNYIlPMqA=="
145
- ],
148
+ ],
146
149
"x5t" : "GvnPApfWMdLRi8PDmisFn7bprKg"
147
- },
150
+ },
148
151
{
149
152
"e" : "AQAB" ,
150
153
"issuer" : "https://login.microsoftonline.com/9188040d-6c67-4c5b"
@@ -156,11 +159,11 @@ def full_path(local_file):
156
159
"use" : "sig" ,
157
160
"x5c" : [
158
161
"MIICWzCCAcSgAwIBAgIJAL3MzqqEFMYjMA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xMzExMTExOTA1MDJaFw0xOTExMTAxOTA1MDJaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAx7HNcD9ZxTFRaAgZ7+gdYLkgQua3zvQseqBJIt8Uq3MimInMZoE9QGQeSML7qZPlowb5BUakdLI70ayM4vN36++0ht8+oCHhl8YjGFQkU+Iv2yahWHEP+1EK6eOEYu6INQP9Lk0HMk3QViLwshwb+KXVD02jdmX2HNdYJdPyc0cCAwEAAaOBijCBhzAdBgNVHQ4EFgQULR0aj9AtiNMgqIY8ZyXZGsHcJ5gwWQYDVR0jBFIwUIAULR0aj9AtiNMgqIY8ZyXZGsHcJ5ihLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAL3MzqqEFMYjMAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOBgQBshrsF9yls4ArxOKqXdQPDgHrbynZL8m1iinLI4TeSfmTCDevXVBJrQ6SgDkihl3aCj74IEte2MWN78sHvLLTWTAkiQSlGf1Zb0durw+OvlunQ2AKbK79Qv0Q+wwGuK+oymWc3GSdP1wZqk9dhrQxb3FtdU2tMke01QTut6wr7ig=="
159
- ],
162
+ ],
160
163
"x5t" : "dEtpjbEvbhfgwUI-bdK5xAU_9UQ"
161
- }
162
- ]
163
- }
164
+ }
165
+ ]
166
+ }
164
167
165
168
SIGJWKS = KeyBundle (JWKS_b )
166
169
@@ -174,7 +177,7 @@ def test_1():
174
177
"iss" : "joe" ,
175
178
"exp" : 1300819380 ,
176
179
"http://example.com/is_root" : True
177
- }
180
+ }
178
181
179
182
_jws = JWS (claimset , cty = "JWT" , alg = 'none' )
180
183
_jwt = _jws .sign_compact ()
@@ -372,7 +375,7 @@ def test_jws_mm():
372
375
(ec .SECP256R1 , "ES256" ),
373
376
(ec .SECP384R1 , "ES384" ),
374
377
(ec .SECP521R1 , "ES512" ),
375
- ])
378
+ ])
376
379
def test_signer_es (ec_func , alg ):
377
380
payload = "Please take a moment to register today"
378
381
eck = ec .generate_private_key (ec_func (), default_backend ())
@@ -492,8 +495,8 @@ def test_sign_2():
492
495
"kid" : "af22448d-4c7b-464d-b63a-f5bd90f6d7d1" ,
493
496
"n" : "o9g8DpUwBW6B1qmcm-TfEh4rNX7n1t38jdo4Gkl_cI3q"
494
497
"--7n0Blg0kN88LHZvyZjUB2NhBdFYNxMP8ucy0dOXvWGWzaPmGnq3DM__lN8P4WjD1cCTAVEYKawNBAmGKqrFj1SgpPNsSqiqK-ALM1w6mZ-QGimjOgwCyJy3l9lzZh5D8tKnS2t1pZgE0X5P7lZQWHYpHPqp4jKhETzrCpPGfv0Rl6nmmjp7NlRYBkWKf_HEKE333J6M039m2FbKgxrBg3zmYYpmHuMzVgxxb8LSiv5aqyeyJjxM-YDUAgNQBfKNhONqXyu9DqtSprNkw6sqmuxK0QUVrNYl3b03PgS5Q"
495
- }]
496
- }
498
+ }]
499
+ }
497
500
498
501
keys = KeyBundle (keyset )
499
502
jws = JWS ("payload" , alg = "RS512" )
@@ -538,8 +541,8 @@ def test_verify_protected_headers():
538
541
header = dict (alg = u"ES256" , jwk = _key .serialize ()),
539
542
protected = protectedHeader ,
540
543
signature = sig ,
541
- )
542
- ])
544
+ )
545
+ ])
543
546
544
547
# _pub_key = ECKey().load_key(eck.public_key())
545
548
_jws = JWS ()
@@ -574,7 +577,13 @@ def test_verify_json():
574
577
keys = [key ])
575
578
576
579
vkeys = [ECKey ().load_key (eck .public_key ())]
577
- assert JWS ().verify_json (_jwt , keys = vkeys )
580
+ _jws = JWS ()
581
+ assert _jws .verify_json (_jwt , keys = vkeys )
582
+ # alg is always protected by default
583
+ _protected = _jws .protected_headers ()
584
+ assert set (_protected .keys ()) == {'foo' , 'alg' }
585
+ assert _protected ['foo' ] == protected_headers ["foo" ]
586
+ assert _protected ['alg' ] == "ES256"
578
587
579
588
580
589
def test_sign_json_dont_include_empty_unprotected_headers ():
@@ -631,7 +640,9 @@ def test_verify_json_flattened_syntax():
631
640
keys = [key ], flatten = True )
632
641
633
642
vkeys = [ECKey ().load_key (key .public_key ())]
634
- assert JWS ().verify_json (_jwt , keys = vkeys )
643
+ _jws = JWS ()
644
+ assert _jws .verify_json (_jwt , keys = vkeys )
645
+ assert _jws .protected_headers () == {'alg' : "ES256" , 'foo' : 'bar' }
635
646
636
647
637
648
def test_sign_json_dont_flatten_if_multiple_signatures ():
0 commit comments