mirror of https://github.com/jumpserver/jumpserver
72 lines
1.6 KiB
Python
72 lines
1.6 KiB
Python
from ctypes import *
|
|
|
|
ECCref_MAX_BITS = 512
|
|
ECCref_MAX_LEN = int((ECCref_MAX_BITS + 7) / 8)
|
|
|
|
|
|
class EncodeMixin:
|
|
def encode(self):
|
|
raise NotImplementedError
|
|
|
|
|
|
class ECCrefPublicKey(Structure, EncodeMixin):
|
|
_fields_ = [
|
|
('bits', c_uint),
|
|
('x', c_ubyte * ECCref_MAX_LEN),
|
|
('y', c_ubyte * ECCref_MAX_LEN),
|
|
]
|
|
|
|
def encode(self):
|
|
return bytes([0x04]) + bytes(self.x[32:]) + bytes(self.y[32:])
|
|
|
|
|
|
class ECCrefPrivateKey(Structure, EncodeMixin):
|
|
_fields_ = [
|
|
('bits', c_uint,),
|
|
('K', c_ubyte * ECCref_MAX_LEN),
|
|
]
|
|
|
|
def encode(self):
|
|
return bytes(self.K[32:])
|
|
|
|
|
|
class ECCCipherEncode(EncodeMixin):
|
|
|
|
def __init__(self):
|
|
self.x = None
|
|
self.y = None
|
|
self.M = None
|
|
self.C = None
|
|
self.L = None
|
|
|
|
def encode(self):
|
|
c1 = bytes(self.x[32:]) + bytes(self.y[32:])
|
|
c2 = bytes(self.C[:self.L])
|
|
c3 = bytes(self.M)
|
|
return bytes([0x04]) + c1 + c2 + c3
|
|
|
|
|
|
def new_ecc_cipher_cla(length):
|
|
_cache = {}
|
|
cla_name = "ECCCipher{}".format(length)
|
|
if _cache.__contains__(cla_name):
|
|
return _cache[cla_name]
|
|
else:
|
|
cla = type(cla_name, (Structure, ECCCipherEncode), {
|
|
"_fields_": [
|
|
('x', c_ubyte * ECCref_MAX_LEN),
|
|
('y', c_ubyte * ECCref_MAX_LEN),
|
|
('M', c_ubyte * 32),
|
|
('L', c_uint),
|
|
('C', c_ubyte * length)
|
|
]
|
|
})
|
|
_cache[cla_name] = cla
|
|
return cla
|
|
|
|
|
|
class ECCKeyPair:
|
|
def __init__(self, public_key, private_key):
|
|
self.public_key = public_key
|
|
self.private_key = private_key
|