| 468 | } |
| 469 | |
| 470 | void Ed25519::BlindPublicKey (const uint8_t * pub, const uint8_t * seed, uint8_t * blinded) |
| 471 | { |
| 472 | BN_CTX * ctx = BN_CTX_new (); |
| 473 | // calculate alpha = seed mod l |
| 474 | BIGNUM * alpha = DecodeBN<64> (seed); // seed is in Little Endian |
| 475 | BN_mod (alpha, alpha, l, ctx); // % l |
| 476 | uint8_t priv[32]; |
| 477 | EncodeBN (alpha, priv, 32); // back to Little Endian |
| 478 | BN_free (alpha); |
| 479 | // A' = BLIND_PUBKEY(A, alpha) = A + DERIVE_PUBLIC(alpha) |
| 480 | auto A1 = Sum (DecodePublicKey (pub, ctx), MulB (priv, ctx), ctx); // pub + B*alpha |
| 481 | EncodePublicKey (A1, blinded, ctx); |
| 482 | BN_CTX_free (ctx); |
| 483 | } |
| 484 | |
| 485 | void Ed25519::BlindPrivateKey (const uint8_t * priv, const uint8_t * seed, uint8_t * blindedPriv, uint8_t * blindedPub) |
| 486 | { |