def sign(self, init_packet_data): """ Create signature for init package using P-256 curve and SHA-256 as hashing algorithm Returns R and S keys combined in a 64 byte array """ # Add assertion of init_packet if self.sk is None: raise IllegalStateException( "Can't save key. No key created/loaded") # Sign the init-packet signature = self.sk.sign(init_packet_data, hashfunc=hashlib.sha256, sigencode=sigencode_string) return signature[31::-1] + signature[63:31:-1]
def open(self): if self.dfu_adapter: raise IllegalStateException('DFU Adapter is already open') super(DfuTransportBle, self).open() driver = DfuBLEDriver(serial_port=self.serial_port, baud_rate=self.baud_rate) adapter = BLEAdapter(driver) self.dfu_adapter = DFUAdapter(adapter=adapter, bonded=self.bonded, keyset=self.keyset) self.dfu_adapter.open() self.target_device_name, self.target_device_addr = self.dfu_adapter.connect( target_device_name=self.target_device_name, target_device_addr=self.target_device_addr) self.__set_prn()
def verify(self, init_packet, signature): """ Verify init packet """ # Add assertion of init_packet if self.sk is None: raise IllegalStateException("Can't save key. No key created/loaded") vk = self.sk.get_verifying_key() # Verify init packet try: vk.verify(signature, init_packet, hashfunc=hashlib.sha256) except: return False return True
def get_vk(self, output_type, dbg) -> str: """ Get public key (as hex, code or pem) """ if self.sk is None: raise IllegalStateException("Can't get key. No key created/loaded") if output_type is None: raise InvalidArgumentException("Invalid output type for public key.") elif output_type == 'hex': return self.get_vk_hex() elif output_type == 'code': return self.get_vk_code(dbg) elif output_type == 'pem': return self.get_vk_pem() else: raise InvalidArgumentException("Invalid argument. Can't get key")
def get_sk(self, output_type, dbg): """ Get private key (as hex, code or pem) """ if self.sk is None: raise IllegalStateException("Can't get key. No key created/loaded") if output_type is None: raise InvalidArgumentException("Invalid output type for private key.") elif output_type == 'hex': return self.get_sk_hex() elif output_type == 'code': raise InvalidArgumentException("Private key cannot be shown as code") elif output_type == 'pem': return self.sk.to_pem() else: raise InvalidArgumentException("Invalid argument. Can't get key")
def get_sk_hex(self): """ Get the verification key as hex """ if self.sk is None: raise IllegalStateException("Can't get key. No key created/loaded") sk_hexlify = binascii.hexlify(self.sk.to_string()) sk_hexlify_list = [] for i in xrange(len(sk_hexlify) - 2, -2, -2): sk_hexlify_list.append(sk_hexlify[i:i + 2]) sk_hexlify_list_str = ''.join(sk_hexlify_list) vk_hex = "Private (signing) key sk:\n{0}".format(sk_hexlify_list_str) return vk_hex
def get_vk_hex(self): """ Get the verification key as hex """ if self.sk is None: raise IllegalStateException("Can't get key. No key created/loaded") vk = self.sk.get_verifying_key() vk_hexlify = binascii.hexlify(vk.to_string()) vk_hexlify_list = [] for i in xrange(len(vk_hexlify[0:64])-2, -2, -2): vk_hexlify_list.append(vk_hexlify[i:i+2]) for i in xrange(len(vk_hexlify)-2, 62, -2): vk_hexlify_list.append(vk_hexlify[i:i+2]) vk_hexlify_list_str = ''.join(vk_hexlify_list) vk_hex = "Public (verification) key pk:\n{0}".format(vk_hexlify_list_str) return vk_hex
def close(self): if not self.dfu_adapter: raise IllegalStateException('DFU Adapter is already closed') super(DfuTransportBle, self).close() self.dfu_adapter.close() self.dfu_adapter = None