transparent inputs should use serialize_der()

This commit is contained in:
Aditya Kulkarni
2019-09-10 10:01:13 -07:00
parent 1056db3bea
commit 3ee778de59

View File

@@ -479,7 +479,6 @@ impl<R: RngCore + CryptoRng> Builder<R> {
// //
let mut ctx = prover.new_sapling_proving_context(); let mut ctx = prover.new_sapling_proving_context();
let anchor = self.anchor.expect("anchor was set if spends were added");
// Pad Sapling outputs // Pad Sapling outputs
let orig_outputs_len = outputs.len(); let orig_outputs_len = outputs.len();
@@ -495,41 +494,44 @@ impl<R: RngCore + CryptoRng> Builder<R> {
tx_metadata.spend_indices.resize(spends.len(), 0); tx_metadata.spend_indices.resize(spends.len(), 0);
tx_metadata.output_indices.resize(orig_outputs_len, 0); tx_metadata.output_indices.resize(orig_outputs_len, 0);
// Create Sapling SpendDescriptions if spends.len() > 0 {
for (i, (pos, spend)) in spends.iter().enumerate() { let anchor = self.anchor.expect("anchor was set if spends were added");
let proof_generation_key = spend.extsk.expsk.proof_generation_key(&JUBJUB); // Create Sapling SpendDescriptions
for (i, (pos, spend)) in spends.iter().enumerate() {
let proof_generation_key = spend.extsk.expsk.proof_generation_key(&JUBJUB);
let mut nullifier = [0u8; 32]; let mut nullifier = [0u8; 32];
nullifier.copy_from_slice(&spend.note.nf( nullifier.copy_from_slice(&spend.note.nf(
&proof_generation_key.into_viewing_key(&JUBJUB), &proof_generation_key.into_viewing_key(&JUBJUB),
spend.witness.position, spend.witness.position,
&JUBJUB, &JUBJUB,
)); ));
let (zkproof, cv, rk) = prover let (zkproof, cv, rk) = prover
.spend_proof( .spend_proof(
&mut ctx, &mut ctx,
proof_generation_key, proof_generation_key,
spend.diversifier, spend.diversifier,
spend.note.r, spend.note.r,
spend.alpha, spend.alpha,
spend.note.value, spend.note.value,
anchor, anchor,
spend.witness.clone(), spend.witness.clone(),
) )
.map_err(|()| Error::SpendProof)?; .map_err(|()| Error::SpendProof)?;
self.mtx.shielded_spends.push(SpendDescription { self.mtx.shielded_spends.push(SpendDescription {
cv, cv,
anchor: anchor, anchor: anchor,
nullifier, nullifier,
rk, rk,
zkproof, zkproof,
spend_auth_sig: None, spend_auth_sig: None,
}); });
// Record the post-randomized spend location // Record the post-randomized spend location
tx_metadata.spend_indices[*pos] = i; tx_metadata.spend_indices[*pos] = i;
}
} }
// Create Sapling OutputDescriptions // Create Sapling OutputDescriptions
@@ -644,9 +646,13 @@ impl<R: RngCore + CryptoRng> Builder<R> {
let msg = secp256k1::Message::from_slice(&sighash).expect("32 bytes"); let msg = secp256k1::Message::from_slice(&sighash).expect("32 bytes");
let sig = self.legacy.secp.sign(&msg, &info.sk); let sig = self.legacy.secp.sign(&msg, &info.sk);
// Signature has to have "SIGHASH_ALL" appended to it
let mut sig_bytes: Vec<u8> = sig.serialize_der()[..].to_vec();
sig_bytes.extend(&[SIGHASH_ALL as u8]);
// P2PKH scriptSig // P2PKH scriptSig
self.mtx.vin[i].script_sig = self.mtx.vin[i].script_sig =
Script::default() << &sig.serialize_compact()[..] << &info.pubkey[..]; Script::default() << &sig_bytes[..] << &info.pubkey[..];
} }
} }