Dates should just be u32, not u64

This commit is contained in:
Ian Goldberg 2021-05-01 15:33:45 -04:00
parent 8a19376edc
commit 33f3de3b68
2 changed files with 16 additions and 5 deletions

View File

@ -249,8 +249,9 @@ impl BridgeAuth {
} }
/// Get today's (real or simulated) date /// Get today's (real or simulated) date
fn today(&self) -> u64 { fn today(&self) -> u32 {
// We will not encounter negative Julian dates (~6700 years ago) // We will not encounter negative Julian dates (~6700 years ago)
// or ones larger than 32 bits
(time::OffsetDateTime::now_utc().date() + self.time_offset) (time::OffsetDateTime::now_utc().date() + self.time_offset)
.julian_day() .julian_day()
.try_into() .try_into()
@ -308,6 +309,16 @@ pub fn scalar_u64(s: &Scalar) -> Option<u64> {
Some(u64::from_le_bytes(sbytes[..8].try_into().unwrap())) Some(u64::from_le_bytes(sbytes[..8].try_into().unwrap()))
} }
/// Try to extract a u32 from a Scalar
pub fn scalar_u32(s: &Scalar) -> Option<u32> {
// Check that the top 28 bytes of the Scalar are 0
let sbytes = s.as_bytes();
if sbytes[4..].ct_eq(&[0u8; 28]).unwrap_u8() == 0 {
return None;
}
Some(u32::from_le_bytes(sbytes[..4].try_into().unwrap()))
}
/// Double a Scalar /// Double a Scalar
pub fn scalar_dbl(s: &Scalar) -> Scalar { pub fn scalar_dbl(s: &Scalar) -> Scalar {
s + s s + s

View File

@ -41,7 +41,7 @@ use std::collections::HashMap;
use super::super::cred; use super::super::cred;
use super::super::dup_filter::SeenType; use super::super::dup_filter::SeenType;
use super::super::migration_table; use super::super::migration_table;
use super::super::{pt_dbl, scalar_dbl, scalar_u64}; use super::super::{pt_dbl, scalar_dbl, scalar_u32};
use super::super::{BridgeAuth, IssuerPubKey}; use super::super::{BridgeAuth, IssuerPubKey};
use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE}; use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE};
@ -52,7 +52,7 @@ use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE};
/// The implementation also puts an upper bound of UNTRUSTED_INTERVAL + /// The implementation also puts an upper bound of UNTRUSTED_INTERVAL +
/// 511 days, which is not unreasonable; we want users to be engaging /// 511 days, which is not unreasonable; we want users to be engaging
/// with the system in order to move up trust levels. /// with the system in order to move up trust levels.
pub const UNTRUSTED_INTERVAL: u64 = 30; pub const UNTRUSTED_INTERVAL: u32 = 30;
pub struct Request { pub struct Request {
// Fields for blind showing the Lox credential // Fields for blind showing the Lox credential
@ -157,7 +157,7 @@ define_proof! {
pub fn request( pub fn request(
lox_cred: &cred::Lox, lox_cred: &cred::Lox,
lox_pub: &IssuerPubKey, lox_pub: &IssuerPubKey,
today: u64, today: u32,
) -> Result<(Request, State), ProofError> { ) -> Result<(Request, State), ProofError> {
let A: &RistrettoPoint = &CMZ_A; let A: &RistrettoPoint = &CMZ_A;
let B: &RistrettoPoint = &CMZ_B; let B: &RistrettoPoint = &CMZ_B;
@ -166,7 +166,7 @@ pub fn request(
// Ensure the credential can be correctly shown: it must be the case // Ensure the credential can be correctly shown: it must be the case
// that level_since + UNTRUSTED_INTERVAL <= today. // that level_since + UNTRUSTED_INTERVAL <= today.
let level_since: u64 = match scalar_u64(&lox_cred.level_since) { let level_since: u32 = match scalar_u32(&lox_cred.level_since) {
Some(v) => v, Some(v) => v,
None => return Err(ProofError::VerificationFailure), None => return Err(ProofError::VerificationFailure),
}; };