import logging
from ctypes import *
from typing import Optional
from .lib import do_call
class BlsEntity:
"""
Base class for BLS Entities (Generator, SignKey, VerKey, Signature, MultiSignature).
"""
new_handler = None
from_bytes_handler = None
as_bytes_handler = None
free_handler = None
def __init__(self, c_instance: c_void_p):
logger = logging.getLogger(__name__)
logger.debug("BlsEntity.__init__: >>> self: %r, instance: %r", self, c_instance)
self.c_instance = c_instance
@classmethod
def from_bytes(cls, xbytes: bytes) -> 'BlsEntity':
"""
Creates and Bls entity from bytes representation.
:param xbytes: Bytes representation of Bls entity
:return: BLS entity intance
"""
logger = logging.getLogger(__name__)
logger.debug("BlsEntity::from_bytes: >>>")
c_instance = c_void_p()
do_call(cls.from_bytes_handler, xbytes, len(xbytes), byref(c_instance))
res = cls(c_instance)
logger.debug("BlsEntity::from_bytes: <<< res: %r", res)
return res
def as_bytes(self) -> bytes:
"""
Returns BLS entity bytes representation.
:return: BLS entity bytes representation
"""
logger = logging.getLogger(__name__)
logger.debug("BlsEntity.as_bytes: >>> self: %r", self)
xbytes = POINTER(c_ubyte)()
xbytes_len = c_size_t()
do_call(self.as_bytes_handler, self.c_instance, byref(xbytes), byref(xbytes_len))
res = bytes(xbytes[:xbytes_len.value])
logger.debug("BlsEntity.as_bytes: <<< res: %r", res)
return res
def __del__(self):
logger = logging.getLogger(__name__)
logger.debug("BlsEntity.__del__: >>> self: %r", self)
do_call(self.free_handler, self.c_instance)
class Generator(BlsEntity):
"""
BLS generator point.
BLS algorithm requires choosing of generator point that must be known to all parties.
The most of BLS methods require generator to be provided.
"""
new_handler = 'indy_crypto_bls_generator_new'
from_bytes_handler = 'indy_crypto_bls_generator_from_bytes'
as_bytes_handler = 'indy_crypto_bls_generator_as_bytes'
free_handler = 'indy_crypto_bls_generator_free'
@classmethod
def new(cls) -> 'Generator':
"""
Creates and returns random generator point that satisfy BLS algorithm requirements.
:return: BLS generator
"""
logger = logging.getLogger(__name__)
logger.debug("Generator::new: >>>")
c_instance = c_void_p()
do_call(cls.new_handler, byref(c_instance))
res = cls(c_instance)
logger.debug("Generator::new: <<< res: %r", res)
return res
class SignKey(BlsEntity):
"""
BLS sign key.
"""
new_handler = 'indy_crypto_bls_sign_key_new'
from_bytes_handler = 'indy_crypto_bls_sign_key_from_bytes'
as_bytes_handler = 'indy_crypto_bls_sign_key_as_bytes'
free_handler = 'indy_crypto_bls_sign_key_free'
@classmethod
def new(cls, seed: Optional[bytes]) -> 'SignKey':
"""
Creates and returns random (or seeded from seed) BLS sign key.
:param: seed - Optional seed.
:return: BLS sign key
"""
logger = logging.getLogger(__name__)
logger.debug("SignKey::new: >>>")
c_instance = c_void_p()
do_call(cls.new_handler, seed, len(seed) if seed is not None else 0, byref(c_instance))
res = cls(c_instance)
logger.debug("SignKey::new: <<< res: %r", res)
return res
class VerKey(BlsEntity):
"""
BLS verification key.
"""
new_handler = 'indy_crypto_bls_ver_key_new'
from_bytes_handler = 'indy_crypto_bls_ver_key_from_bytes'
as_bytes_handler = 'indy_crypto_bls_ver_key_as_bytes'
free_handler = 'indy_crypto_bls_ver_key_free'
@classmethod
def new(cls, gen: Generator, sign_key: SignKey) -> 'VerKey':
"""
Creates and returns BLS ver key that corresponds to the given generator and sign key.
:param: gen - Generator
:param: sign_key - Sign Key
:return: BLS verification key
"""
logger = logging.getLogger(__name__)
logger.debug("VerKey::new: >>>")
c_instance = c_void_p()
do_call(cls.new_handler, gen.c_instance, sign_key.c_instance, byref(c_instance))
res = cls(c_instance)
logger.debug("VerKey::new: <<< res: %r", res)
return res
class ProofOfPossession(BlsEntity):
"""
BLS proof of possession.
"""
new_handler = 'indy_crypto_bls_pop_new'
from_bytes_handler = 'indy_crypto_bls_pop_from_bytes'
as_bytes_handler = 'indy_crypto_bls_pop_as_bytes'
free_handler = 'indy_crypto_bls_pop_free'
@classmethod
def new(cls, ver_key: VerKey, sign_key: SignKey) -> 'ProofOfPossession':
"""
Creates and returns BLS proof of possession that corresponds to the given ver key and sign key.
:param: ver_key - Ver Key
:param: sign_key - Sign Key
:return: BLS proof of possession
"""
logger = logging.getLogger(__name__)
logger.debug("ProofOfPossession::new: >>>")
c_instance = c_void_p()
do_call(cls.new_handler, ver_key.c_instance, sign_key.c_instance, byref(c_instance))
res = cls(c_instance)
logger.debug("ProofOfPossession::new: <<< res: %r", res)
return res
class Signature(BlsEntity):
"""
BLS signature.
"""
new_handler = None
from_bytes_handler = 'indy_crypto_bls_signature_from_bytes'
as_bytes_handler = 'indy_crypto_bls_signature_as_bytes'
free_handler = 'indy_crypto_bls_signature_free'
class MultiSignature(BlsEntity):
"""
BLS multi signature.
"""
new_handler = 'indy_crypto_bls_multi_signature_new'
from_bytes_handler = 'indy_crypto_bls_multi_signature_from_bytes'
as_bytes_handler = 'indy_crypto_bls_multi_signature_as_bytes'
free_handler = 'indy_crypto_bls_multi_signature_free'
@classmethod
def new(cls, signatures: [Signature]) -> 'MultiSignature':
"""
Creates and returns BLS multi signature that corresponds to the given signatures list.
:param: signature - List of signatures
:return: BLS multi signature
"""
logger = logging.getLogger(__name__)
logger.debug("MultiSignature::new: >>>")
# noinspection PyCallingNonCallable,PyTypeChecker
signature_c_instances = (c_void_p * len(signatures))()
for i in range(len(signatures)):
signature_c_instances[i] = signatures[i].c_instance
c_instance = c_void_p()
do_call(cls.new_handler, signature_c_instances, len(signatures), byref(c_instance))
res = cls(c_instance)
logger.debug("MultiSignature::new: <<< res: %r", res)
return res
class Bls:
"""
Provides Bls methods.
"""
@staticmethod
def sign(message: bytes, sign_key: SignKey) -> Signature:
"""
Signs the message and returns signature.
:param: message - Message to sign
:param: sign_key - Sign key
:return: Signature
"""
logger = logging.getLogger(__name__)
logger.debug("Bls::sign: >>> message: %r, sign_key: %r", message, sign_key)
c_instance = c_void_p()
do_call('indy_crypto_bls_sign',
message, len(message),
sign_key.c_instance,
byref(c_instance))
res = Signature(c_instance)
logger.debug("Bls::sign: <<< res: %r", res)
return res
@staticmethod
def verify(signature: Signature, message: bytes, ver_key: VerKey, gen: Generator) -> bool:
"""
Verifies the message signature and returns true - if signature valid or false otherwise.
:param: signature - Signature to verify
:param: message - Message to verify
:param: ver_key - Verifi
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
共6个文件
py:5个
pkg-info:1个
资源分类:Python库 所属语言:Python 资源全名:indy_crypto-0.4.2-dev-58.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源推荐
资源详情
资源评论
收起资源包目录
indy_crypto-0.4.2-dev-58.tar.gz (6个子文件)
indy_crypto-0.4.2-dev-58
PKG-INFO 367B
indy_crypto
bls.py 11KB
lib.py 2KB
__init__.py 45B
error.py 2KB
setup.py 481B
共 6 条
- 1
资源评论
挣扎的蓝藻
- 粉丝: 13w+
- 资源: 15万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功