Skip to content

Commit 39befa1

Browse files
committed
Expose a BOLT 12 Invoice's signable_hash
This is useful as an identifier for downstream clients like VLS.
1 parent 821c79d commit 39befa1

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

lightning/src/offers/invoice.rs

+10
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,11 @@ impl Invoice {
469469
self.signature
470470
}
471471

472+
/// Hash that was used for signing the invoice.
473+
pub fn signable_hash(&self) -> [u8; 32] {
474+
merkle::message_digest(SIGNATURE_TAG, &self.bytes).as_ref().clone()
475+
}
476+
472477
#[cfg(test)]
473478
fn as_tlv_stream(&self) -> FullInvoiceTlvStreamRef {
474479
let (payer_tlv_stream, offer_tlv_stream, invoice_request_tlv_stream, invoice_tlv_stream) =
@@ -937,6 +942,11 @@ mod tests {
937942
).is_ok()
938943
);
939944

945+
let digest = Message::from_slice(&invoice.signable_hash()).unwrap();
946+
let pubkey = recipient_pubkey().into();
947+
let secp_ctx = Secp256k1::verification_only();
948+
assert!(secp_ctx.verify_schnorr(&invoice.signature, &digest, &pubkey).is_ok());
949+
940950
assert_eq!(
941951
invoice.as_tlv_stream(),
942952
(

lightning/src/offers/merkle.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub(super) fn verify_signature(
6666
secp_ctx.verify_schnorr(signature, &digest, &pubkey)
6767
}
6868

69-
fn message_digest(tag: &str, bytes: &[u8]) -> Message {
69+
pub(super) fn message_digest(tag: &str, bytes: &[u8]) -> Message {
7070
let tag = sha256::Hash::hash(tag.as_bytes());
7171
let merkle_root = root_hash(bytes);
7272
Message::from_slice(&tagged_hash(tag, merkle_root)).unwrap()

0 commit comments

Comments
 (0)