005. FIDO 2.0 Key Attestation Format - Attestation Statement(증명서) - (2)

FIDO 2.0 Key Attestation Format

FIDO의 3가지 스펙 문서 중 Key Attestation Format부터 정리한다.

블로그 제목의 길이가 길어지면 가독성이 떨어지기 때문에 편의상 KAF로 줄여서 제목을 붙이도록하겠다.

참고 FIDO alliance : FIDO 2.0 Key Attestation Format 문서

Attestation Statement(증명서) - (2)

Attestation Raw Data Type

Attestation Raw Data (rawData) 는 증명서의 서명된 객체를 말한다.

FIDO는 플러그형 Attestation Data Type을 지원하며, 이를 통해 TPM에서 생성된 Attestation Data와 다른 FIDO Authenticator를 지원할 수 있다.

Attestation Data의 내용은 Authenticator가 스스로 생성하거나 검증하는 등의 제어를 수행하여야 한다.

Packed Attestation

Packed Attestation은 Attestation Data를 최적화한 FIDO 형식이다.

Packed Attestation은 작지만 확장 가능한 인코딩 방법을 사용하며, 보안 요소와 같은 제한된 리소스를 가진 Authenticator에 의해 구현될 수 있다.

  • Attestation rawData (type = “packed”)
    Attestation Data는 Authenticator가 스스로 생성한 contextual binding을 인코딩 한다.
    Client Data와는 반대로 Authenticator Data는 작지만 확장 가능한 인코딩을 가지므로, Authenticator는 클라이언트 플랫폼 구성 요소보다 훨씬 간단한 구조로 제한된 기능과 낮은 전력 요구 사항을 가진 장치를 만들 수 있다.
    packed 타입의 경우는 오로지 version이 1로만 정의되며, rawData 필드는 byte 배열의 base64url 인코딩으로 구성된다.
    Attestation Data의 인코딩은 45byte + public key의 길이 + KeyHandle + 또 다른 잠재적인 확장 배열들의 byte 배열로, 아래와 같이 고정된 레이아웃을 가진다.

    Length
    (in bytes)
    Description
    2 0xF1D0
    고정된 big-endian 태그를 사용하여 rawData 객체가 FIDO가 아닌 다른 binary 객체와 혼동되지 않도록 한다
    1 Flags
    Bit 0 : User Prsence 테스트 결과 (TUP)
    Bit 1-6 : 추후 사용을 위해 예약된 Bit (RFU)
    Bit 7: Authenticator의 추가 확장 여부 Bit (ED)
    4 signCount
    서명 개수를 나타내며 32bit의 부호없는 big-endian 정수로 표현한다
    2 public key의 알고리즘 및 인코딩 방식을 나타내며 16bit의 big-endian으로 표현한다
    표현값은 아래와 같다

    1. 0x0100
    raw ANSI X9.62 형식의 타원곡선(Elliptic Curve) public key
    예를 들어 [0x04, X (n bytes), Y (n bytes)] 형식의 경우 0x04는 압축되지 않은 point의 압축 방법을 n은 key의 길이를 말한다

    2. 0x0102
    raw 인코딩된 RSA PKCS1 또는 RSASSA-PSS 형식의 public key
    2 바로 아래 위치칸 public key의 byte 길이 m
    (제일 먼저 도착하는 가장 중요한 16bit)
    (length) public key의 byte 길이 m
    2 KeyHandle의 byte 길이 l
    (length) KeyHandle (l bytes)
    2 clientDataHash의 byte 길이 n
    n 이전 포스트에서 언급된 clientData의 hash값
    hash 알고리즘은 FIDOSignatureFormat 객체에 저장된다
    As defined by the extension map 보다 확장되어 정의된 Authenticator Data
    CBOR Map 형식으로 extension Identifier가 key, extension authenticator data가 value이다

    참고 위키피디아의 타원 곡선 암호 문서

    참고 RSA PKCS1, RSASSA-PSS가 정의된 RFC3447문서

    참고 위키피디아의 CBOR 문서

    Flags 의 비트
    TUP 비트는 Authenticator가 유저의 Authenticator-specific gesture를 감지한 경우에만 설정되어야 한다.

    RFU 비트는 clear(= zeroed) 되어야 한다.

    ED 비트는 Authenticator가 확장을 추가하지 않을 시 지워져야 한다.

  • Extensions for Packed Attestation rawData
    Packed Attestation rawData의 확장자에 대해 알아보자.

    • AAGUID Extension
      • Extension identifier
        fido.aaguid
      • Client argument
        N/A
      • Client processing
        N/A
      • Authenticator argument
        N/A
      • Authenticator processing
        Authenticator processing은 Authenticator가 자동으로 추가하는 확장자로 Attestation statement와 signature에 추가된다.
      • Authenticator data
        CBOR 문자열로 인코딩된 Authenticator Attestation GUID로 128비트의 크기를 가진다.
        이 AAGUID는 Authenticator Model을 식별하는 데 사용된다.
    • SEE : Supported Extensions Extension
      • Extension identifier
        fido.exts
      • Client argument
        N/A
      • Client processing
        N/A
      • Authenticator argument
        N/A
      • Authenticator processing
        Authenticator processing은 Authenticator가 자동으로 추가하는 확장자로 Attestation statement에 추가된다.
      • Authenticator data
        SupportedExtension은 UTF-8로 인코딩된 CBOR 배열이다.
    • UVI : User Verification Index Extension
      • Extension identifier
        fido.uvi
      • Client argument
        N/A
      • Client processing
        N/A
      • Authenticator argument
        N/A
      • Authenticator processing
        Authenticator processing은 Authenticator가 자동으로 추가하는 확장자로 Attestation statement와 signature에 추가된다.
      • Authenticator data
        UVI 는 User Verification data record를 식별할 수 있는 고유값으로 CBOR byte 문자열로 인코딩된다.(유형은 0x58이다)
        각 UVI값은 관련된 key에 고유한 값이며 이는 unlinkability(링크 해제)를 위해 필요하다.
        Authenticator는 다른 생체 인식 데이터나 user의 경우 UVI값을 재사용할 수 없다.
        UVI 값은 FIDO 서버에서 초기 키를 생성할 때 동일한 생체 인식 데이터로 인증되었는지 여부를 파악할 때 사용하여 friendly fraud를 찾아내고 방지할 수 있다.
        UVI확장을 지원하는 FIDO 서버는 UVI값에 32 byte를 할당해야 한다.

        참고 friendly fraud는 직역하면 우연한 사기이며 국내에서는 친절한 사기꾼이라는 용어로 쓰인다.

  • Signature
    Signature는 base64url방식으로 디코딩된 rawData 필드를 통해 계산된다.

    아래의 4가지 알고리즘은 FIDO 서버에서 꼭 구현해야 한다.

    Authenticator는 위의 알고리즘 중에 하나를 선택하여 구현할 수 있다.

  • Attestation statement certificate requirements

    참고 DDA Attestation의 경우 Attestation certificate가 사용되지 않는다.

    Attestation certificate는 아래의 필드/확장자가 있어야 하며 Version은 3으로 설정한다.

    • Subject-C
      Authenticator 공급업체가 설립된 국가(Country)
    • Subject-O
      Authenticator 공급업체의 법률상의 이름
    • Subject-OU
      Authenticator Attestation
    • Subject-CN
      No Stipulation (규정이 존재하지않음)

    related attestation root certificate(인증 관련 루트 인증서)가 여러 Authenticator 모델에 사용되는 경우 아래의 표현 규칙에 따라야 한다.

    • Extension OID 는 id-fido-gen-ce-aaguid값으로 AAGUID를 포함한다.

      참고 OID 는 Object Identifier(객체 식별자)를 말한다.

      참고 id-fido-gen-ce-aaguid 값은 1 3 6 1 4 1 45724 1 1 4다.

    • Basic Constrains extension(기본적인 확장 제약 조건)은 CA 구성요소를 false로 설정해야 한다.

    • id-ad-ocsp 엔트리와 CRL DP extension을 가진 AIA의 확장은 Attestation certificate의 status가 FIDO Metadata Service를 통해 사용 가능하다.

      참고 CRL : Certificate Revocation List, 인증서 폐기 목록

    참고 DP : Distribution Point, 배포지점

    참고 FIDO Metadata Service Document