Skip to content

Commit e562c01

Browse files
authored
Merge pull request #388 from Yubico/fido-mds-new-alg
Fix crash on unknown COSEAlgorithmIdentifier in FIDO MDS
2 parents 5d510c5 + 160e0e2 commit e562c01

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

NEWS

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
== Version 2.5.4 (unreleased) ==
2+
3+
`webauthn-server-attestation`:
4+
5+
Fixes:
6+
7+
* `AuthenticatorGetInfo.algorithms` now silently ignores unknown
8+
`COSEAlgorithmIdentifier` and `PublicKeyCredentialType` values instead of
9+
rejecting the MDS BLOB.
10+
11+
112
== Version 2.5.3 ==
213

314
`webauthn-server-attestation`:

webauthn-server-attestation/src/main/java/com/yubico/fido/metadata/AuthenticatorGetInfo.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.yubico.fido.metadata;
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.fasterxml.jackson.core.JacksonException;
45
import com.fasterxml.jackson.core.JsonGenerator;
56
import com.fasterxml.jackson.core.JsonParser;
67
import com.fasterxml.jackson.databind.DeserializationContext;
@@ -19,6 +20,7 @@
1920
import java.util.Optional;
2021
import java.util.Set;
2122
import java.util.stream.Collectors;
23+
import java.util.stream.Stream;
2224
import lombok.Builder;
2325
import lombok.NonNull;
2426
import lombok.Value;
@@ -116,6 +118,7 @@ public class AuthenticatorGetInfo {
116118
* href="https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html#authenticatorGetInfo">Client
117119
* to Authenticator Protocol (CTAP) §6.4. authenticatorGetInfo (0x04)</a>
118120
*/
121+
@JsonDeserialize(using = ListPublicKeyCredentialParametersIgnoringUnknownValuesDeserializer.class)
119122
List<PublicKeyCredentialParameters> algorithms;
120123

121124
/**
@@ -377,4 +380,44 @@ public void serialize(
377380
value.stream().reduce(0, (acc, next) -> acc | next.getValue(), (a, b) -> a | b));
378381
}
379382
}
383+
384+
@Value
385+
@JsonDeserialize(using = PublicKeyCredentialParametersIgnoringUnknownValues.Deserializer.class)
386+
private static class PublicKeyCredentialParametersIgnoringUnknownValues {
387+
PublicKeyCredentialParameters value;
388+
389+
private static class Deserializer
390+
extends JsonDeserializer<PublicKeyCredentialParametersIgnoringUnknownValues> {
391+
@Override
392+
public PublicKeyCredentialParametersIgnoringUnknownValues deserialize(
393+
JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
394+
try {
395+
return new PublicKeyCredentialParametersIgnoringUnknownValues(
396+
p.readValueAs(PublicKeyCredentialParameters.class));
397+
} catch (IOException e) {
398+
return null;
399+
}
400+
}
401+
}
402+
}
403+
404+
private static class ListPublicKeyCredentialParametersIgnoringUnknownValuesDeserializer
405+
extends JsonDeserializer<List<PublicKeyCredentialParameters>> {
406+
@Override
407+
public List<PublicKeyCredentialParameters> deserialize(
408+
JsonParser p, DeserializationContext ctxt) throws IOException {
409+
PublicKeyCredentialParametersIgnoringUnknownValues[] pkcpiuvs =
410+
p.readValueAs(PublicKeyCredentialParametersIgnoringUnknownValues[].class);
411+
return Arrays.stream(pkcpiuvs)
412+
.flatMap(
413+
pkcpiuv -> {
414+
if (pkcpiuv != null && pkcpiuv.value != null) {
415+
return Stream.of(pkcpiuv.value);
416+
} else {
417+
return Stream.empty();
418+
}
419+
})
420+
.collect(Collectors.toList());
421+
}
422+
}
380423
}

0 commit comments

Comments
 (0)