Skip to content

Commit 08d75c7

Browse files
authored
Make code more rust idiomatic (#41)
* Remove redundant borrows. * Fix warning * Replace returns with ? * Use same String -> &str style Signed-off-by: joeydelarago <[email protected]>
1 parent 37fed48 commit 08d75c7

File tree

4 files changed

+46
-57
lines changed

4 files changed

+46
-57
lines changed

src/holder.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -152,20 +152,10 @@ impl SDJWTHolder {
152152
.unwrap_or(&default_list)
153153
.iter()
154154
.filter_map(|digest| {
155-
let digest = match digest.as_str() {
156-
Some(digest) => digest,
157-
None => return None,
158-
};
159-
if let Some(Value::Array(disclosure)) =
160-
self.sd_jwt_engine.hash_to_decoded_disclosure.get(digest)
161-
{
162-
let key = match disclosure[1].as_str() {
163-
Some(digest) => digest,
164-
None => return None,
165-
};
166-
return Some((key, (&disclosure[2], digest)));
167-
}
168-
None
155+
let digest = digest.as_str()?;
156+
let disclosure = self.sd_jwt_engine.hash_to_decoded_disclosure.get(digest)?;
157+
let key = disclosure[1].as_str()?;
158+
Some((key, (&disclosure[2], digest)))
169159
})
170160
.collect(); //TODO split to 2 maps
171161
for (key_to_disclose, value_to_disclose) in claims_to_disclose {
@@ -323,7 +313,7 @@ impl SDJWTHolder {
323313
self.set_key_binding_digest_key()?;
324314
// Create key-binding jwt
325315
let mut header = Header::new(
326-
Algorithm::from_str(alg.as_str())
316+
Algorithm::from_str(&alg)
327317
.map_err(|e| Error::DeserializationError(e.to_string()))?,
328318
);
329319
header.typ = Some(crate::KB_JWT_TYP_HEADER.into());

src/issuer.rs

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -317,46 +317,45 @@ impl SDJWTIssuer {
317317
}
318318

319319
fn create_combined(&mut self) -> Result<()> {
320-
if self.inner.serialization_format == SDJWTSerializationFormat::Compact {
321-
let mut disclosures: VecDeque<String> = self
322-
.all_disclosures
323-
.iter()
324-
.map(|d| d.raw_b64.to_string())
325-
.collect();
326-
disclosures.push_front(self.signed_sd_jwt.clone());
327-
328-
let disclosures: Vec<&str> = disclosures.iter().map(|s| s.as_str()).collect();
329-
330-
self.serialized_sd_jwt = format!(
331-
"{}{}",
332-
disclosures.join(COMBINED_SERIALIZATION_FORMAT_SEPARATOR),
333-
COMBINED_SERIALIZATION_FORMAT_SEPARATOR,
334-
);
335-
} else if self.inner.serialization_format == SDJWTSerializationFormat::JSON {
336-
let jwt: Vec<&str> = self.signed_sd_jwt.split('.').collect();
337-
if jwt.len() != 3 {
338-
return Err(Error::InvalidInput(format!(
339-
"Invalid JWT, JWT must contain three parts after splitting with \".\": jwt {}",
340-
self.signed_sd_jwt
341-
)));
342-
}
343-
let sd_jwt_json = SDJWTJson {
344-
protected: jwt[0].to_owned(),
345-
payload: jwt[1].to_owned(),
346-
signature: jwt[2].to_owned(),
347-
kb_jwt: None,
348-
disclosures: self
320+
match self.inner.serialization_format {
321+
SDJWTSerializationFormat::Compact => {
322+
let mut disclosures: VecDeque<String> = self
349323
.all_disclosures
350324
.iter()
351325
.map(|d| d.raw_b64.to_string())
352-
.collect(),
353-
};
354-
self.serialized_sd_jwt = serde_json::to_string(&sd_jwt_json)
355-
.map_err(|e| Error::DeserializationError(e.to_string()))?;
356-
} else {
357-
return Err(Error::InvalidInput(
358-
format!("Unknown serialization format {}, only \"Compact\" or \"JSON\" formats are supported", self.inner.serialization_format)
359-
));
326+
.collect();
327+
disclosures.push_front(self.signed_sd_jwt.clone());
328+
329+
let disclosures: Vec<&str> = disclosures.iter().map(|s| s.as_str()).collect();
330+
331+
self.serialized_sd_jwt = format!(
332+
"{}{}",
333+
disclosures.join(COMBINED_SERIALIZATION_FORMAT_SEPARATOR),
334+
COMBINED_SERIALIZATION_FORMAT_SEPARATOR,
335+
);
336+
},
337+
SDJWTSerializationFormat::JSON => {
338+
let jwt: Vec<&str> = self.signed_sd_jwt.split('.').collect();
339+
if jwt.len() != 3 {
340+
return Err(Error::InvalidInput(format!(
341+
"Invalid JWT, JWT must contain three parts after splitting with \".\": jwt {}",
342+
self.signed_sd_jwt
343+
)));
344+
}
345+
let sd_jwt_json = SDJWTJson {
346+
protected: jwt[0].to_owned(),
347+
payload: jwt[1].to_owned(),
348+
signature: jwt[2].to_owned(),
349+
kb_jwt: None,
350+
disclosures: self
351+
.all_disclosures
352+
.iter()
353+
.map(|d| d.raw_b64.to_string())
354+
.collect(),
355+
};
356+
self.serialized_sd_jwt = serde_json::to_string(&sd_jwt_json)
357+
.map_err(|e| Error::DeserializationError(e.to_string()))?;
358+
}
360359
}
361360

362361
Ok(())

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const CNF_KEY: &str = "cnf";
3333
const JWK_KEY: &str = "jwk";
3434

3535
#[derive(Debug)]
36+
#[allow(dead_code)]
3637
pub(crate) struct SDJWTHasSDClaimException(String);
3738

3839
impl SDJWTHasSDClaimException {}
@@ -146,7 +147,7 @@ impl SDJWTCommon {
146147
length: parts.len(),
147148
msg: format!("Invalid SD-JWT: {}", sd_jwt_with_disclosures),
148149
})?;
149-
self.sign_alg = Self::decode_header_and_get_sign_algorithm(&sd_jwt);
150+
self.sign_alg = Self::decode_header_and_get_sign_algorithm(sd_jwt);
150151
self.unverified_input_key_binding_jwt = Some(
151152
parts
152153
.next_back()

src/verifier.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ impl SDJWTVerifier {
7676
let sign_alg = verifier.sd_jwt_engine.unverified_input_key_binding_jwt
7777
.as_ref()
7878
.and_then(|value| {
79-
SDJWTCommon::decode_header_and_get_sign_algorithm(&value)
79+
SDJWTCommon::decode_header_and_get_sign_algorithm(value)
8080
});
8181

8282
verifier.verify_key_binding_jwt(
@@ -180,10 +180,10 @@ impl SDJWTVerifier {
180180
Algorithm::from_str(sign_alg)
181181
.map_err(|e| Error::DeserializationError(e.to_string()))?,
182182
);
183-
validation.set_audience(&[expected_aud.as_str()]);
183+
validation.set_audience(&[&expected_aud]);
184184
validation.set_required_spec_claims(&["aud"]);
185185

186-
jsonwebtoken::decode::<Map<String, Value>>(payload.as_str(), &pubkey, &validation)
186+
jsonwebtoken::decode::<Map<String, Value>>(&payload, &pubkey, &validation)
187187
.map_err(|e| Error::DeserializationError(e.to_string()))?
188188
}
189189
None => {
@@ -216,7 +216,6 @@ impl SDJWTVerifier {
216216
.unverified_sd_jwt
217217
.as_ref()
218218
.ok_or(Error::ConversionError("reference".to_string()))?
219-
.as_str(),
220219
);
221220
combined.extend(
222221
self.sd_jwt_engine

0 commit comments

Comments
 (0)