File: key_description.rb

package info (click to toggle)
ruby-android-key-attestation 0.3.0-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 216 kB
  • sloc: ruby: 352; makefile: 7; sh: 4
file content (63 lines) | stat: -rw-r--r-- 1,563 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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