Make cmstar check follow the spec more closely.
Extracted from: 00d04de547
This commit is contained in:
parent
a14db84fea
commit
5358e678b2
15
src/lib.rs
15
src/lib.rs
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
use crypto_api_chachapoly::{ChaCha20Ietf, ChachaPolyIetf};
|
use crypto_api_chachapoly::{ChaCha20Ietf, ChachaPolyIetf};
|
||||||
use rand_core::RngCore;
|
use rand_core::RngCore;
|
||||||
|
use std::convert::TryFrom;
|
||||||
use subtle::{Choice, ConstantTimeEq};
|
use subtle::{Choice, ConstantTimeEq};
|
||||||
|
|
||||||
pub const COMPACT_NOTE_SIZE: usize = 1 + // version
|
pub const COMPACT_NOTE_SIZE: usize = 1 + // version
|
||||||
|
@ -74,7 +75,7 @@ pub trait Domain {
|
||||||
type OutgoingViewingKey;
|
type OutgoingViewingKey;
|
||||||
type ValueCommitment;
|
type ValueCommitment;
|
||||||
type NoteCommitment;
|
type NoteCommitment;
|
||||||
type ExtractedCommitment: Eq;
|
type ExtractedCommitment: Eq + TryFrom<Self::NoteCommitment>;
|
||||||
type Memo;
|
type Memo;
|
||||||
|
|
||||||
fn derive_esk(note: &Self::Note) -> Option<Self::EphemeralSecretKey>;
|
fn derive_esk(note: &Self::Note) -> Option<Self::EphemeralSecretKey>;
|
||||||
|
@ -126,7 +127,7 @@ pub trait Domain {
|
||||||
check: F,
|
check: F,
|
||||||
) -> NoteValidity;
|
) -> NoteValidity;
|
||||||
|
|
||||||
fn extract_note_commitment(note: &Self::Note) -> Self::ExtractedCommitment;
|
fn note_commitment(note: &Self::Note) -> Self::NoteCommitment;
|
||||||
|
|
||||||
fn parse_note_plaintext_without_memo_ivk(
|
fn parse_note_plaintext_without_memo_ivk(
|
||||||
&self,
|
&self,
|
||||||
|
@ -383,10 +384,9 @@ fn check_note_validity<D: Domain>(
|
||||||
epk: &D::EphemeralPublicKey,
|
epk: &D::EphemeralPublicKey,
|
||||||
cmstar: &D::ExtractedCommitment,
|
cmstar: &D::ExtractedCommitment,
|
||||||
) -> NoteValidity {
|
) -> NoteValidity {
|
||||||
if &D::extract_note_commitment(¬e) != cmstar {
|
if D::ExtractedCommitment::try_from(D::note_commitment(¬e))
|
||||||
// Published commitment doesn't match calculated commitment
|
.map_or(false, |cs| &cs == cmstar)
|
||||||
NoteValidity::Invalid
|
{
|
||||||
} else {
|
|
||||||
let epk_bytes = D::epk_bytes(epk);
|
let epk_bytes = D::epk_bytes(epk);
|
||||||
D::check_epk_bytes(¬e, |derived_esk| {
|
D::check_epk_bytes(¬e, |derived_esk| {
|
||||||
if D::epk_bytes(&D::ka_derive_public(¬e, &derived_esk))
|
if D::epk_bytes(&D::ka_derive_public(¬e, &derived_esk))
|
||||||
|
@ -398,6 +398,9 @@ fn check_note_validity<D: Domain>(
|
||||||
NoteValidity::Invalid
|
NoteValidity::Invalid
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
// Published commitment doesn't match calculated commitment
|
||||||
|
NoteValidity::Invalid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue