3131import org .bouncycastle .asn1 .x509 .Extension ;
3232import org .bouncycastle .x509 .extension .X509ExtensionUtil ;
3333import org .springframework .beans .factory .annotation .Autowired ;
34- import org .springframework .beans .factory .annotation .Value ;
3534import org .springframework .stereotype .Service ;
3635
3736import com .fasterxml .jackson .databind .ObjectMapper ;
3837import com .fasterxml .jackson .dataformat .cbor .CBORFactory ;
3938
4039import com .linecorp .line .auth .fido .fido2 .common .AuthenticatorSelectionCriteria ;
4140import com .linecorp .line .auth .fido .fido2 .common .CredentialMediationRequirement ;
41+ import com .linecorp .line .auth .fido .fido2 .common .PublicKeyCredentialParameters ;
4242import com .linecorp .line .auth .fido .fido2 .common .UserVerificationRequirement ;
4343import com .linecorp .line .auth .fido .fido2 .common .crypto .Digests ;
4444import com .linecorp .line .auth .fido .fido2 .common .mdsv3 .metadata .MetadataStatement ;
4545import com .linecorp .line .auth .fido .fido2 .common .server .AttestationType ;
46+ import com .linecorp .line .auth .fido .fido2 .common .server .COSEAlgorithm ;
4647import com .linecorp .line .auth .fido .fido2 .common .server .ServerAuthenticatorAttestationResponse ;
4748import com .linecorp .line .auth .fido .fido2 .server .attestation .AttestationVerificationResult ;
4849import com .linecorp .line .auth .fido .fido2 .server .attestation .AttestationVerifierFactory ;
4950import com .linecorp .line .auth .fido .fido2 .server .attestation .android .keyattestation .AdditionalRevokeChecker ;
5051import com .linecorp .line .auth .fido .fido2 .server .attestation .android .keyattestation .RevokeCheckerClient ;
5152import com .linecorp .line .auth .fido .fido2 .server .error .InternalErrorCode ;
5253import com .linecorp .line .auth .fido .fido2 .server .exception .FIDO2ServerRuntimeException ;
54+ import com .linecorp .line .auth .fido .fido2 .server .helper .CredentialPublicKeyHelper ;
5355import com .linecorp .line .auth .fido .fido2 .server .model .AttestationObject ;
5456import com .linecorp .line .auth .fido .fido2 .server .model .AttestationStatementFormatIdentifier ;
57+ import com .linecorp .line .auth .fido .fido2 .server .property .Fido2Properties ;
5558import com .linecorp .line .auth .fido .fido2 .server .util .AaguidUtil ;
5659import com .linecorp .line .auth .fido .fido2 .server .util .CertPathUtil ;
5760import com .linecorp .line .auth .fido .fido2 .server .util .CertificateUtil ;
@@ -66,16 +69,21 @@ public class AttestationServiceImpl implements AttestationService {
6669 private final VendorSpecificMetadataService vendorSpecificMetadataService ;
6770 private final AttestationVerifierFactory attestationVerifierFactory ;
6871 private final RevokeCheckerClient revokeCheckerClient ;
69-
70- @ Value ("${fido.fido2.accept-unregistered-authenticators}" )
71- private boolean acceptUnregisteredAuthenticators ;
72+ private final Fido2Properties fido2Properties ;
7273
7374 @ Autowired
74- public AttestationServiceImpl (MetadataService metadataService , VendorSpecificMetadataService vendorSpecificMetadataService , AttestationVerifierFactory attestationVerifierFactory , RevokeCheckerClient revokeCheckerClient ) {
75+ public AttestationServiceImpl (
76+ MetadataService metadataService ,
77+ VendorSpecificMetadataService vendorSpecificMetadataService ,
78+ AttestationVerifierFactory attestationVerifierFactory ,
79+ RevokeCheckerClient revokeCheckerClient ,
80+ Fido2Properties fido2Properties
81+ ) {
7582 this .metadataService = metadataService ;
7683 this .vendorSpecificMetadataService = vendorSpecificMetadataService ;
7784 this .attestationVerifierFactory = attestationVerifierFactory ;
7885 this .revokeCheckerClient = revokeCheckerClient ;
86+ this .fido2Properties = fido2Properties ;
7987 }
8088
8189 @ Override
@@ -111,7 +119,7 @@ public AttestationObject getAttestationObject(ServerAuthenticatorAttestationResp
111119 }
112120
113121 @ Override
114- public void attestationObjectValidationCheck (String rpId , AuthenticatorSelectionCriteria authenticatorSelection , AttestationObject attestationObject , CredentialMediationRequirement mediation ) {
122+ public void attestationObjectValidationCheck (String rpId , AuthenticatorSelectionCriteria authenticatorSelection , AttestationObject attestationObject , CredentialMediationRequirement mediation , List < PublicKeyCredentialParameters > publicKeyCredentialParameters ) {
115123 // verify attestationObject.authData.attestedCredentialData
116124 if (attestationObject .getAuthData ().getAttestedCredentialData () == null ) {
117125 throw new FIDO2ServerRuntimeException (InternalErrorCode .CREDENTIAL_NOT_INCLUDED );
@@ -138,6 +146,15 @@ public void attestationObjectValidationCheck(String rpId, AuthenticatorSelection
138146 !attestationObject .getAuthData ().isUserVerified ()) {
139147 throw new FIDO2ServerRuntimeException (InternalErrorCode .USER_VERIFICATION_FLAG_NOT_SET , "User verification flag not set" , AaguidUtil .convert (attestationObject .getAuthData ().getAttestedCredentialData ().getAaguid ()));
140148 }
149+
150+ // Verify "alg" parameter
151+ final COSEAlgorithm coseAlgorithm = CredentialPublicKeyHelper .getCOSEAlgorithm (attestationObject .getAuthData ().getAttestedCredentialData ().getCredentialPublicKey ());
152+ final boolean algorithmExistsInRegOptionResponse = publicKeyCredentialParameters .stream ().anyMatch (
153+ parameter -> parameter .getAlg ().getValue () == coseAlgorithm .getValue ()
154+ );
155+ if (!algorithmExistsInRegOptionResponse ) {
156+ throw new FIDO2ServerRuntimeException (InternalErrorCode .NOT_ALLOWED_COSE_ALGORITHM , "Not allowed algorithm used" );
157+ }
141158 }
142159
143160 @ Override
@@ -167,7 +184,7 @@ public void verifyAttestationCertificate(AttestationObject attestationObject, At
167184
168185 // set attestation root certificate with metadata or vendor specific data
169186 // or skip getting metadata
170- if (!acceptUnregisteredAuthenticators ) { // throw an error if there is no metadata
187+ if (!fido2Properties . isAcceptUnregisteredAuthenticators () ) { // throw an error if there is no metadata
171188 if (attestationRootCertificates == null ) {
172189 throw new FIDO2ServerRuntimeException (InternalErrorCode .METADATA_NOT_FOUND );
173190 }
0 commit comments