mirror of https://gitlab.com/bashrc2/epicyon
Comments
parent
0a5c65e9a2
commit
5a5dd1e016
|
@ -24,47 +24,65 @@ except ImportError:
|
|||
from pyjsonld import normalize
|
||||
|
||||
|
||||
def _options_hash(doc):
|
||||
doc = dict(doc["signature"])
|
||||
def _options_hash(doc: {}) -> str:
|
||||
"""Returns a hash of the signature, with a few fields removed
|
||||
"""
|
||||
docSig = dict(doc["signature"])
|
||||
|
||||
# remove fields from signature
|
||||
for k in ["type", "id", "signatureValue"]:
|
||||
if k in doc:
|
||||
del doc[k]
|
||||
doc["@context"] = "https://w3id.org/identity/v1"
|
||||
if k in docSig:
|
||||
del docSig[k]
|
||||
|
||||
docSig["@context"] = "https://w3id.org/identity/v1"
|
||||
options = {
|
||||
"algorithm": "URDNA2015",
|
||||
"format": "application/nquads"
|
||||
}
|
||||
normalized = normalize(doc, options)
|
||||
|
||||
normalized = normalize(docSig, options)
|
||||
h = hashlib.new("sha256")
|
||||
h.update(normalized.encode("utf-8"))
|
||||
return h.hexdigest()
|
||||
|
||||
|
||||
def _doc_hash(doc):
|
||||
def _doc_hash(doc: {}) -> str:
|
||||
"""Returns a hash of the ActivityPub post
|
||||
"""
|
||||
doc = dict(doc)
|
||||
|
||||
# remove the signature
|
||||
if "signature" in doc:
|
||||
del doc["signature"]
|
||||
|
||||
options = {
|
||||
"algorithm": "URDNA2015",
|
||||
"format": "application/nquads"
|
||||
}
|
||||
|
||||
normalized = normalize(doc, options)
|
||||
h = hashlib.new("sha256")
|
||||
h.update(normalized.encode("utf-8"))
|
||||
return h.hexdigest()
|
||||
|
||||
|
||||
def verifyJsonSignature(doc: {}, publicKeyPem: str):
|
||||
def verifyJsonSignature(doc: {}, publicKeyPem: str) -> bool:
|
||||
"""Returns True if the given ActivityPub post was sent
|
||||
by an actor having the given public key
|
||||
"""
|
||||
key = RSA.importKey(publicKeyPem)
|
||||
to_be_signed = _options_hash(doc) + _doc_hash(doc)
|
||||
signature = doc["signature"]["signatureValue"]
|
||||
signer = PKCS1_v1_5.new(key) # type: ignore
|
||||
digest = SHA256.new()
|
||||
digest.update(to_be_signed.encode("utf-8"))
|
||||
return signer.verify(digest, base64.b64decode(signature)) # type: ignore
|
||||
base64sig = base64.b64decode(signature)
|
||||
return signer.verify(digest, base64sig) # type: ignore
|
||||
|
||||
|
||||
def generateJsonSignature(doc: {}, privateKeyPem: str):
|
||||
def generateJsonSignature(doc: {}, privateKeyPem: str) -> None:
|
||||
"""Adds a json signature to the given ActivityPub post
|
||||
"""
|
||||
if not doc.get('actor'):
|
||||
return
|
||||
|
||||
|
|
Loading…
Reference in New Issue