| #!/usr/bin/env python3 |
| #------------------------------------------------------------------------------- |
| # Copyright (c) 2019-2022, Arm Limited. All rights reserved. |
| # |
| # SPDX-License-Identifier: BSD-3-Clause |
| # |
| #------------------------------------------------------------------------------- |
| |
| """CLI script for decompiling a cbor formatted IAT file""" |
| |
| import argparse |
| import logging |
| import sys |
| |
| from pycose.algorithms import Es256, Es384 |
| import yaml |
| from iatverifier.psa_iot_profile1_token_verifier import PSAIoTProfile1TokenVerifier |
| from iatverifier.psa_2_0_0_token_verifier import PSA_2_0_0_TokenVerifier |
| from iatverifier.attest_token_verifier import AttestationTokenVerifier |
| from iatverifier.cca_token_verifier import CCATokenVerifier, CCAPlatformTokenVerifier |
| |
| |
| if __name__ == '__main__': |
| logging.basicConfig(level=logging.INFO) |
| |
| token_verifiers = { |
| "PSA-IoT-Profile1-token": PSAIoTProfile1TokenVerifier, |
| "CCA-token": CCATokenVerifier, |
| "CCA-plat-token": CCAPlatformTokenVerifier, |
| "PSA-2.0.0-token": PSA_2_0_0_TokenVerifier, |
| } |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument('source', help='A compiled COSE IAT token.') |
| parser.add_argument('-o', '--outfile', |
| help='''Output file for the depompiled claims. If this is not |
| specified, the claims will be written to standard output.''') |
| parser.add_argument('-t', '--token-type', |
| help='''The type of the Token.''', |
| choices=token_verifiers.keys(), |
| required=True) |
| args = parser.parse_args() |
| |
| verifier_class = token_verifiers[args.token_type] |
| if verifier_class == PSAIoTProfile1TokenVerifier: |
| verifier = PSAIoTProfile1TokenVerifier( |
| method=AttestationTokenVerifier.SIGN_METHOD_SIGN1, |
| cose_alg=Es256, |
| signing_key=None, |
| configuration=None) |
| elif verifier_class == CCATokenVerifier: |
| realm_token_method = AttestationTokenVerifier.SIGN_METHOD_SIGN1 |
| platform_token_method = AttestationTokenVerifier.SIGN_METHOD_SIGN1 |
| realm_token_cose_alg = Es384 |
| platform_token_cose_alg = Es384 |
| verifier = CCATokenVerifier( |
| realm_token_method=realm_token_method, |
| realm_token_cose_alg=realm_token_cose_alg, |
| platform_token_method=platform_token_method, |
| platform_token_cose_alg=platform_token_cose_alg, |
| platform_token_key=None, |
| configuration=None) |
| elif verifier_class == CCAPlatformTokenVerifier: |
| cose_alg = Es384 |
| verifier = CCAPlatformTokenVerifier( |
| method=AttestationTokenVerifier.SIGN_METHOD_SIGN1, |
| cose_alg=cose_alg, |
| signing_key=None, |
| configuration=None, |
| necessity=None) |
| elif verifier_class == PSA_2_0_0_TokenVerifier: |
| verifier = PSA_2_0_0_TokenVerifier( |
| method=AttestationTokenVerifier.SIGN_METHOD_SIGN1, |
| cose_alg=Es256, |
| signing_key=None, |
| configuration=None) |
| else: |
| logging.error(f'Invalid token type:{verifier_class}\n\t') |
| sys.exit(1) |
| with open(args.source, 'rb') as fh: |
| token_map = verifier.parse_token( |
| token=fh.read(), |
| lower_case_key=True).get_token_map() |
| |
| if args.outfile: |
| with open(args.outfile, 'w', encoding="UTF-8") as wfh: |
| yaml.dump(token_map, wfh) |
| else: |
| yaml.dump(token_map, sys.stdout) |