| 1 | package com.yubico.fido.metadata; | |
| 2 | ||
| 3 | import com.fasterxml.jackson.annotation.JsonCreator; | |
| 4 | import com.fasterxml.jackson.annotation.JsonValue; | |
| 5 | import java.util.regex.Pattern; | |
| 6 | import lombok.Value; | |
| 7 | ||
| 8 | /** | |
| 9 |  * Each UAF authenticator MUST have an AAID to identify UAF enabled authenticator models globally. | |
| 10 |  * The AAID MUST uniquely identify a specific authenticator model within the range of all | |
| 11 |  * UAF-enabled authenticator models made by all authenticator vendors, where authenticators of a | |
| 12 |  * specific model must share identical security characteristics within the model (see Security | |
| 13 |  * Considerations). | |
| 14 |  * | |
| 15 |  * <p>The AAID is a string with format <code>"V#M"</code>, where | |
| 16 |  * | |
| 17 |  * <ul> | |
| 18 |  *   <li><code>#</code> is a separator | |
| 19 |  *   <li><code>V</code> indicates the authenticator Vendor Code. This code consists of 4 hexadecimal | |
| 20 |  *       digits. | |
| 21 |  *   <li><code>M</code> indicates the authenticator Model Code. This code consists of 4 hexadecimal | |
| 22 |  *       digits. | |
| 23 |  * </ul> | |
| 24 |  * | |
| 25 |  * @see <a | |
| 26 |  *     href="https://fidoalliance.org/specs/fido-uaf-v1.2-ps-20201020/fido-uaf-protocol-v1.2-ps-20201020.html#authenticator-attestation-id-aaid-typedef">FIDO | |
| 27 |  *     UAF Protocol Specification §3.1.4 Authenticator Attestation ID (AAID) typedef</a> | |
| 28 |  */ | |
| 29 | @Value | |
| 30 | public class AAID { | |
| 31 | ||
| 32 |   private static final Pattern AAID_PATTERN = Pattern.compile("^[0-9a-fA-F]{4}#[0-9a-fA-F]{4}$"); | |
| 33 | ||
| 34 |   /** | |
| 35 |    * The underlying string value of this AAID. | |
| 36 |    * | |
| 37 |    * <p>The AAID is a string with format <code>"V#M"</code>, where | |
| 38 |    * | |
| 39 |    * <ul> | |
| 40 |    *   <li><code>#</code> is a separator | |
| 41 |    *   <li><code>V</code> indicates the authenticator Vendor Code. This code consists of 4 | |
| 42 |    *       hexadecimal digits. | |
| 43 |    *   <li><code>M</code> indicates the authenticator Model Code. This code consists of 4 | |
| 44 |    *       hexadecimal digits. | |
| 45 |    * </ul> | |
| 46 |    * | |
| 47 |    * @see <a | |
| 48 |    *     href="https://fidoalliance.org/specs/fido-uaf-v1.2-ps-20201020/fido-uaf-protocol-v1.2-ps-20201020.html#authenticator-attestation-id-aaid-typedef">Authenticator | |
| 49 |    *     Attestation ID (AAID) typedef</a> | |
| 50 |    */ | |
| 51 |   @JsonValue String value; | |
| 52 | ||
| 53 |   /** | |
| 54 |    * Construct an {@link AAID} from its String representation. | |
| 55 |    * | |
| 56 |    * <p>This is the inverse of {@link #getValue()}. | |
| 57 |    * | |
| 58 |    * @param value a {@link String} conforming to the rules specified in the {@link AAID} type. | |
| 59 |    */ | |
| 60 |   @JsonCreator | |
| 61 |   public AAID(String value) { | |
| 62 |     this.value = validate(value); | |
| 63 |   } | |
| 64 | ||
| 65 |   private String validate(String value) { | |
| 66 | 1
1. validate : negated conditional → KILLED |     if (AAID_PATTERN.matcher(value).matches()) { | 
| 67 | 1
1. validate : replaced return value with "" for com/yubico/fido/metadata/AAID::validate → KILLED |       return value; | 
| 68 |     } else { | |
| 69 |       throw new IllegalArgumentException( | |
| 70 |           String.format("Value does not satisfy AAID format: %s", value)); | |
| 71 |     } | |
| 72 |   } | |
| 73 | } | |
| Mutations | ||
| 66 | 1.1 | |
| 67 | 1.1 |