@@ -8,6 +8,8 @@ use serde::{Deserialize, Serialize};
88use serde_bytes:: ByteBuf ;
99use sha3:: { Digest , Sha3_256 } ;
1010
11+ use crate :: unix_ms;
12+
1113const PERMITTED_DRIFT : u64 = 10 ; // seconds
1214
1315// Token format: [expire_at in seconds, agent, signature]
@@ -27,7 +29,7 @@ pub fn ed25519_sign(key: &ed25519_dalek::SigningKey, expire_at: u64, agent: Stri
2729
2830pub fn ed25519_verify ( keys : & [ ed25519_dalek:: VerifyingKey ] , data : & [ u8 ] ) -> Result < Token , String > {
2931 let token: Token = from_reader ( data) . map_err ( |_err| "failed to decode CBOR data" ) ?;
30- if token. 0 + PERMITTED_DRIFT < chrono :: Utc :: now ( ) . timestamp ( ) as u64 {
32+ if token. 0 + PERMITTED_DRIFT < unix_ms ( ) / 1000 {
3133 return Err ( "token expired" . to_string ( ) ) ;
3234 }
3335 let sig = ed25519_dalek:: Signature :: from_slice ( token. 2 . as_slice ( ) )
@@ -60,7 +62,7 @@ pub fn ecdsa_sign(key: &ecdsa::SigningKey, expire_at: u64, agent: String) -> Vec
6062// Secp256k1
6163pub fn ecdsa_verify ( keys : & [ ecdsa:: VerifyingKey ] , data : & [ u8 ] ) -> Result < Token , String > {
6264 let token: Token = from_reader ( data) . map_err ( |_err| "failed to decode CBOR data" ) ?;
63- if token. 0 + PERMITTED_DRIFT < chrono :: Utc :: now ( ) . timestamp ( ) as u64 {
65+ if token. 0 + PERMITTED_DRIFT < unix_ms ( ) / 1000 {
6466 return Err ( "token expired" . to_string ( ) ) ;
6567 }
6668 let sig = ecdsa:: Signature :: try_from ( token. 2 . as_slice ( ) )
@@ -98,7 +100,7 @@ mod test {
98100 let signing_key: ed25519_dalek:: SigningKey =
99101 ed25519_dalek:: SigningKey :: from_bytes ( & secret_key) ;
100102 let agent = "alice" . to_string ( ) ;
101- let expire_at = chrono :: Utc :: now ( ) . timestamp ( ) as u64 + 3600 ;
103+ let expire_at = unix_ms ( ) / 1000 + 3600 ;
102104 let signed = super :: ed25519_sign ( & signing_key, expire_at, agent. clone ( ) ) ;
103105 let token = super :: ed25519_verify ( & [ signing_key. verifying_key ( ) ] , & signed) . unwrap ( ) ;
104106 assert_eq ! ( token. 0 , expire_at) ;
@@ -110,7 +112,7 @@ mod test {
110112 fn test_secp256k1_token ( ) {
111113 let signing_key = ecdsa:: SigningKey :: random ( & mut OsRng ) ;
112114 let agent = "alice" . to_string ( ) ;
113- let expire_at = chrono :: Utc :: now ( ) . timestamp ( ) as u64 + 3600 ;
115+ let expire_at = unix_ms ( ) / 1000 + 3600 ;
114116 let signed = super :: ecdsa_sign ( & signing_key, expire_at, agent. clone ( ) ) ;
115117 let token =
116118 super :: ecdsa_verify ( & [ ecdsa:: VerifyingKey :: from ( & signing_key) ] , & signed) . unwrap ( ) ;
0 commit comments