Sha256: 285d834af6af2d1ba7c8456faf4acd5f46f1f50ab0f981fe5b1190982416247f

Contents?: true

Size: 1.53 KB

Versions: 3

Compression:

Stored size: 1.53 KB

Contents

# frozen_string_literal: true

require_relative "authorization_list"

module AndroidKeyAttestation
  class KeyDescription
    # https://developer.android.com/training/articles/security-key-attestation#certificate_schema
    ATTESTATION_VERSION_INDEX = 0
    ATTESTATION_SECURITY_LEVEL_INDEX = 1
    KEYMASTER_VERSION_INDEX = 2
    KEYMASTER_SECURITY_LEVEL_INDEX = 3
    ATTESTATION_CHALLENGE_INDEX = 4
    UNIQUE_ID_INDEX = 5
    SOFTWARE_ENFORCED_INDEX = 6
    TEE_ENFORCED_INDEX = 7

    SECURITY_LEVEL_ENUM = {
      0 => :software,
      1 => :trusted_environment,
      2 => :strong_box
    }.freeze

    def initialize(sequence)
      @sequence = sequence
    end

    def attestation_version
      Integer(sequence[ATTESTATION_VERSION_INDEX].value)
    end

    def attestation_security_level
      SECURITY_LEVEL_ENUM.fetch(Integer(sequence[ATTESTATION_SECURITY_LEVEL_INDEX].value))
    end

    def keymaster_version
      Integer(sequence[KEYMASTER_VERSION_INDEX].value)
    end

    def keymaster_security_level
      SECURITY_LEVEL_ENUM.fetch(Integer(sequence[KEYMASTER_SECURITY_LEVEL_INDEX].value))
    end

    def attestation_challenge
      sequence[ATTESTATION_CHALLENGE_INDEX].value
    end

    def unique_id
      sequence[UNIQUE_ID_INDEX].value
    end

    def tee_enforced
      @tee_enforced ||= AuthorizationList.new(sequence[TEE_ENFORCED_INDEX].value)
    end

    def software_enforced
      @software_enforced ||= AuthorizationList.new(sequence[SOFTWARE_ENFORCED_INDEX].value)
    end

    private

    attr_reader :sequence
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
android_key_attestation-0.3.0 lib/android_key_attestation/key_description.rb
android_key_attestation-0.2.0 lib/android_key_attestation/key_description.rb
android_key_attestation-0.1.0 lib/android_key_attestation/key_description.rb