def wots_sk_gen(self, secret_seed, adrs: ADRS): # Not necessary sk = [] for i in range(0, self._len_0): adrs.set_chain_address(i) adrs.set_hash_address(0) sk.append(prf(secret_seed, adrs.copy(), self._n)) return sk
def wots_pk_from_sig(self, sig, m, public_seed, adrs: ADRS): csum = 0 wots_pk_adrs = adrs.copy() msg = base_w(m, self._w, self._len_1) for i in range(0, self._len_1): csum += self._w - 1 - msg[i] padding = (self._len_2 * math.floor(math.log(self._w, 2))) % 8 if ( self._len_2 * math.floor(math.log(self._w, 2))) % 8 != 0 else 8 csum = csum << (8 - padding) csumb = csum.to_bytes(math.ceil( (self._len_2 * math.floor(math.log(self._w, 2))) / 8), byteorder='big') csumw = base_w(csumb, self._w, self._len_2) msg += csumw tmp = bytes() for i in range(0, self._len_0): adrs.set_chain_address(i) tmp += self.chain(sig[i], msg[i], self._w - 1 - msg[i], public_seed, adrs.copy()) wots_pk_adrs.set_type(ADRS.WOTS_PK) wots_pk_adrs.set_key_pair_address(adrs.get_key_pair_address()) pk_sig = hash(public_seed, wots_pk_adrs, tmp, self._n) return pk_sig
def wots_pk_gen(self, secret_seed, public_seed, adrs: ADRS): wots_pk_adrs = adrs.copy() tmp = bytes() for i in range(0, self._len_0): adrs.set_chain_address(i) adrs.set_hash_address(0) sk = prf(secret_seed, adrs.copy(), self._n) tmp += bytes(self.chain(sk, 0, self._w - 1, public_seed, adrs.copy())) wots_pk_adrs.set_type(ADRS.WOTS_PK) wots_pk_adrs.set_key_pair_address(adrs.get_key_pair_address()) pk = hash(public_seed, wots_pk_adrs, tmp, self._n) return pk