bovine.crypto.signature
Helper classes to parse signatures from the HTTP Headers
RFC9421Signature
dataclass
Helper class to parse signatures according to RFC 9421.
Currently, RFC9421 support is in development in bovine
Parameters:
Name | Type | Description | Default |
---|---|---|---|
fields
|
List[str]
|
|
required |
signature
|
bytes
|
|
required |
signature_params
|
str
|
|
required |
params
|
dict
|
|
required |
Source code in bovine/bovine/crypto/signature.py
key_id
property
from_headers
staticmethod
>>> signature_input='sig-b26=("date" "@method" "@path" "@authority" "content-type" "content-length");created=1618884473;keyid="test-key-ed25519"'
>>> signature='sig-b26=:wqcAqbmYJ2ji2glfAMaRy4gruYYnx2nEFN2HN6jrnDnQCK1u02Gb04v9EDgwUPiu4A0w6vuQv5lIp5WPpBKRCw==:'
>>> RFC9421Signature.from_headers(signature_input, signature)
RFC9421Signature(fields=['date', '@method', '@path', '@authority', 'content-type', 'content-length'],
signature=b"...",
signature_params='("date" "@method" "@path" "@authority" "content-type" "content-length");created=1618884473;keyid="test-key-ed25519"',
params={'created': 1618884473, 'keyid': 'test-key-ed25519'})
Source code in bovine/bovine/crypto/signature.py
Signature
dataclass
Helper class to parse HTTP Signatures
Parameters:
Name | Type | Description | Default |
---|---|---|---|
key_id
|
str
|
|
required |
algorithm
|
str
|
|
required |
headers
|
str
|
|
required |
signature
|
str
|
|
required |
created
|
int | None
|
|
None
|
expires
|
int | None
|
|
None
|
Source code in bovine/bovine/crypto/signature.py
from_signature_header
staticmethod
Takes the signature header and turns into Signature object
The header is assumed of the for key=value,… The keys keyId, algorithm, headers, and signature are parsed. If algorithm is absent it is assumed to be rsa-sha256. The other keys are required.
>>> header = 'keyId="https://host.user#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="h...Kg=="'
>>> Signature.from_signature_header(header)
Signature(key_id='https://host.user#main-key',
algorithm='rsa-sha256',
headers='(request-target) host date digest content-type',
signature='h...Kg==',
created=None,
expires=None)
(created) and (expires) are supported via
>>> header = 'keyId="https://key.example",algorithm="hs2019",headers="host date (request-target) (created) (expires)",signature="s0...",created="1728671105",expires="1728674705"'
>>> Signature.from_signature_header(header)
Signature(key_id='https://key.example',
algorithm='hs2019',
headers='host date (request-target) (created) (expires)',
signature='s0...',
created=1728671105,
expires=1728674705)