summaryrefslogtreecommitdiff
path: root/test/tpm_test/hkdf_test.py
blob: cd42901ccf919697d9c2841a4741926fbf6a1452 (plain)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# -*- coding: utf-8 -*-
# Copyright 2016 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Module for testing HKDF using extended commands."""

from binascii import a2b_hex as a2b

import subcmd
import utils


_HKDF_OPCODES = {
  'TEST_RFC': 0x00,
}


# Command format.
#
#    WIDTH         FIELD
#    1             OP
#    1             MSB SALT LEN
#    1             LSB SALT LEN
#    SALT_LEN      SALT
#    1             MSB IKM LEN
#    1             LSB IKM LEN
#    IKM_LEN       IKM
#    1             MSB INFO LEN
#    1             LSB INFO LEN
#    INFO_LEN      INFO
#    1             MSB OKM LEN
#    1             LSB OKM LEN
def _rfc_test_cmd(salt, ikm, info, okml):
    return _HKDF_OPCODES['TEST_RFC'].to_bytes(1, 'big') + \
          len(salt).to_bytes(2, 'big') + salt + \
          len(ikm).to_bytes(2, 'big') + ikm + \
          len(info).to_bytes(2, 'big') + info + okml.to_bytes(2, 'big')

#
# Test vectors for HKDF-SHA256 from RFC 5869.
#
_RFC_TEST_INPUTS = (
  (
    '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
    '000102030405060708090a0b0c',
    'f0f1f2f3f4f5f6f7f8f9',
    ('3cb25f25faacd57a90434f64d0362f2a'
     '2d2d0a90cf1a5a4c5db02d56ecc4c5bf'
     '34007208d5b887185865'),
    'BASIC',
  ),
  (
    ('000102030405060708090a0b0c0d0e0f'
     '101112131415161718191a1b1c1d1e1f'
     '202122232425262728292a2b2c2d2e2f'
     '303132333435363738393a3b3c3d3e3f'
     '404142434445464748494a4b4c4d4e4f'),
    ('606162636465666768696a6b6c6d6e6f'
     '707172737475767778797a7b7c7d7e7f'
     '808182838485868788898a8b8c8d8e8f'
     '909192939495969798999a9b9c9d9e9f'
     'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf'),
    ('b0b1b2b3b4b5b6b7b8b9babbbcbdbebf'
     'c0c1c2c3c4c5c6c7c8c9cacbcccdcecf'
     'd0d1d2d3d4d5d6d7d8d9dadbdcdddedf'
     'e0e1e2e3e4e5e6e7e8e9eaebecedeeef'
     'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'),
    ('b11e398dc80327a1c8e7f78c596a4934'
     '4f012eda2d4efad8a050cc4c19afa97c'
     '59045a99cac7827271cb41c65e590e09'
     'da3275600c2f09b8367793a9aca3db71'
     'cc30c58179ec3e87c14c01d5c1f3434f'
     '1d87'),
    'LONG INPUTS',
  ),
  (
    '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
    '',
    '',
    ('8da4e775a563c18f715f802a063c5a31'
     'b8a11f5c5ee1879ec3454e5f3c738d2d'
     '9d201395faa4b61a96c8'),
    'ZERO SALT/INFO',
  )
)


def _rfc_tests(tpm):
    for data in _RFC_TEST_INPUTS:
        ikm, salt, info, okm = map(a2b, data[:-1])
        test_name = 'HKDF:SHA256:%s' % data[-1]
        cmd = _rfc_test_cmd(salt, ikm, info, len(okm))
        wrapped_response = tpm.command(tpm.wrap_ext_command(subcmd.HKDF, cmd))
        result = tpm.unwrap_ext_response(subcmd.HKDF, wrapped_response)

        if result != okm:
            raise subcmd.TpmTestError('%s error:%s%s' % (
              test_name, utils.hex_dump(result), utils.hex_dump(okm)))
        print('%sSUCCESS: %s' % (utils.cursor_back(), test_name))


def hkdf_test(tpm):
    """Run HKDF tests"""
    _rfc_tests(tpm)