blob: 59c88b15c6e7d5d14eb1c3ede4637f93bd5f31f6 [file] [log] [blame]
Mate Toth-Pal51b61982022-03-17 14:19:30 +01001#!/usr/bin/env python3
2#-------------------------------------------------------------------------------
Mate Toth-Pal6e1d7742025-04-17 11:00:09 +02003# Copyright (c) 2019-2025, Arm Limited. All rights reserved.
Mate Toth-Pal51b61982022-03-17 14:19:30 +01004#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7#-------------------------------------------------------------------------------
8
Mate Toth-Palb9057ff2022-04-29 16:03:21 +02009"""CLI script for decompiling a cbor formatted IAT file"""
10
Mate Toth-Pal51b61982022-03-17 14:19:30 +010011import argparse
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020012import logging
Mate Toth-Pal51b61982022-03-17 14:19:30 +010013import sys
14
Thomas Fossatif4e1ca32024-08-16 16:01:31 +000015from pycose.algorithms import Es256, Es384
Mate Toth-Pal51b61982022-03-17 14:19:30 +010016import yaml
Mate Toth-Pal51b61982022-03-17 14:19:30 +010017from iatverifier.psa_iot_profile1_token_verifier import PSAIoTProfile1TokenVerifier
Tamas Ban1e7944a2022-07-04 13:09:03 +020018from iatverifier.psa_2_0_0_token_verifier import PSA_2_0_0_TokenVerifier
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020019from iatverifier.attest_token_verifier import AttestationTokenVerifier
Mate Toth-Pal5ebca512022-03-24 16:45:51 +010020from iatverifier.cca_token_verifier import CCATokenVerifier, CCAPlatformTokenVerifier
Mate Toth-Pal51b61982022-03-17 14:19:30 +010021
22
23if __name__ == '__main__':
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020024 logging.basicConfig(level=logging.INFO)
Mate Toth-Pal6978f7c2022-03-30 14:38:55 +020025
26 token_verifiers = {
27 "PSA-IoT-Profile1-token": PSAIoTProfile1TokenVerifier,
Mate Toth-Pal5ebca512022-03-24 16:45:51 +010028 "CCA-token": CCATokenVerifier,
29 "CCA-plat-token": CCAPlatformTokenVerifier,
Tamas Ban1e7944a2022-07-04 13:09:03 +020030 "PSA-2.0.0-token": PSA_2_0_0_TokenVerifier,
Mate Toth-Pal6978f7c2022-03-30 14:38:55 +020031 }
32
Mate Toth-Pal51b61982022-03-17 14:19:30 +010033 parser = argparse.ArgumentParser()
34 parser.add_argument('source', help='A compiled COSE IAT token.')
35 parser.add_argument('-o', '--outfile',
36 help='''Output file for the depompiled claims. If this is not
37 specified, the claims will be written to standard output.''')
Mate Toth-Pal6978f7c2022-03-30 14:38:55 +020038 parser.add_argument('-t', '--token-type',
39 help='''The type of the Token.''',
40 choices=token_verifiers.keys(),
41 required=True)
Mate Toth-Pal6e1d7742025-04-17 11:00:09 +020042 parser.add_argument('--expect-token-indicator',
43 help='''Expect token indicator in the cbor.''',
44 action='store_true')
Mate Toth-Pal51b61982022-03-17 14:19:30 +010045 args = parser.parse_args()
46
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020047 verifier_class = token_verifiers[args.token_type]
48 if verifier_class == PSAIoTProfile1TokenVerifier:
49 verifier = PSAIoTProfile1TokenVerifier(
50 method=AttestationTokenVerifier.SIGN_METHOD_SIGN1,
Thomas Fossatif4e1ca32024-08-16 16:01:31 +000051 cose_alg=Es256,
Mate Toth-Pal5ebca512022-03-24 16:45:51 +010052 signing_key=None,
53 configuration=None)
54 elif verifier_class == CCATokenVerifier:
55 realm_token_method = AttestationTokenVerifier.SIGN_METHOD_SIGN1
56 platform_token_method = AttestationTokenVerifier.SIGN_METHOD_SIGN1
Thomas Fossatif4e1ca32024-08-16 16:01:31 +000057 realm_token_cose_alg = Es384
58 platform_token_cose_alg = Es384
Mate Toth-Pal5ebca512022-03-24 16:45:51 +010059 verifier = CCATokenVerifier(
60 realm_token_method=realm_token_method,
61 realm_token_cose_alg=realm_token_cose_alg,
Mate Toth-Pal5ebca512022-03-24 16:45:51 +010062 platform_token_method=platform_token_method,
63 platform_token_cose_alg=platform_token_cose_alg,
64 platform_token_key=None,
65 configuration=None)
66 elif verifier_class == CCAPlatformTokenVerifier:
Thomas Fossatif4e1ca32024-08-16 16:01:31 +000067 cose_alg = Es384
Mate Toth-Pal5ebca512022-03-24 16:45:51 +010068 verifier = CCAPlatformTokenVerifier(
69 method=AttestationTokenVerifier.SIGN_METHOD_SIGN1,
70 cose_alg=cose_alg,
71 signing_key=None,
72 configuration=None,
Mate Toth-Pal6e1d7742025-04-17 11:00:09 +020073 necessity=None,
74 has_type_indicator=args.expect_token_indicator)
Tamas Ban1e7944a2022-07-04 13:09:03 +020075 elif verifier_class == PSA_2_0_0_TokenVerifier:
76 verifier = PSA_2_0_0_TokenVerifier(
77 method=AttestationTokenVerifier.SIGN_METHOD_SIGN1,
Thomas Fossatif4e1ca32024-08-16 16:01:31 +000078 cose_alg=Es256,
Tamas Ban1e7944a2022-07-04 13:09:03 +020079 signing_key=None,
80 configuration=None)
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020081 else:
82 logging.error(f'Invalid token type:{verifier_class}\n\t')
83 sys.exit(1)
Mate Toth-Pal51b61982022-03-17 14:19:30 +010084 with open(args.source, 'rb') as fh:
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020085 token_map = verifier.parse_token(
86 token=fh.read(),
Mate Toth-Palc7404e92022-07-15 11:11:13 +020087 lower_case_key=True).get_token_map()
Mate Toth-Pal51b61982022-03-17 14:19:30 +010088
89 if args.outfile:
Mate Toth-Palb9057ff2022-04-29 16:03:21 +020090 with open(args.outfile, 'w', encoding="UTF-8") as wfh:
Mate Toth-Pal51b61982022-03-17 14:19:30 +010091 yaml.dump(token_map, wfh)
92 else:
93 yaml.dump(token_map, sys.stdout)