Skip to content

Commit 9844e19

Browse files
authored
Merge pull request #434 from dajiaji/v2_5_1
Bump version to v2.5.1.
2 parents 08bc3da + 7ec38e7 commit 9844e19

9 files changed

Lines changed: 337 additions & 322 deletions

File tree

.pre-commit-config.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ repos:
66
args: [--line-length, "128"]
77

88
- repo: https://github.com/asottile/blacken-docs
9-
rev: 1.15.0
9+
rev: 1.16.0
1010
hooks:
1111
- id: blacken-docs
1212

1313
- repo: https://github.com/PyCQA/flake8
14-
rev: 6.0.0
14+
rev: 6.1.0
1515
hooks:
1616
- id: flake8
1717
args: [--ignore, "E203,E501,B006,W503"]
@@ -24,7 +24,7 @@ repos:
2424
args: [--profile, "black"]
2525

2626
- repo: https://github.com/pre-commit/mirrors-mypy
27-
rev: v1.4.1
27+
rev: v1.5.1
2828
hooks:
2929
- id: mypy
3030
args: [--ignore-missing-imports]

CHANGES.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@ Changes
44
Unreleased
55
----------
66

7+
Version 2.5.1
8+
-------------
9+
10+
Released 2023-09-23
11+
12+
- Update dependencies.
13+
- Bump cryptography to 41.0.4. `#433 <https://github.com/dajiaji/python-cwt/pull/433>`__
14+
- Update dev dependencies.
15+
- Bump pre-commit/blacken-docs to 1.15.0. `#434 <https://github.com/dajiaji/python-cwt/pull/434>`__
16+
- Bump pre-commit/flake8 to 6.1.0. `#434 <https://github.com/dajiaji/python-cwt/pull/434>`__
17+
- Bump pre-commit/mirrors-mypy to 1.5.1. `#434 <https://github.com/dajiaji/python-cwt/pull/434>`__
18+
- Bump tox to 4.11.3. `#432 <https://github.com/dajiaji/python-cwt/pull/432>`__
19+
720
Version 2.5.0
821
-------------
922

README.md

Lines changed: 79 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,14 @@ from cwt import COSEKey, CWTClaims
6464
mac_key = COSEKey.generate_symmetric_key(alg="HS256", kid="01")
6565

6666
# The sender side:
67-
token = encode({
68-
CWTClaims.ISS: "coaps://as.example",
69-
CWTClaims.SUB: "dajiaji",
70-
CWTClaims.CTI: b"123"}, mac_key)
67+
token = encode(
68+
{
69+
CWTClaims.ISS: "coaps://as.example",
70+
CWTClaims.SUB: "dajiaji",
71+
CWTClaims.CTI: b"123",
72+
},
73+
mac_key,
74+
)
7175

7276
# The recipient side:
7377
decoded = decode(token, mac_key)
@@ -285,7 +289,9 @@ mac_key = COSEKey.generate_symmetric_key(alg="HS512", kid="01")
285289
r = Recipient.new(unprotected={"alg": "direct", "kid": mac_key.kid})
286290

287291
sender = COSE.new()
288-
encoded = sender.encode(b"Hello world!", mac_key, protected={"alg": "HS512"}, recipients=[r])
292+
encoded = sender.encode(
293+
b"Hello world!", mac_key, protected={"alg": "HS512"}, recipients=[r]
294+
)
289295

290296
# The recipient side:
291297
recipient = COSE.new()
@@ -319,7 +325,9 @@ encoded = sender.encode(
319325

320326
# The recipient side:
321327
recipient = COSE.new()
322-
assert b"Hello world!" == recipient.decode(encoded, shared_key, context={"alg": "HS256"})
328+
assert b"Hello world!" == recipient.decode(
329+
encoded, shared_key, context={"alg": "HS256"}
330+
)
323331
```
324332

325333
#### AES Key Wrap for MAC
@@ -463,7 +471,9 @@ mac_key = COSEKey.generate_symmetric_key(alg="HS256", kid="01")
463471
# The sender side:
464472
r = Recipient.new(unprotected={"alg": "direct", "kid": mac_key.kid})
465473
sender = COSE.new()
466-
encoded = sender.encode(b"Hello world!", mac_key, protected={"alg": "HS256"}, recipients=[r])
474+
encoded = sender.encode(
475+
b"Hello world!", mac_key, protected={"alg": "HS256"}, recipients=[r]
476+
)
467477

468478
# The notary side:
469479
notary = Signer.from_jwk(
@@ -762,7 +772,9 @@ encoded = sender.encode(
762772

763773
# The recipient side:
764774
recipient = COSE.new()
765-
assert b"Hello world!" == recipient.decode(encoded, shared_key, context={"alg": "A256GCM"})
775+
assert b"Hello world!" == recipient.decode(
776+
encoded, shared_key, context={"alg": "A256GCM"}
777+
)
766778
```
767779

768780
#### AES Key Wrap for encryption
@@ -816,9 +828,9 @@ pub_key = COSEKey.from_jwk(
816828
}
817829
)
818830
r = Recipient.new(
819-
unprotected={"alg": "ECDH-ES+HKDF-256"},
820-
recipient_key=pub_key,
821-
context={"alg": "A128GCM"},
831+
unprotected={"alg": "ECDH-ES+HKDF-256"},
832+
recipient_key=pub_key,
833+
context={"alg": "A128GCM"},
822834
)
823835
sender = COSE.new(alg_auto_inclusion=True)
824836
encoded = sender.encode(
@@ -839,7 +851,9 @@ priv_key = COSEKey.from_jwk(
839851
"d": "r_kHyZ-a06rmxM3yESK84r1otSg-aQcVStkRhA-iCM8",
840852
}
841853
)
842-
assert b"Hello world!" == recipient.decode(encoded, priv_key, context={"alg": "A128GCM"})
854+
assert b"Hello world!" == recipient.decode(
855+
encoded, priv_key, context={"alg": "A128GCM"}
856+
)
843857
```
844858

845859
#### Key Agreement with Key Wrap for encryption
@@ -870,10 +884,10 @@ s_priv_key = COSEKey.from_jwk(
870884
}
871885
)
872886
r = Recipient.new(
873-
unprotected={"alg": "ECDH-SS+A128KW"},
874-
sender_key=s_priv_key,
875-
recipient_key=r_pub_key,
876-
context={"alg": "A128GCM"},
887+
unprotected={"alg": "ECDH-SS+A128KW"},
888+
sender_key=s_priv_key,
889+
recipient_key=r_pub_key,
890+
context={"alg": "A128GCM"},
877891
)
878892
sender = COSE.new(alg_auto_inclusion=True)
879893
encoded = sender.encode(
@@ -896,7 +910,9 @@ r_priv_key = COSEKey.from_jwk(
896910
"d": "r_kHyZ-a06rmxM3yESK84r1otSg-aQcVStkRhA-iCM8",
897911
}
898912
)
899-
assert b"Hello world!" == recipient.decode(encoded, r_priv_key, context={"alg": "A128GCM"})
913+
assert b"Hello world!" == recipient.decode(
914+
encoded, r_priv_key, context={"alg": "A128GCM"}
915+
)
900916
```
901917

902918
#### Countersign (Encrypt)
@@ -1243,14 +1259,16 @@ from cwt import Claims, COSEKey
12431259

12441260
try:
12451261
key = COSEKey.generate_symmetric_key(alg="HS256", kid="01")
1246-
token = cwt.encode({"iss": "coaps://as.example", "sub": "dajiaji", "cti": "123"}, key)
1262+
token = cwt.encode(
1263+
{"iss": "coaps://as.example", "sub": "dajiaji", "cti": "123"}, key
1264+
)
12471265
decoded = cwt.decode(token, key)
12481266

12491267
# If you want to treat the result like a JWT;
12501268
readable = Claims.new(decoded)
1251-
assert readable.iss == 'coaps://as.example'
1252-
assert readable.sub == 'dajiaji'
1253-
assert readable.cti == '123'
1269+
assert readable.iss == "coaps://as.example"
1270+
assert readable.sub == "dajiaji"
1271+
assert readable.cti == "123"
12541272
# readable.exp == 1620088759
12551273
# readable.nbf == 1620085159
12561274
# readable.iat == 1620085159
@@ -1272,7 +1290,14 @@ import cwt
12721290
from cwt import COSEKey, CWTClaims
12731291

12741292
key = COSEKey.generate_symmetric_key(alg="HS256", kid="01")
1275-
token = cwt.encode({CWTClaims.ISS: "coaps://as.example", CWTClaims.SUB: "dajiaji", CWTClaims.CTI: b"123"}, key)
1293+
token = cwt.encode(
1294+
{
1295+
CWTClaims.ISS: "coaps://as.example",
1296+
CWTClaims.SUB: "dajiaji",
1297+
CWTClaims.CTI: b"123",
1298+
},
1299+
key,
1300+
)
12761301
decoded = cwt.decode(token, key)
12771302
```
12781303

@@ -1314,27 +1339,31 @@ import cwt
13141339
from cwt import COSEKey
13151340

13161341
# The sender side:
1317-
private_key = COSEKey.from_jwk({
1318-
"kid": "01",
1319-
"kty": "OKP",
1320-
"key_ops": ["sign"],
1321-
"alg": "EdDSA",
1322-
"crv": "Ed25519",
1323-
"x": "2E6dX83gqD_D0eAmqnaHe1TC1xuld6iAKXfw2OVATr0",
1324-
"d": "L8JS08VsFZoZxGa9JvzYmCWOwg7zaKcei3KZmYsj7dc",
1325-
})
1342+
private_key = COSEKey.from_jwk(
1343+
{
1344+
"kid": "01",
1345+
"kty": "OKP",
1346+
"key_ops": ["sign"],
1347+
"alg": "EdDSA",
1348+
"crv": "Ed25519",
1349+
"x": "2E6dX83gqD_D0eAmqnaHe1TC1xuld6iAKXfw2OVATr0",
1350+
"d": "L8JS08VsFZoZxGa9JvzYmCWOwg7zaKcei3KZmYsj7dc",
1351+
}
1352+
)
13261353
token = cwt.encode(
13271354
{"iss": "coaps://as.example", "sub": "dajiaji", "cti": "123"}, private_key
13281355
)
13291356

13301357
# The recipient side:
1331-
public_key = COSEKey.from_jwk({
1332-
"kid": "01",
1333-
"kty": "OKP",
1334-
"key_ops": ["verify"],
1335-
"crv": "Ed25519",
1336-
"x": "2E6dX83gqD_D0eAmqnaHe1TC1xuld6iAKXfw2OVATr0",
1337-
})
1358+
public_key = COSEKey.from_jwk(
1359+
{
1360+
"kid": "01",
1361+
"kty": "OKP",
1362+
"key_ops": ["verify"],
1363+
"crv": "Ed25519",
1364+
"x": "2E6dX83gqD_D0eAmqnaHe1TC1xuld6iAKXfw2OVATr0",
1365+
}
1366+
)
13381367
decoded = cwt.decode(token, public_key)
13391368
```
13401369

@@ -1350,7 +1379,9 @@ import cwt
13501379
from cwt import COSEKey
13511380

13521381
enc_key = COSEKey.generate_symmetric_key(alg="ChaCha20/Poly1305", kid="01")
1353-
token = cwt.encode({"iss": "coaps://as.example", "sub": "dajiaji", "cti": "123"}, enc_key)
1382+
token = cwt.encode(
1383+
{"iss": "coaps://as.example", "sub": "dajiaji", "cti": "123"}, enc_key
1384+
)
13541385
decoded = cwt.decode(token, enc_key)
13551386
```
13561387

@@ -1397,7 +1428,7 @@ If you want to change the settings, you can create your own `CWT` class instance
13971428
from cwt import COSEKey, CWT
13981429

13991430
key = COSEKey.generate_symmetric_key(alg="HS256", kid="01")
1400-
mycwt = CWT.new(expires_in=3600*24, leeway=10)
1431+
mycwt = CWT.new(expires_in=3600 * 24, leeway=10)
14011432
token = mycwt.encode({"iss": "coaps://as.example", "sub": "dajiaji", "cti": "123"}, key)
14021433
decoded = mycwt.decode(token, key)
14031434
```
@@ -1621,7 +1652,7 @@ import cwt
16211652
from cwt import Claims, COSEKey
16221653

16231654
# The sernder side:
1624-
with open("./private_key_of_cert.pem")) as f:
1655+
with open("./private_key_of_cert.pem") as f:
16251656
private_key = COSEKey.from_pem(f.read(), kid="01")
16261657

16271658
token = cwt.encode(
@@ -1638,13 +1669,14 @@ public_key = COSEKey.from_jwk(
16381669
"x": "oONCv1QoiajIbcW21Dqy6EnGvBTuF26GU7dy6JzOfXk",
16391670
"y": "sl6k77K0TS36FW-TyEGLHY14ovZfdZ9DZWsbA8BTHGc",
16401671
"x5c": [
1641-
# The DER formatted X509 certificate which pairs with the private_key_of_cert.pem above.
1642-
"MIIClDCCAXygAwIBAgIBBDANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJKUDEOMAwGA1UECAwFVG9reW8xEDAOBgNVBAoMB2RhamlhamkxEzARBgNVBAMMCnB5dGhvbi1jd3QxIDAeBgkqhkiG9w0BCQEWEWRhamlhamlAZ21haWwuY29tMB4XDTIxMTAwMzEzMDE1MFoXDTMxMTAwMTEzMDE1MFowZDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMQ0wCwYDVQQKDAR0ZXN0MRUwEwYDVQQDDAx0ZXN0LmV4YW1wbGUxHzAdBgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASg40K_VCiJqMhtxbbUOrLoSca8FO4XboZTt3LonM59ebJepO-ytE0t-hVvk8hBix2NeKL2X3WfQ2VrGwPAUxxnoxowGDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DANBgkqhkiG9w0BAQsFAAOCAQEAZFfvFbaDk_DmG2cPGTwqwnFok1QnH2Tzkjk7p4vs1ycWzEDltkhyzcJxTSHoQGdykf7fG8NCrEqfi1G3hOyAtGxVIVcqsI-KIJCESp43zrNz5HsbwEY8l5rvcwohKGlE_idIFt5IuDTv7vsg_FaCIDeruw0NrXAACnLTwksawsxaCvtY12U0wsI2aC2Sb6V3HL-OLgcN6ZWzZ054L88JllckYnqJB8wCVBzzX2K2sZH3yeS39oRWZOVG6fwXsX4k0fHFx-Fn6KlrBU15pbjMLMn0ow0X3Y8e7FOgfkkph-N7e2SxceXNjrLiumOdclPm9yGSWoGsOJdId53dPvqAsQ",
1643-
# The root certificate which is used for signing the above certificate (optional).
1644-
"MIIDrzCCApegAwIBAgIUIK_CYzdq4BLLVXqSclNBgXy6mgswDQYJKoZIhvcNAQELBQAwZjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRAwDgYDVQQKDAdkYWppYWppMRMwEQYDVQQDDApweXRob24tY3d0MSAwHgYJKoZIhvcNAQkBFhFkYWppYWppQGdtYWlsLmNvbTAgFw0yMTEwMDIyMzU0NTZaGA8yMDcxMDkyMDIzNTQ1NlowZjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRAwDgYDVQQKDAdkYWppYWppMRMwEQYDVQQDDApweXRob24tY3d0MSAwHgYJKoZIhvcNAQkBFhFkYWppYWppQGdtYWlsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANFg4sw-uPWbPBbkJuohXc89O0gaqG1H2i1wzxxka32XNKIdwrxOJvsB2eALo3q7dTqLKCgzrjdd5N07gi0KzqjoIXIXqKpV5tm0fP5gCzEOWgxySCfBJOJyyvO6WvYXdvukEBnL-48D8RSjQH9fQEju5RG0taFZE-0nQ7n3P0J-Q-OfBUEoRiHvCd8oUx0s-fBpKdfhMAbD1sGAQ9CokUFeWc49em8inNqia5xljBtSYo6_2Zx9eb7B53wvBC0EmtS4SRyksR2emlr6GxMj_EZW7hcTfZCM4V2JYXliuAEdxA0sB7q-WqLg4OvltBQxCBgTTEXRCzxj3XXZy7QyUacCAwEAAaNTMFEwHQYDVR0OBBYEFA9id2cL_Chjv6liRN3HD849TARsMB8GA1UdIwQYMBaAFA9id2cL_Chjv6liRN3HD849TARsMA8GA1UdEwEB_wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAArIej5eJN1OmD3l3ef9QzosCxKThNwqNY55CoSSC3IRl-IAXy9Lvx7cgiliwBgCv99RbXZ1ZnptTHC_1kzMzPhPg9pGKDowFP-rywaB9-NTuHTWQ4hkKDsru5dpf75ILNI5PTUi1iiBM7TdgSerpEVroUWZiOpGAdlKkmE1h4gkR6eQY9Q0IvVXwagy_PPoQ1XO1i5Hyg3aXeDZBgkE7AuW9uxtYQHzg8JG2TNko_yp497yf_Ew4t6KzGDhSa8L1euMPtclALDWFhgl6WmYsHOqAOsyZOLwpsifWa533wI9mtTvLEg8TFKMOdU0sbAoQSbrrI9m4QS7mzDLchngj3E"
1672+
# The DER formatted X509 certificate which pairs with the private_key_of_cert.pem above.
1673+
"MIIClDCCAXygAwIBAgIBBDANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJKUDEOMAwGA1UECAwFVG9reW8xEDAOBgNVBAoMB2RhamlhamkxEzARBgNVBAMMCnB5dGhvbi1jd3QxIDAeBgkqhkiG9w0BCQEWEWRhamlhamlAZ21haWwuY29tMB4XDTIxMTAwMzEzMDE1MFoXDTMxMTAwMTEzMDE1MFowZDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMQ0wCwYDVQQKDAR0ZXN0MRUwEwYDVQQDDAx0ZXN0LmV4YW1wbGUxHzAdBgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASg40K_VCiJqMhtxbbUOrLoSca8FO4XboZTt3LonM59ebJepO-ytE0t-hVvk8hBix2NeKL2X3WfQ2VrGwPAUxxnoxowGDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DANBgkqhkiG9w0BAQsFAAOCAQEAZFfvFbaDk_DmG2cPGTwqwnFok1QnH2Tzkjk7p4vs1ycWzEDltkhyzcJxTSHoQGdykf7fG8NCrEqfi1G3hOyAtGxVIVcqsI-KIJCESp43zrNz5HsbwEY8l5rvcwohKGlE_idIFt5IuDTv7vsg_FaCIDeruw0NrXAACnLTwksawsxaCvtY12U0wsI2aC2Sb6V3HL-OLgcN6ZWzZ054L88JllckYnqJB8wCVBzzX2K2sZH3yeS39oRWZOVG6fwXsX4k0fHFx-Fn6KlrBU15pbjMLMn0ow0X3Y8e7FOgfkkph-N7e2SxceXNjrLiumOdclPm9yGSWoGsOJdId53dPvqAsQ",
1674+
# The root certificate which is used for signing the above certificate (optional).
1675+
"MIIDrzCCApegAwIBAgIUIK_CYzdq4BLLVXqSclNBgXy6mgswDQYJKoZIhvcNAQELBQAwZjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRAwDgYDVQQKDAdkYWppYWppMRMwEQYDVQQDDApweXRob24tY3d0MSAwHgYJKoZIhvcNAQkBFhFkYWppYWppQGdtYWlsLmNvbTAgFw0yMTEwMDIyMzU0NTZaGA8yMDcxMDkyMDIzNTQ1NlowZjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMRAwDgYDVQQKDAdkYWppYWppMRMwEQYDVQQDDApweXRob24tY3d0MSAwHgYJKoZIhvcNAQkBFhFkYWppYWppQGdtYWlsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANFg4sw-uPWbPBbkJuohXc89O0gaqG1H2i1wzxxka32XNKIdwrxOJvsB2eALo3q7dTqLKCgzrjdd5N07gi0KzqjoIXIXqKpV5tm0fP5gCzEOWgxySCfBJOJyyvO6WvYXdvukEBnL-48D8RSjQH9fQEju5RG0taFZE-0nQ7n3P0J-Q-OfBUEoRiHvCd8oUx0s-fBpKdfhMAbD1sGAQ9CokUFeWc49em8inNqia5xljBtSYo6_2Zx9eb7B53wvBC0EmtS4SRyksR2emlr6GxMj_EZW7hcTfZCM4V2JYXliuAEdxA0sB7q-WqLg4OvltBQxCBgTTEXRCzxj3XXZy7QyUacCAwEAAaNTMFEwHQYDVR0OBBYEFA9id2cL_Chjv6liRN3HD849TARsMB8GA1UdIwQYMBaAFA9id2cL_Chjv6liRN3HD849TARsMA8GA1UdEwEB_wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAArIej5eJN1OmD3l3ef9QzosCxKThNwqNY55CoSSC3IRl-IAXy9Lvx7cgiliwBgCv99RbXZ1ZnptTHC_1kzMzPhPg9pGKDowFP-rywaB9-NTuHTWQ4hkKDsru5dpf75ILNI5PTUi1iiBM7TdgSerpEVroUWZiOpGAdlKkmE1h4gkR6eQY9Q0IvVXwagy_PPoQ1XO1i5Hyg3aXeDZBgkE7AuW9uxtYQHzg8JG2TNko_yp497yf_Ew4t6KzGDhSa8L1euMPtclALDWFhgl6WmYsHOqAOsyZOLwpsifWa533wI9mtTvLEg8TFKMOdU0sbAoQSbrrI9m4QS7mzDLchngj3E",
16451676
],
1646-
"alg": "ES256"
1647-
})
1677+
"alg": "ES256",
1678+
}
1679+
)
16481680

16491681
# The recipient can specify trusted CAs as follows:
16501682
decoder = CWT.new(ca_certs="/path/to/cacerts.pem")

cwt/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from .recipient import Recipient
1919
from .signer import Signer
2020

21-
__version__ = "2.5.0"
21+
__version__ = "2.5.1"
2222
__title__ = "cwt"
2323
__description__ = "A Python implementation of CWT/COSE"
2424
__url__ = "https://python-cwt.readthedocs.io"

0 commit comments

Comments
 (0)