[][src]Function grin_core::libtx::aggsig::verify_completed_sig

pub fn verify_completed_sig(
    secp: &Secp256k1,
    sig: &Signature,
    pubkey: &PublicKey,
    pubkey_sum: Option<&PublicKey>,
    msg: &Message
) -> Result<(), Error>

Verifies a completed (summed) signature, which must include the message and pubkey sum values that are used during signature creation time to create 'e' Returns Ok(()) if the signature is valid, or a Signature ErrorKind otherwise

Arguments

  • secp - A Secp256k1 Context initialized for Verification
  • sig - The Signature to verify
  • pubkey - Corresponding Public Key of the private key used to sign the message.
  • pubkey_sum - (Optional) The sum of the public keys of all signers participating in the full signature. If included, this value is encoded in e. Must be the same value as when the signature was created to verify correctly.
  • msg - The message to verify (fee|lockheight).

Example

use rand::thread_rng;
use core::libtx::aggsig;
use util::secp::key::{PublicKey, SecretKey};
use util::secp::{ContextFlag, Secp256k1, Message};

let secp = Secp256k1::with_caps(ContextFlag::Full);
let secret_nonce = aggsig::create_secnonce(&secp).unwrap();
let secret_key = SecretKey::new(&secp, &mut thread_rng());
let pub_nonce_sum = PublicKey::from_secret_key(&secp, &secret_nonce).unwrap();
// ... Add all other participating nonces
let pub_key_sum = PublicKey::from_secret_key(&secp, &secret_key).unwrap();
// ... Add all other participating keys
let mut msg_bytes = [0; 32];
// ... Encode message
let message = Message::from_slice(&msg_bytes).unwrap();
let sig_part = aggsig::calculate_partial_sig(
	&secp,
	&secret_key,
	&secret_nonce,
	&pub_nonce_sum,
	Some(&pub_key_sum),
	&message,
).unwrap();
// ... Verify above, once all signatures have been added together
let sig_verifies = aggsig::verify_completed_sig(
	&secp,
	&sig_part,
	&pub_key_sum,
	Some(&pub_key_sum),
	&message,
	);
assert!(!sig_verifies.is_err());