mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-20 00:35:30 +00:00
54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
|
|
|
|
from libzot import *
|
|
import re
|
|
import json
|
|
|
|
|
|
class JSalmon:
|
|
|
|
def sign(data,key_id,key,data_type = 'application/x-nomad+json'):
|
|
data = base64urlnopad_encode(data.encode("utf-8"))
|
|
encoding = 'base64url'
|
|
algorithm = 'RSA-SHA256'
|
|
|
|
data = re.sub(r'\s+',"",data)
|
|
fields = data + "." + base64urlnopad_encode(data_type.encode("utf-8")) + "." + base64urlnopad_encode(encoding.encode("utf-8")) + "." + base64urlnopad_encode(algorithm.encode("utf-8"))
|
|
signature = base64urlnopad_encode(rsa_sign(fields,key).encode("utf-8"))
|
|
return {
|
|
'signed' : True,
|
|
'data' : data,
|
|
'data_type' : data_type,
|
|
'encoding' : encoding,
|
|
'alg' : algorithm,
|
|
'sigs' : { 'value' : signature, 'key_id' : base64urlnopad_encode(key_id.encode("utf-8")) }}
|
|
|
|
|
|
def verify(x,key):
|
|
if x['signed'] != True:
|
|
return False
|
|
|
|
signed_data = re.sub(r'\s+','', x['data'] + "." + base64urlnopad_encode(x['data_type'].encode("utf-8")) + "." + base64urlnopad_encode(x['encoding'].encode("utf-8")) + "." + base64urlnopad_encode(x['alg'].encode("utf-8")))
|
|
|
|
binsig = base64urlnopad_decode(x['sigs']['value'])
|
|
|
|
if rsa_verify(signed_data,binsig,key) == True:
|
|
return True
|
|
|
|
return False
|
|
|
|
def unpack(data):
|
|
return json.loads(base64urlnopad_decode(data))
|
|
|
|
|
|
|
|
#if __name__=="__main__":
|
|
# prvkey,pubkey = generate_rsa_keypair()
|
|
|
|
# s = JSalmon.sign('abc123','mykeyid',prvkey)
|
|
# print (s)
|
|
|
|
# if JSalmon.verify(s,pubkey):
|
|
# print ('verified')
|
|
# else:
|
|
# print ('failed')
|