|
10 | 10 | #include "../../../include/secp256k1_ecdh.h"
|
11 | 11 | #include "../../../include/secp256k1_extrakeys.h"
|
12 | 12 | #include "../../../include/secp256k1_silentpayments.h"
|
| 13 | +#include "../../hash.h" |
13 | 14 |
|
14 | 15 | /* secp256k1_ecdh expects a hash function to be passed in or uses its default
|
15 | 16 | * hashing function. We don't want to hash the ECDH result, so we define a
|
@@ -202,4 +203,40 @@ int secp256k1_silentpayments_receive_create_shared_secret(const secp256k1_contex
|
202 | 203 | return 1;
|
203 | 204 | }
|
204 | 205 |
|
| 206 | +static void secp256k1_silentpayments_create_t_k(unsigned char *t_k, const unsigned char *shared_secret33, unsigned int k) { |
| 207 | + secp256k1_sha256 sha; |
| 208 | + unsigned char shared_secret_and_k[33+4]; |
| 209 | + |
| 210 | + /* Compute t_k = sha256(shared_secret || ser_32(k)) */ |
| 211 | + memcpy(shared_secret_and_k, shared_secret33, 33); |
| 212 | + secp256k1_write_be32(shared_secret_and_k+33, k); |
| 213 | + secp256k1_sha256_initialize(&sha); |
| 214 | + secp256k1_sha256_write(&sha, shared_secret_and_k, sizeof(shared_secret_and_k)); |
| 215 | + secp256k1_sha256_finalize(&sha, t_k); |
| 216 | +} |
| 217 | + |
| 218 | +int secp256k1_silentpayments_create_output_pubkey(const secp256k1_context *ctx, secp256k1_xonly_pubkey *output_xonly_pubkey, const unsigned char *shared_secret33, const secp256k1_pubkey *receiver_spend_pubkey, unsigned int k, const unsigned char *label_tweak32) { |
| 219 | + secp256k1_pubkey P_output; |
| 220 | + unsigned char t_k[32]; |
| 221 | + |
| 222 | + /* Sanity check inputs */ |
| 223 | + VERIFY_CHECK(ctx != NULL); |
| 224 | + ARG_CHECK(output_xonly_pubkey != NULL); |
| 225 | + ARG_CHECK(shared_secret33 != NULL); |
| 226 | + ARG_CHECK(receiver_spend_pubkey != NULL); |
| 227 | + ARG_CHECK(label_tweak32 == NULL); /* label tweaks are not supported yet */ |
| 228 | + |
| 229 | + /* Compute and return P_output = B_spend + t_k * G */ |
| 230 | + secp256k1_silentpayments_create_t_k(t_k, shared_secret33, k); |
| 231 | + P_output = *receiver_spend_pubkey; |
| 232 | + if (!secp256k1_ec_pubkey_tweak_add(ctx, &P_output, t_k)) { |
| 233 | + return 0; |
| 234 | + } |
| 235 | + if (!secp256k1_xonly_pubkey_from_pubkey(ctx, output_xonly_pubkey, NULL, &P_output)) { |
| 236 | + return 0; |
| 237 | + } |
| 238 | + |
| 239 | + return 1; |
| 240 | +} |
| 241 | + |
205 | 242 | #endif
|
0 commit comments