All Projects → TimothyClaeys → pycose

TimothyClaeys / pycose

Licence: other
A Python implementation of the COSE specification (CBOR Object Signing and Encryption) described in RFC 8152.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to pycose

libcose
Constrained node COSE library
Stars: ✭ 16 (-40.74%)
Mutual labels:  cbor, cose
jwt-compact
Compact JWT implementation in Rust
Stars: ✭ 26 (-3.7%)
Mutual labels:  cbor
Jsoncons
A C++, header-only library for constructing JSON and JSON-like data formats, with JSON Pointer, JSON Patch, JSON Schema, JSONPath, JMESPath, CSV, MessagePack, CBOR, BSON, UBJSON
Stars: ✭ 400 (+1381.48%)
Mutual labels:  cbor
Libcbor
CBOR protocol implementation for C
Stars: ✭ 215 (+696.3%)
Mutual labels:  cbor
Treefrog Framework
TreeFrog Framework : High-speed C++ MVC Framework for Web Application
Stars: ✭ 885 (+3177.78%)
Mutual labels:  cbor
Cbor
CBOR support for serde.
Stars: ✭ 238 (+781.48%)
Mutual labels:  cbor
Kotlinx.serialization
Kotlin multiplatform / multi-format serialization
Stars: ✭ 3,550 (+13048.15%)
Mutual labels:  cbor
cborg
fast CBOR with a focus on strictness
Stars: ✭ 21 (-22.22%)
Mutual labels:  cbor
fs2-data
streaming data parsing and transformation library
Stars: ✭ 103 (+281.48%)
Mutual labels:  cbor
Libxo
The libxo library allows an application to generate text, XML, JSON, and HTML output using a common set of function calls. The application decides at run time which output style should be produced.
Stars: ✭ 185 (+585.19%)
Mutual labels:  cbor
Borer
Efficient CBOR and JSON (de)serialization in Scala
Stars: ✭ 131 (+385.19%)
Mutual labels:  cbor
Qcbor
QCBOR -- a small CBOR encoder/decoder oriented around C and native data representations
Stars: ✭ 48 (+77.78%)
Mutual labels:  cbor
Cbor
CBOR RFC 7049 (Go/Golang) - safe & fast with standard API + toarray & keyasint, CBOR tags, float64/32/16, fuzz tested.
Stars: ✭ 250 (+825.93%)
Mutual labels:  cbor
Json
JSON for Modern C++
Stars: ✭ 27,824 (+102951.85%)
Mutual labels:  cbor
cbor
An implementation of CBOR in C
Stars: ✭ 28 (+3.7%)
Mutual labels:  cbor
Json
C++ header-only JSON library
Stars: ✭ 343 (+1170.37%)
Mutual labels:  cbor
Kripton
A Java/Kotlin library for Android platform, to manage bean's persistence in SQLite, SharedPreferences, JSON, XML, Properties, Yaml, CBOR.
Stars: ✭ 110 (+307.41%)
Mutual labels:  cbor
Jackson Dataformats Binary
Uber-project for standard Jackson binary format backends: avro, cbor, ion, protobuf, smile
Stars: ✭ 221 (+718.52%)
Mutual labels:  cbor
SwiftCBOR
A CBOR implementation for Swift
Stars: ✭ 95 (+251.85%)
Mutual labels:  cbor
gson
Algorithms on data formats - JSON, CBOR, Collation.
Stars: ✭ 17 (-37.04%)
Mutual labels:  cbor

pycose🐍 --- CBOR Object Signing and Encryption

Python package Documentation Status

This project is a Python implementation of the IETF CBOR Encoded Message Syntax (COSE). COSE has reached RFC status and is now available at RFC 8152.

Installation

$ pip install cose

⚠️WARNING⚠️: There is package on PyPI called pycose which contains old code from this repository. Since I am not the maintainer I cannot update that package or remove it.

What is COSE ?

CBOR Encoded Message Syntax (COSE) is a data format for concise representation of small messages RFC 8152. COSE is optimized for low power devices. The messages can be encrypted, MAC'ed and signed. There are 6 different types of COSE messages:

  • Encrypt0: An encrypted COSE message with a single recipient. The payload and AAD are protected by a shared CEK (Content Encryption Keys)
  • Encrypt: An encrypted COSE message can have multiple recipients. For each recipient the CEK is encrypted with a KEK (Key Encryption Key) - using AES key wrap - and added to the message.
  • MAC0: An authenticated COSE message with one recipient.
  • MAC: An authenticated COSE message that can have multiple recipients. For each recipient, the authentication key is encrypted with a KEK and added to the message.
  • Sign1: A signed COSE message with a single signature.
  • Sign: A COSE message that has been signed by multiple entities (each signature is carried in a COSE signature structure, added to the message).

A basic COSE message consists of 2 information buckets and the payload:

  • Protected header: This message field contains information that needs to be protected. This information is taken into account during the encryption, calculation of the MAC or the signature.
  • Unprotected header: The information contained in the unprotected header is not protected by the cryptographic algorithms.
  • Payload: Contains the payload of the message, protected (mac'ed, signed or encrypted) by the cryptographic algorithms.

Additionally, based on the message type, other message fields can be added:

  • MAC or signature (for MAC0 or Sign1 messages)
  • COSE recipients or COSE signatures (for MAC, Encrypt, and Sign messages)

Examples

Encoding

from binascii import unhexlify
from cose.messages import Enc0Message
from cose.keys import SymmetricKey

# Create a COSE Encrypt0 Message
msg = Enc0Message(
    phdr={'ALG': 'A128GCM', 'IV': unhexlify(b'01010101010101010101010101010101')},
    uhdr={'KID': b'[email protected]'},
    payload='a secret message'.encode('utf-8')
)

# Create a COSE Symmetric Key
cose_key = SymmetricKey(key=unhexlify(b'000102030405060708090a0b0c0d0e0f'))
msg.key = cose_key

# Performs encryption and CBOR serialization
msg.encode()
b'\xd0\x83U\xa2\x01\x01\x05P\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xa1\x04[email protected] \xc4\xaf\x85\xacJQ4\x93\x19\x93\xec\n\x18c\xa6\xe8\xc6n\xf4\xc9\xac\x161^\xe6\xfe\xcd\x9b.\x1cy\xa1'

Decoding

from binascii import unhexlify
from cose.messages import CoseMessage
from cose.keys import SymmetricKey

# message bytes (CBOR encoded)
msg =  b'\xd0\x83U\xa2\x01\x01\x05P\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xa1\x04[email protected] \xc4\xaf\x85\xacJQ4\x93\x19\x93\xec\n\x18c\xa6\xe8\xc6n\xf4\xc9\xac\x161^\xe6\xfe\xcd\x9b.\x1cy\xa1'

cose_msg = CoseMessage.decode(msg)

# Create a COSE Symmetric Key
cose_key = SymmetricKey(key=unhexlify(b'000102030405060708090a0b0c0d0e0f'))
cose_msg.key = cose_key

cose_msg.decrypt()
b'a secret message'

More examples

More examples can be found here

Testing

To run the test suite you need pytest:

$ pip install pytest

Move to the root of the repository and type:

$ pytest

Cryptography

The project depends on pyca/cryptography for all cryptographic operations, except the deterministic ECDSA algorithm. For deterministic ECDSA cose uses python-ecdsa.

Documentation

More documentation on COSE and the cose API can be found at: https://pycose.readthedocs.io

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].