Skip to content

Commit 24ed616

Browse files
committed
Tests for finding out if a token is a compact JWS, json JWS or a JWE. Not the absolute truth but a reasonable assumption.
1 parent 4fb4513 commit 24ed616

File tree

3 files changed

+174
-31
lines changed

3 files changed

+174
-31
lines changed

src/cryptojwt/utils.py

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
import base64
2+
from binascii import unhexlify
23
import cgi
34
import functools
45
import importlib
56
import json
67
import re
78
import struct
8-
import warnings
9-
from binascii import unhexlify
109
from typing import List
10+
import warnings
1111

1212
from cryptojwt.exception import BadSyntax
1313

1414
DEFAULT_HTTPC_TIMEOUT = 10
1515

16+
1617
# ---------------------------------------------------------------------------
1718
# Helper functions
1819

@@ -193,7 +194,7 @@ def split_token(token):
193194

194195
def deser(val):
195196
"""
196-
Deserialize from a string representation of an long integer
197+
Deserialize from a string representation of a long integer
197198
to the python representation of a long integer.
198199
199200
:param val: The string representation of the long integer.
@@ -212,12 +213,12 @@ def modsplit(name):
212213
if ":" in name:
213214
_part = name.split(":")
214215
if len(_part) != 2:
215-
raise ValueError(f"Syntax error: {s}")
216+
raise ValueError(f"Syntax error: {name}")
216217
return _part[0], _part[1]
217218

218219
_part = name.split(".")
219220
if len(_part) < 2:
220-
raise ValueError(f"Syntax error: {s}")
221+
raise ValueError(f"Syntax error: {name}")
221222

222223
return ".".join(_part[:-1]), _part[-1]
223224

@@ -271,3 +272,84 @@ def check_content_type(content_type, mime_type):
271272
"""Return True if the content type contains the MIME type"""
272273
mt, _ = cgi.parse_header(content_type)
273274
return mime_type == mt
275+
276+
277+
def is_compact_jws(token):
278+
token = as_bytes(token)
279+
280+
try:
281+
part = split_token(token)
282+
except BadSyntax:
283+
return False
284+
285+
# Should be three parts
286+
if len(part) != 3:
287+
return False
288+
289+
# All base64 encoded
290+
try:
291+
part = [b64d(p) for p in part]
292+
except Exception:
293+
return False
294+
295+
# header should be a JSON object, 'alg' most be one parameter
296+
try:
297+
_header = json.loads(part[0])
298+
except Exception:
299+
return False
300+
301+
if 'alg' not in _header:
302+
return False
303+
304+
return True
305+
306+
def is_jwe(token):
307+
token = as_bytes(token)
308+
309+
try:
310+
part = split_token(token)
311+
except BadSyntax:
312+
return False
313+
314+
# Should be five parts
315+
if len(part) != 5:
316+
return False
317+
318+
# All base64 encoded
319+
try:
320+
part = [b64d(p) for p in part]
321+
except Exception:
322+
return False
323+
324+
# header should be a JSON object, 'alg' most be one parameter
325+
try:
326+
_header = json.loads(part[0])
327+
except Exception:
328+
return False
329+
330+
if 'alg' not in _header or 'enc' not in _header:
331+
return False
332+
333+
return True
334+
335+
def is_json_jws(token):
336+
if isinstance(token, str):
337+
try:
338+
token = json.loads(token)
339+
except Exception:
340+
return False
341+
342+
for arg in ['payload', 'signatures']:
343+
if arg not in token:
344+
return False
345+
346+
if not isinstance(token['signatures'], list):
347+
return False
348+
349+
for sign in token['signatures']:
350+
if not isinstance(sign, dict):
351+
return False
352+
if 'signature' not in sign:
353+
return False
354+
355+
return True

tests/test_06_jws.py

Lines changed: 79 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import json
44
import os.path
55

6-
import pytest
76
from cryptography.hazmat.backends import default_backend
87
from cryptography.hazmat.primitives.asymmetric import ec
8+
from jwkest import as_bytes
9+
import pytest
910

11+
from cryptojwt import as_unicode
1012
from cryptojwt.exception import BadSignature
1113
from cryptojwt.exception import UnknownAlgorithm
1214
from cryptojwt.exception import WrongNumberOfParts
@@ -18,8 +20,8 @@
1820
from cryptojwt.jws.exception import NoSuitableSigningKeys
1921
from cryptojwt.jws.exception import SignerAlgError
2022
from cryptojwt.jws.jws import JWS
21-
from cryptojwt.jws.jws import SIGNER_ALGS
2223
from cryptojwt.jws.jws import JWSig
24+
from cryptojwt.jws.jws import SIGNER_ALGS
2325
from cryptojwt.jws.jws import factory
2426
from cryptojwt.jws.rsa import RSASigner
2527
from cryptojwt.jws.utils import left_hash
@@ -29,6 +31,8 @@
2931
from cryptojwt.utils import b64d_enc_dec
3032
from cryptojwt.utils import b64e
3133
from cryptojwt.utils import intarr2bin
34+
from cryptojwt.utils import is_compact_jws
35+
from cryptojwt.utils import is_json_jws
3236

3337
BASEDIR = os.path.abspath(os.path.dirname(__file__))
3438

@@ -130,8 +134,8 @@ def full_path(local_file):
130134
"kty": "RSA",
131135
"alg": "RSA256",
132136
"n": "qYJqXTXsDroPYyQBBmSolK3bJtrSerEm"
133-
"-nrmbSpfn8Rz3y3oXLydvUqj8869PkcEzoJIY5Xf7xDN1Co_qyT9qge"
134-
"-3C6DEwGVHXOwRoXRGQ_h50Vsh60MB5MIuDN188EeZnQ30dtCTBB9KDTSEA2DunplhwLCq4xphnMNUaeHdEk",
137+
"-nrmbSpfn8Rz3y3oXLydvUqj8869PkcEzoJIY5Xf7xDN1Co_qyT9qge"
138+
"-3C6DEwGVHXOwRoXRGQ_h50Vsh60MB5MIuDN188EeZnQ30dtCTBB9KDTSEA2DunplhwLCq4xphnMNUaeHdEk",
135139
"kid": "rsa1",
136140
},
137141
{
@@ -144,7 +148,8 @@ def full_path(local_file):
144148
JWKS_b = {
145149
"keys": [
146150
{
147-
"n": b"zkpUgEgXICI54blf6iWiD2RbMDCOO1jV0VSff1MFFnujM4othfMsad7H1kRo50YM5S_X9TdvrpdOfpz5aBaKFhT6Ziv0nhtcekq1eRl8mjBlvGKCE5XGk-0LFSDwvqgkJoFYInq7bu0a4JEzKs5AyJY75YlGh879k1Uu2Sv3ZZOunfV1O1Orta-NvS-aG_jN5cstVbCGWE20H0vFVrJKNx0Zf-u-aA-syM4uX7wdWgQ-owoEMHge0GmGgzso2lwOYf_4znanLwEuO3p5aabEaFoKNR4K6GjQcjBcYmDEE4CtfRU9AEmhcD1kleiTB9TjPWkgDmT9MXsGxBHf3AKT5w",
151+
"n":
152+
b"zkpUgEgXICI54blf6iWiD2RbMDCOO1jV0VSff1MFFnujM4othfMsad7H1kRo50YM5S_X9TdvrpdOfpz5aBaKFhT6Ziv0nhtcekq1eRl8mjBlvGKCE5XGk-0LFSDwvqgkJoFYInq7bu0a4JEzKs5AyJY75YlGh879k1Uu2Sv3ZZOunfV1O1Orta-NvS-aG_jN5cstVbCGWE20H0vFVrJKNx0Zf-u-aA-syM4uX7wdWgQ-owoEMHge0GmGgzso2lwOYf_4znanLwEuO3p5aabEaFoKNR4K6GjQcjBcYmDEE4CtfRU9AEmhcD1kleiTB9TjPWkgDmT9MXsGxBHf3AKT5w",
148153
"e": b"AQAB",
149154
"kty": "RSA",
150155
"kid": "rsa1",
@@ -173,7 +178,8 @@ def full_path(local_file):
173178
"issuer": "https://login.microsoftonline.com/{tenantid}/v2.0/",
174179
"kid": "kriMPdmBvx68skT8-mPAB3BseeA",
175180
"kty": "RSA",
176-
"n": "kSCWg6q9iYxvJE2NIhSyOiKvqoWCO2GFipgH0sTSAs5FalHQosk9ZNTztX0ywS_AHsBeQPqYygfYVJL6_EgzVuwRk5txr9e3n1uml94fLyq_AXbwo9yAduf4dCHTP8CWR1dnDR-Qnz_4PYlWVEuuHHONOw_blbfdMjhY-C_BYM2E3pRxbohBb3x__CfueV7ddz2LYiH3wjz0QS_7kjPiNCsXcNyKQEOTkbHFi3mu0u13SQwNddhcynd_GTgWN8A-6SN1r4hzpjFKFLbZnBt77ACSiYx-IHK4Mp-NaVEi5wQtSsjQtI--XsokxRDqYLwus1I1SihgbV_STTg5enufuw",
181+
"n":
182+
"kSCWg6q9iYxvJE2NIhSyOiKvqoWCO2GFipgH0sTSAs5FalHQosk9ZNTztX0ywS_AHsBeQPqYygfYVJL6_EgzVuwRk5txr9e3n1uml94fLyq_AXbwo9yAduf4dCHTP8CWR1dnDR-Qnz_4PYlWVEuuHHONOw_blbfdMjhY-C_BYM2E3pRxbohBb3x__CfueV7ddz2LYiH3wjz0QS_7kjPiNCsXcNyKQEOTkbHFi3mu0u13SQwNddhcynd_GTgWN8A-6SN1r4hzpjFKFLbZnBt77ACSiYx-IHK4Mp-NaVEi5wQtSsjQtI--XsokxRDqYLwus1I1SihgbV_STTg5enufuw",
177183
"use": "sig",
178184
"x5c": [
179185
"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"
@@ -186,8 +192,8 @@ def full_path(local_file):
186192
"kid": "MnC_VZcATfM5pOYiJHMba9goEKY",
187193
"kty": "RSA",
188194
"n": "vIqz-4-ER_vNWLON9yv8hIYV737JQ6rCl6XfzOC628seYUPf0TaGk91CFxefhzh23V9Tkq"
189-
"-RtwN1Vs_z57hO82kkzL-cQHZX3bMJD-GEGOKXCEXURN7VMyZWMAuzQoW9vFb1k3cR1RW_EW_P"
190-
"-C8bb2dCGXhBYqPfHyimvz2WarXhntPSbM5XyS5v5yCw5T_Vuwqqsio3V8wooWGMpp61y12NhN8bNVDQAkDPNu2DT9DXB1g0CeFINp_KAS_qQ2Kq6TSvRHJqxRR68RezYtje9KAqwqx4jxlmVAQy0T3-T-IAbsk1wRtWDndhO6s1Os-dck5TzyZ_dNOhfXgelixLUQ",
195+
"-RtwN1Vs_z57hO82kkzL-cQHZX3bMJD-GEGOKXCEXURN7VMyZWMAuzQoW9vFb1k3cR1RW_EW_P"
196+
"-C8bb2dCGXhBYqPfHyimvz2WarXhntPSbM5XyS5v5yCw5T_Vuwqqsio3V8wooWGMpp61y12NhN8bNVDQAkDPNu2DT9DXB1g0CeFINp_KAS_qQ2Kq6TSvRHJqxRR68RezYtje9KAqwqx4jxlmVAQy0T3-T-IAbsk1wRtWDndhO6s1Os-dck5TzyZ_dNOhfXgelixLUQ",
191197
"use": "sig",
192198
"x5c": [
193199
"MIIC4jCCAcqgAwIBAgIQQNXrmzhLN4VGlUXDYCRT3zANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTE0MTAyODAwMDAwMFoXDTE2MTAyNzAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALyKs/uPhEf7zVizjfcr/ISGFe9+yUOqwpel38zgutvLHmFD39E2hpPdQhcXn4c4dt1fU5KvkbcDdVbP8+e4TvNpJMy/nEB2V92zCQ/hhBjilwhF1ETe1TMmVjALs0KFvbxW9ZN3EdUVvxFvz/gvG29nQhl4QWKj3x8opr89lmq14Z7T0mzOV8kub+cgsOU/1bsKqrIqN1fMKKFhjKaetctdjYTfGzVQ0AJAzzbtg0/Q1wdYNAnhSDafygEv6kNiquk0r0RyasUUevEXs2LY3vSgKsKseI8ZZlQEMtE9/k/iAG7JNcEbVg53YTurNTrPnXJOU88mf3TToX14HpYsS1ECAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAfolx45w0i8CdAUjjeAaYdhG9+NDHxop0UvNOqlGqYJexqPLuvX8iyUaYxNGzZxFgGI3GpKfmQP2JQWQ1E5JtY/n8iNLOKRMwqkuxSCKJxZJq4Sl/m/Yv7TS1P5LNgAj8QLCypxsWrTAmq2HSpkeSk4JBtsYxX6uhbGM/K1sEktKybVTHu22/7TmRqWTmOUy9wQvMjJb2IXdMGLG3hVntN/WWcs5w8vbt1i8Kk6o19W2MjZ95JaECKjBDYRlhG1KmSBtrsKsCBQoBzwH/rXfksTO9JoUYLXiW0IppB7DhNH4PJ5hZI91R8rR0H3/bKkLSuDaKLWSqMhozdhXsIIKvJQ=="
@@ -197,12 +203,12 @@ def full_path(local_file):
197203
{
198204
"e": "AQAB",
199205
"issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b"
200-
"-b112-36a304b66dad/v2.0/",
206+
"-b112-36a304b66dad/v2.0/",
201207
"kid": "GvnPApfWMdLRi8PDmisFn7bprKg",
202208
"kty": "RSA",
203209
"n": "5ymq_xwmst1nstPr8YFOTyD1J5N4idYmrph7AyAv95RbWXfDRqy8CMRG7sJq"
204-
"-UWOKVOA4MVrd_NdV-ejj1DE5MPSiG"
205-
"-mZK_5iqRCDFvPYqOyRj539xaTlARNY4jeXZ0N6irZYKqSfYACjkkKxbLKcijSu1pJ48thXOTED0oNa6U",
210+
"-UWOKVOA4MVrd_NdV-ejj1DE5MPSiG"
211+
"-mZK_5iqRCDFvPYqOyRj539xaTlARNY4jeXZ0N6irZYKqSfYACjkkKxbLKcijSu1pJ48thXOTED0oNa6U",
206212
"use": "sig",
207213
"x5c": [
208214
"MIICWzCCAcSgAwIBAgIJAKVzMH2FfC12MA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xMzExMTExODMzMDhaFw0xNjExMTAxODMzMDhaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5ymq/xwmst1nstPr8YFOTyD1J5N4idYmrph7AyAv95RbWXfDRqy8CMRG7sJq+UWOKVOA4MVrd/NdV+ejj1DE5MPSiG+mZK/5iqRCDFvPYqOyRj539xaTlARNY4jeXZ0N6irZYKqSfYACjkkKxbLKcijSu1pJ48thXOTED0oNa6UCAwEAAaOBijCBhzAdBgNVHQ4EFgQURCN+4cb0pvkykJCUmpjyfUfnRMowWQYDVR0jBFIwUIAURCN+4cb0pvkykJCUmpjyfUfnRMqhLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAKVzMH2FfC12MAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOBgQB8v8G5/vUl8k7xVuTmMTDA878AcBKBrJ/Hp6RShmdqEGVI7SFR7IlBN1//NwD0n+IqzmnRV2PPZ7iRgMF/Fyvqi96Gd8X53ds/FaiQpZjUUtcO3fk0hDRQPtCYMII5jq+YAYjSybvF84saB7HGtucVRn2nMZc5cAC42QNYIlPMqA=="
@@ -212,10 +218,11 @@ def full_path(local_file):
212218
{
213219
"e": "AQAB",
214220
"issuer": "https://login.microsoftonline.com/9188040d-6c67-4c5b"
215-
"-b112-36a304b66dad/v2.0/",
221+
"-b112-36a304b66dad/v2.0/",
216222
"kid": "dEtpjbEvbhfgwUI-bdK5xAU_9UQ",
217223
"kty": "RSA",
218-
"n": "x7HNcD9ZxTFRaAgZ7-gdYLkgQua3zvQseqBJIt8Uq3MimInMZoE9QGQeSML7qZPlowb5BUakdLI70ayM4vN36--0ht8-oCHhl8YjGFQkU-Iv2yahWHEP-1EK6eOEYu6INQP9Lk0HMk3QViLwshwb-KXVD02jdmX2HNdYJdPyc0c",
224+
"n":
225+
"x7HNcD9ZxTFRaAgZ7-gdYLkgQua3zvQseqBJIt8Uq3MimInMZoE9QGQeSML7qZPlowb5BUakdLI70ayM4vN36--0ht8-oCHhl8YjGFQkU-Iv2yahWHEP-1EK6eOEYu6INQP9Lk0HMk3QViLwshwb-KXVD02jdmX2HNdYJdPyc0c",
219226
"use": "sig",
220227
"x5c": [
221228
"MIICWzCCAcSgAwIBAgIJAL3MzqqEFMYjMA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xMzExMTExOTA1MDJaFw0xOTExMTAxOTA1MDJaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAx7HNcD9ZxTFRaAgZ7+gdYLkgQua3zvQseqBJIt8Uq3MimInMZoE9QGQeSML7qZPlowb5BUakdLI70ayM4vN36++0ht8+oCHhl8YjGFQkU+Iv2yahWHEP+1EK6eOEYu6INQP9Lk0HMk3QViLwshwb+KXVD02jdmX2HNdYJdPyc0cCAwEAAaOBijCBhzAdBgNVHQ4EFgQULR0aj9AtiNMgqIY8ZyXZGsHcJ5gwWQYDVR0jBFIwUIAULR0aj9AtiNMgqIY8ZyXZGsHcJ5ihLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJAL3MzqqEFMYjMAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOBgQBshrsF9yls4ArxOKqXdQPDgHrbynZL8m1iinLI4TeSfmTCDevXVBJrQ6SgDkihl3aCj74IEte2MWN78sHvLLTWTAkiQSlGf1Zb0durw+OvlunQ2AKbK79Qv0Q+wwGuK+oymWc3GSdP1wZqk9dhrQxb3FtdU2tMke01QTut6wr7ig=="
@@ -232,11 +239,11 @@ def full_path(local_file):
232239
"kid": "R3NJRW1EVHRsaUcwSXVydi14cVVoTmxhaU4zckU1MlFPa05NWGNpUUZtcw",
233240
"kty": "RSA",
234241
"n": "rp7aJD9FKKHQgLTeXLMyjB5TS51x_KqA15gBJHF2Ps-rrmcBujpMAi39D7w4"
235-
"SArr9X7DPgHekTPRV6-i46TyqnY1EXPGRb0nCg0rCmkyOAMysXhhuexu3vS7"
236-
"Fa2YPvX2zpl5svdkOOwLmHBplCTtvScz-L7N1xeknauOLF5Ct39C5Ipv-BWx"
237-
"bNrqD68uIPSOH9ZsoGKVArSI0MSmw5LB7B3i30D8FvmlJyxcEPZOFVahFCmS"
238-
"qqUXHuXV2Z0BpvgvDhzB5cSNO12clwD_fZ4CnbvuvfbBAgpVg774smz2z3ov"
239-
"6SsZ6ZD5Tc_9gE2ryLW6x0RS1y2KSME8EUI2sdJYZw",
242+
"SArr9X7DPgHekTPRV6-i46TyqnY1EXPGRb0nCg0rCmkyOAMysXhhuexu3vS7"
243+
"Fa2YPvX2zpl5svdkOOwLmHBplCTtvScz-L7N1xeknauOLF5Ct39C5Ipv-BWx"
244+
"bNrqD68uIPSOH9ZsoGKVArSI0MSmw5LB7B3i30D8FvmlJyxcEPZOFVahFCmS"
245+
"qqUXHuXV2Z0BpvgvDhzB5cSNO12clwD_fZ4CnbvuvfbBAgpVg774smz2z3ov"
246+
"6SsZ6ZD5Tc_9gE2ryLW6x0RS1y2KSME8EUI2sdJYZw",
240247
"x5c": [
241248
"MIIDOjCCAiKgAwIBAgIUJACZrVNr3gHJrde3OkQwy1lXL6owDQYJKoZIhvcN"
242249
"AQELBQAwSjELMAkGA1UEBhMCU0UxDjAMBgNVBAcMBVVtZcOlMRgwFgYDVQQK"
@@ -266,11 +273,11 @@ def full_path(local_file):
266273
"kid": "d1Z6RTJHQmh0NnBaeHpfYVd0U1dIb25fUTQ1aVhjNXFhWHEyTE4wbVh5bw",
267274
"kty": "RSA",
268275
"n": "zpQAmVzABLrRWV6HiBVbFeho_KhQhm8T_r6LvGP-Znnewpr6J7lBYD9gfVJo2_"
269-
"lOpCqitJvoMJoZxoULJ1xU_Am4padc-as8Sk9vb3FkvxoDrZFByNgmbrNTJCco"
270-
"wUBLTgb1wWde1CPNmr_U_-VBODOy17uTrt7DNEMqEwUi3Qb76J8duHVQT0ECcw"
271-
"crGXbsfV74jSaBAehHxlTt4tG4-LVC9I0IFs9bBykdZVh59uwtaKTlBNuC5frt"
272-
"kGyn_2TM1zCWSVparxqQ_T3e_g2NOr3v5fW_gjDsYZ2543DrE8ta_OCyrqw4wz"
273-
"fBEOb6raI6wCyqFQ5My1bz-qVTap-4hQ",
276+
"lOpCqitJvoMJoZxoULJ1xU_Am4padc-as8Sk9vb3FkvxoDrZFByNgmbrNTJCco"
277+
"wUBLTgb1wWde1CPNmr_U_-VBODOy17uTrt7DNEMqEwUi3Qb76J8duHVQT0ECcw"
278+
"crGXbsfV74jSaBAehHxlTt4tG4-LVC9I0IFs9bBykdZVh59uwtaKTlBNuC5frt"
279+
"kGyn_2TM1zCWSVparxqQ_T3e_g2NOr3v5fW_gjDsYZ2543DrE8ta_OCyrqw4wz"
280+
"fBEOb6raI6wCyqFQ5My1bz-qVTap-4hQ",
274281
"x5c": [
275282
"MIIDPjCCAiagAwIBAgIUB70yEjwKX+/dUw4YvP61BKpDHJQwDQYJKoZIhvcNAQ"
276283
"ELBQAwTDELMAkGA1UEBhMCVVMxEDAOBgNVBAcMB1NlYXR0bGUxGDAWBgNVBAoM"
@@ -297,7 +304,6 @@ def full_path(local_file):
297304
]
298305
}
299306

300-
301307
SIGJWKS = KeyBundle(JWKS_b)
302308

303309

@@ -621,12 +627,12 @@ def test_sign_2():
621627
"alg": "RS512",
622628
"kty": "RSA",
623629
"d": "ckLyXxkbjC4szg8q8G0ERBZV"
624-
"-9CszeOxpRtx1KM9BLl0Do3li_Km2vvFvfXJ7MxQpiZ18pBoCcyYQEU262ym8wI22JWMPrZe24HCNxLxqzr_JEuBhpKFxQF6EFTSvJEJD1FkoTuCTvN0zD7YHGaJQG6JzVEuFUY3ewxjH0FYNa_ppTnPP3LC-T9u_GX9Yqyuw1KOYoHSzhWSWQOeAgs4dH9-iAxN1wdZ6eH1jFWAs43svk_rhwdgyJMlihFtV9MAInBlfi_Zu8wRVhVl5urkJrLf0tGFnMbnzb6dYSlUXxEYClpY12W7kXW9aePDqkCwI4oZyxmOmgq4hunKGR1dAQ",
630+
"-9CszeOxpRtx1KM9BLl0Do3li_Km2vvFvfXJ7MxQpiZ18pBoCcyYQEU262ym8wI22JWMPrZe24HCNxLxqzr_JEuBhpKFxQF6EFTSvJEJD1FkoTuCTvN0zD7YHGaJQG6JzVEuFUY3ewxjH0FYNa_ppTnPP3LC-T9u_GX9Yqyuw1KOYoHSzhWSWQOeAgs4dH9-iAxN1wdZ6eH1jFWAs43svk_rhwdgyJMlihFtV9MAInBlfi_Zu8wRVhVl5urkJrLf0tGFnMbnzb6dYSlUXxEYClpY12W7kXW9aePDqkCwI4oZyxmOmgq4hunKGR1dAQ",
625631
"e": "AQAB",
626632
"use": "sig",
627633
"kid": "af22448d-4c7b-464d-b63a-f5bd90f6d7d1",
628634
"n": "o9g8DpUwBW6B1qmcm-TfEh4rNX7n1t38jdo4Gkl_cI3q"
629-
"--7n0Blg0kN88LHZvyZjUB2NhBdFYNxMP8ucy0dOXvWGWzaPmGnq3DM__lN8P4WjD1cCTAVEYKawNBAmGKqrFj1SgpPNsSqiqK-ALM1w6mZ-QGimjOgwCyJy3l9lzZh5D8tKnS2t1pZgE0X5P7lZQWHYpHPqp4jKhETzrCpPGfv0Rl6nmmjp7NlRYBkWKf_HEKE333J6M039m2FbKgxrBg3zmYYpmHuMzVgxxb8LSiv5aqyeyJjxM-YDUAgNQBfKNhONqXyu9DqtSprNkw6sqmuxK0QUVrNYl3b03PgS5Q",
635+
"--7n0Blg0kN88LHZvyZjUB2NhBdFYNxMP8ucy0dOXvWGWzaPmGnq3DM__lN8P4WjD1cCTAVEYKawNBAmGKqrFj1SgpPNsSqiqK-ALM1w6mZ-QGimjOgwCyJy3l9lzZh5D8tKnS2t1pZgE0X5P7lZQWHYpHPqp4jKhETzrCpPGfv0Rl6nmmjp7NlRYBkWKf_HEKE333J6M039m2FbKgxrBg3zmYYpmHuMzVgxxb8LSiv5aqyeyJjxM-YDUAgNQBfKNhONqXyu9DqtSprNkw6sqmuxK0QUVrNYl3b03PgS5Q",
630636
}
631637
]
632638
}
@@ -1020,3 +1026,50 @@ def test_verify_json_missing_key():
10201026

10211027
# With both
10221028
assert JWS().verify_json(_jwt, keys=[vkeys[0], sym_key])
1029+
1030+
1031+
def test_is_compact_jws():
1032+
_header = {"foo": "bar", "alg": "HS384"}
1033+
_payload = "hello world"
1034+
_sym_key = SYMKey(key=b"My hollow echo chamber", alg="HS384")
1035+
1036+
_jwt = JWS(msg=_payload, alg='HS384').sign_compact(keys=[_sym_key])
1037+
1038+
assert is_compact_jws(_jwt)
1039+
1040+
# Faulty examples
1041+
1042+
# to few parts
1043+
assert is_compact_jws('abc.def') is False
1044+
1045+
# right number of parts but not base64
1046+
1047+
assert is_compact_jws('abc.def.ghi') is False
1048+
1049+
# not base64 illegal characters
1050+
assert is_compact_jws('abc.::::.ghi') is False
1051+
1052+
# Faulty header
1053+
_faulty_header = {'foo': 'bar'} # alg is a MUST
1054+
_jwt = ".".join([as_unicode(b64e(as_bytes(json.dumps(_faulty_header)))), 'def', 'ghi'])
1055+
assert is_compact_jws(_jwt) is False
1056+
1057+
1058+
def test_is_json_jws():
1059+
ec_key = ECKey().load_key(P256())
1060+
sym_key = SYMKey(key=b"My hollow echo chamber", alg="HS384")
1061+
1062+
protected_headers_1 = {"foo": "bar", "alg": "ES256"}
1063+
unprotected_headers_1 = {"abc": "xyz"}
1064+
protected_headers_2 = {"foo": "bar", "alg": "HS384"}
1065+
unprotected_headers_2 = {"abc": "zeb"}
1066+
payload = "hello world"
1067+
_jwt = JWS(msg=payload).sign_json(
1068+
headers=[
1069+
(protected_headers_1, unprotected_headers_1),
1070+
(protected_headers_2, unprotected_headers_2),
1071+
],
1072+
keys=[ec_key, sym_key],
1073+
)
1074+
1075+
assert is_json_jws(_jwt)

tests/test_07_jwe.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737

3838
__author__ = "rohe0002"
3939

40+
from cryptojwt.utils import is_jwe
41+
4042

4143
def rndstr(size=16):
4244
"""
@@ -717,3 +719,9 @@ def test_fernet_blake2s():
717719
decrypter = encrypter
718720
resp = decrypter.decrypt(_token)
719721
assert resp == plain
722+
723+
def test_is_jwe():
724+
encryption_key = SYMKey(use="enc", key="DukeofHazardpass", kid="some-key-id")
725+
jwe = JWE(plain, alg="A128KW", enc="A128CBC-HS256")
726+
_jwe = jwe.encrypt(keys=[encryption_key], kid="some-key-id")
727+
assert is_jwe(_jwe)

0 commit comments

Comments
 (0)