@@ -30,7 +30,8 @@ impl<CS: PrivateCipherSuite> Server<CS> {
3030 <CS :: Group as Group >:: Scalar : Send + Sync ,
3131 <CS :: Group as Group >:: Elem : Send + Sync ,
3232 {
33- VoprfServer :: < CS > :: new_from_seed ( seed, info) . map_err ( |_| CreateKeypairError :: SeedError )
33+ VoprfServer :: < CS > :: new_from_seed ( seed, info)
34+ . map_err ( |source| CreateKeypairError :: SeedError { source } )
3435 }
3536
3637 /// Create a new server. The new server does not contain any key material.
@@ -103,7 +104,10 @@ impl<CS: PrivateCipherSuite> Server<CS> {
103104 token_request : AmortizedBatchTokenRequest < CS > ,
104105 ) -> Result < AmortizedBatchTokenResponse < CS > , IssueTokenResponseError > {
105106 if token_request. token_type != CS :: token_type ( ) {
106- return Err ( IssueTokenResponseError :: InvalidTokenType ) ;
107+ return Err ( IssueTokenResponseError :: InvalidTokenType {
108+ expected : CS :: token_type ( ) ,
109+ found : token_request. token_type ,
110+ } ) ;
107111 }
108112 let server = key_store
109113 . get ( & token_request. truncated_token_key_id )
@@ -113,7 +117,7 @@ impl<CS: PrivateCipherSuite> Server<CS> {
113117 let mut blinded_elements = Vec :: new ( ) ;
114118 for element in token_request. blinded_elements . iter ( ) {
115119 let blinded_element = BlindedElement :: < CS > :: deserialize ( & element. blinded_element )
116- . map_err ( |_ | IssueTokenResponseError :: InvalidTokenRequest ) ?;
120+ . map_err ( |source | IssueTokenResponseError :: InvalidBlindedMessage { source } ) ?;
117121 blinded_elements. push ( blinded_element) ;
118122 }
119123
@@ -122,7 +126,7 @@ impl<CS: PrivateCipherSuite> Server<CS> {
122126 . collect :: < Vec < _ > > ( ) ;
123127 let VoprfServerBatchEvaluateFinishResult { messages, proof } = server
124128 . batch_blind_evaluate_finish ( & mut OsRng , blinded_elements. iter ( ) , & prepared_elements)
125- . map_err ( |_ | IssueTokenResponseError :: InvalidTokenRequest ) ?;
129+ . map_err ( |source | IssueTokenResponseError :: BlindEvaluationFailed { source } ) ?;
126130
127131 let evaluated_elements = messages
128132 . map ( |m| super :: EvaluatedElement {
@@ -149,18 +153,26 @@ impl<CS: PrivateCipherSuite> Server<CS> {
149153 nonce_store : & NS ,
150154 token : AmortizedToken < CS > ,
151155 ) -> Result < ( ) , RedeemTokenError > {
152- if token. token_type ( ) != CS :: token_type ( ) {
153- return Err ( RedeemTokenError :: InvalidToken ) ;
156+ let token_type = token. token_type ( ) ;
157+ if token_type != CS :: token_type ( ) {
158+ return Err ( RedeemTokenError :: TokenTypeMismatch {
159+ expected : CS :: token_type ( ) ,
160+ found : token_type,
161+ } ) ;
154162 }
155163 let auth_len = <<CS :: Hash as OutputSizeUser >:: OutputSize as Unsigned >:: USIZE ;
156- if token. authenticator ( ) . len ( ) != auth_len {
157- return Err ( RedeemTokenError :: InvalidToken ) ;
164+ let authenticator_len = token. authenticator ( ) . len ( ) ;
165+ if authenticator_len != auth_len {
166+ return Err ( RedeemTokenError :: InvalidAuthenticatorLength {
167+ expected : auth_len,
168+ found : authenticator_len,
169+ } ) ;
158170 }
159171 if nonce_store. exists ( & token. nonce ( ) ) . await {
160172 return Err ( RedeemTokenError :: DoubleSpending ) ;
161173 }
162174 let token_input = TokenInput {
163- token_type : token . token_type ( ) ,
175+ token_type,
164176 nonce : token. nonce ( ) ,
165177 challenge_digest : * token. challenge_digest ( ) ,
166178 token_key_id : * token. token_key_id ( ) ,
@@ -171,13 +183,16 @@ impl<CS: PrivateCipherSuite> Server<CS> {
171183 . ok_or ( RedeemTokenError :: KeyIdNotFound ) ?;
172184 let token_authenticator = server
173185 . evaluate ( & token_input. serialize ( ) )
174- . map_err ( |_| RedeemTokenError :: InvalidToken ) ?
186+ . map_err ( |source| RedeemTokenError :: AuthenticatorDerivationFailed {
187+ token_type,
188+ source,
189+ } ) ?
175190 . to_vec ( ) ;
176191 if token. authenticator ( ) == token_authenticator {
177192 nonce_store. insert ( token. nonce ( ) ) . await ;
178193 Ok ( ( ) )
179194 } else {
180- Err ( RedeemTokenError :: InvalidToken )
195+ Err ( RedeemTokenError :: AuthenticatorMismatch { token_type } )
181196 }
182197 }
183198
@@ -193,7 +208,7 @@ impl<CS: PrivateCipherSuite> Server<CS> {
193208 <CS :: Group as Group >:: Elem : Send + Sync ,
194209 {
195210 let server = VoprfServer :: < CS > :: new_with_key ( private_key)
196- . map_err ( |_ | CreateKeypairError :: SeedError ) ?;
211+ . map_err ( |source | CreateKeypairError :: SeedError { source } ) ?;
197212 let public_key = server. get_public_key ( ) ;
198213 let token_key_id = public_key_to_token_key_id :: < CS > ( & server. get_public_key ( ) ) ;
199214 key_store
0 commit comments