main_impl.h (2762B)
1 /*********************************************************************** 2 * Copyright (c) 2015 Andrew Poelstra * 3 * Distributed under the MIT software license, see the accompanying * 4 * file COPYING or https://www.opensource.org/licenses/mit-license.php.* 5 ***********************************************************************/ 6 7 #ifndef SECP256K1_MODULE_ECDH_MAIN_H 8 #define SECP256K1_MODULE_ECDH_MAIN_H 9 10 #include "../../../include/secp256k1_ecdh.h" 11 #include "../../ecmult_const_impl.h" 12 13 static int ecdh_hash_function_sha256(unsigned char *output, const unsigned char *x32, const unsigned char *y32, void *data) { 14 unsigned char version = (y32[31] & 0x01) | 0x02; 15 haskellsecp256k1_v0_1_0_sha256 sha; 16 (void)data; 17 18 haskellsecp256k1_v0_1_0_sha256_initialize(&sha); 19 haskellsecp256k1_v0_1_0_sha256_write(&sha, &version, 1); 20 haskellsecp256k1_v0_1_0_sha256_write(&sha, x32, 32); 21 haskellsecp256k1_v0_1_0_sha256_finalize(&sha, output); 22 23 return 1; 24 } 25 26 const haskellsecp256k1_v0_1_0_ecdh_hash_function haskellsecp256k1_v0_1_0_ecdh_hash_function_sha256 = ecdh_hash_function_sha256; 27 const haskellsecp256k1_v0_1_0_ecdh_hash_function haskellsecp256k1_v0_1_0_ecdh_hash_function_default = ecdh_hash_function_sha256; 28 29 int haskellsecp256k1_v0_1_0_ecdh(const haskellsecp256k1_v0_1_0_context* ctx, unsigned char *output, const haskellsecp256k1_v0_1_0_pubkey *point, const unsigned char *scalar, haskellsecp256k1_v0_1_0_ecdh_hash_function hashfp, void *data) { 30 int ret = 0; 31 int overflow = 0; 32 haskellsecp256k1_v0_1_0_gej res; 33 haskellsecp256k1_v0_1_0_ge pt; 34 haskellsecp256k1_v0_1_0_scalar s; 35 unsigned char x[32]; 36 unsigned char y[32]; 37 38 VERIFY_CHECK(ctx != NULL); 39 ARG_CHECK(output != NULL); 40 ARG_CHECK(point != NULL); 41 ARG_CHECK(scalar != NULL); 42 43 if (hashfp == NULL) { 44 hashfp = haskellsecp256k1_v0_1_0_ecdh_hash_function_default; 45 } 46 47 haskellsecp256k1_v0_1_0_pubkey_load(ctx, &pt, point); 48 haskellsecp256k1_v0_1_0_scalar_set_b32(&s, scalar, &overflow); 49 50 overflow |= haskellsecp256k1_v0_1_0_scalar_is_zero(&s); 51 haskellsecp256k1_v0_1_0_scalar_cmov(&s, &haskellsecp256k1_v0_1_0_scalar_one, overflow); 52 53 haskellsecp256k1_v0_1_0_ecmult_const(&res, &pt, &s); 54 haskellsecp256k1_v0_1_0_ge_set_gej(&pt, &res); 55 56 /* Compute a hash of the point */ 57 haskellsecp256k1_v0_1_0_fe_normalize(&pt.x); 58 haskellsecp256k1_v0_1_0_fe_normalize(&pt.y); 59 haskellsecp256k1_v0_1_0_fe_get_b32(x, &pt.x); 60 haskellsecp256k1_v0_1_0_fe_get_b32(y, &pt.y); 61 62 ret = hashfp(output, x, y, data); 63 64 memset(x, 0, 32); 65 memset(y, 0, 32); 66 haskellsecp256k1_v0_1_0_scalar_clear(&s); 67 68 return !!ret & !overflow; 69 } 70 71 #endif /* SECP256K1_MODULE_ECDH_MAIN_H */