def test_cosi(self): for N in range(1, 11): # generate random message to be signed msg = random.bytes(128) # phase 0: create priv/pubkeys and combine pubkeys keys = [None] * N pubkeys = [None] * N for j in range(N): keys[j] = ed25519.generate_secret() pubkeys[j] = ed25519.publickey(keys[j]) pubkey = ed25519.cosi_combine_publickeys(pubkeys) # phase 1: create nonces, commitments (R values) and combine commitments nonces = [None] * N Rs = [None] * N for j in range(N): nonces[j] = ed25519.generate_secret() Rs[j] = ed25519.publickey(nonces[j]) R = ed25519.cosi_combine_publickeys(Rs) # phase 2: sign and combine signatures sigs = [None] * N for j in range(N): sigs[j] = ed25519.cosi_sign(keys[j], msg, nonces[j], R, pubkey) sig = ed25519.cosi_combine_signatures(R, sigs) # check signature using normal ed25519.verify res = ed25519.verify(pubkey, sig, msg) self.assertTrue(res)
def test_sign_verify_random(self): for l in range(1, 300): sk = ed25519.generate_secret() pk = ed25519.publickey(sk) msg = random.bytes(l) sig = ed25519.sign(sk, msg) self.assertTrue(ed25519.verify(pk, sig, msg))
def public_key(self) -> bytes: if self.curve == common.COSE_CURVE_P256: pubkey = nist256p1.publickey(self._private_key(), False) return cbor.encode({ common.COSE_KEY_ALG: self.algorithm, common.COSE_KEY_KTY: common.COSE_KEYTYPE_EC2, common.COSE_KEY_CRV: self.curve, common.COSE_KEY_X: pubkey[1:33], common.COSE_KEY_Y: pubkey[33:], }) elif self.curve == common.COSE_CURVE_ED25519: pubkey = ed25519.publickey(self._private_key()) return cbor.encode({ common.COSE_KEY_ALG: self.algorithm, common.COSE_KEY_KTY: common.COSE_KEYTYPE_OKP, common.COSE_KEY_CRV: self.curve, common.COSE_KEY_X: pubkey, }) raise TypeError
def test_publickey(self): for sk, pk, _ in self.vectors: pk2 = ed25519.publickey(unhexlify(sk)) self.assertEqual(pk2, unhexlify(pk))