// generates new public and secret keys void PublicKeyGen(Integer secretKey, Integer& publicKeyX, Integer& publicKeyY) { Integer q; ECP ec; ECPPoint G, Q; LoadSECP256r1Curve(q, ec, G); Q = ec.ScalarMultiply(G, secretKey); publicKeyX = Q.x; publicKeyY = Q.y; }
void Sign(Integer& sigE, Integer& sigS, const Integer& secretKey, const byte* message, int mlen, AutoSeededRandomPool& rng) { Integer q,k; ECP ec; ECPPoint G, r; LoadSECP256r1Curve(q, ec, G); k = Integer(rng, 256) % q; // choose random k r = ec.ScalarMultiply(G, k); // r = G^k sigE = HashPointMessage(ec, r, message, mlen) % q; // e = H(M||r) sigS = (k - secretKey*sigE) % q; }
// generates new public and secret keys void KeyGen(Integer& secretKey, Integer& publicKeyX, Integer& publicKeyY, AutoSeededRandomPool& rng) { Integer q; ECP ec; ECPPoint G, Q; LoadSECP256r1Curve(q, ec, G); secretKey = Integer(rng, 256) % q; Q = ec.ScalarMultiply(G, secretKey); publicKeyX = Q.x; publicKeyY = Q.y; }
NAMESPACE_END ECP::ECP(const ECP &ecp, bool convertToMontgomeryRepresentation) { if (convertToMontgomeryRepresentation && !ecp.GetField().IsMontgomeryRepresentation()) { m_fieldPtr.reset(new MontgomeryRepresentation(ecp.GetField().GetModulus())); m_a = GetField().ConvertIn(ecp.m_a); m_b = GetField().ConvertIn(ecp.m_b); } else operator=(ecp); }
bool Verify(const Integer& publicKeyX, const Integer& publicKeyY, const Integer& sigE, const Integer& sigS, const byte* message,int mlen) { Integer q, sigEv; ECP ec; ECPPoint G, rv, Q; LoadSECP256r1Curve(q, ec, G); Q = ECPPoint(publicKeyX,publicKeyY); rv = ec.CascadeScalarMultiply(G, sigS, Q, sigE); // r = G^s.Q^e sigEv = HashPointMessage(ec, rv, message, mlen) % q; return (sigE == sigEv); }
Integer HashPointMessage(const ECP& ec, const ECPPoint& R, const byte* message, int mlen, bool compress = false) { const int digestsize = 256/8; SHA3 sha(digestsize); int len = ec.EncodedPointSize(); byte *buffer = new byte[len]; ec.EncodePoint(buffer, R, compress); sha.Update(buffer, len); delete[] buffer; sha.Update(message, mlen); byte digest[digestsize]; sha.Final(digest); Integer ans; ans.Decode(digest, digestsize); return ans; }
void EcPrecomputation<ECP>::SetCurveAndBase(const ECP &ec, const ECP::Point &base) { m_mr.reset(new MontgomeryRepresentation(ec.GetField().GetModulus())); m_ec.reset(new ECP(*m_mr, m_mr->ConvertIn(ec.GetA()), m_mr->ConvertIn(ec.GetB()))); m_ep.SetGroupAndBase(*m_ec, ToMontgomery(*m_mr, base)); }