blob: c7b0ee607abb42fd6cb40fe369423f995cc2c05e [file] [log] [blame]
Zack Williams7af92fe2021-08-15 15:37:50 -07001#!/usr/bin/env python3
2"""
3cpisign.py
4
5Utility for signing CPI data
6"""
7
8# SPDX-FileCopyrightText: © 2021 Open Networking Foundation <support@opennetworking.org>
9# SPDX-License-Identifier: Apache-2.0
10
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080011import os
12import json
Zack Williams7af92fe2021-08-15 15:37:50 -070013import getpass
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080014import argparse
Zack Williams7af92fe2021-08-15 15:37:50 -070015from jose import jws
16
17from cryptography.hazmat.primitives.serialization import pkcs12
18from cryptography.hazmat.primitives import serialization
19
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080020parser = argparse.ArgumentParser(description="CBSD CPI signature data generator")
21parser.add_argument("-k", "--key", help="The file name of CPI key")
22parser.add_argument(
23 "signFiles",
24 type=str,
25 nargs="+",
26 help="The file name of sigature data, can accept multiple files in a time.",
27)
28args = parser.parse_args()
Zack Williams7af92fe2021-08-15 15:37:50 -070029
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080030if __name__ == "__main__":
31 # get password
32 cpi_password = bytes(getpass.getpass(), "ascii")
Zack Williams7af92fe2021-08-15 15:37:50 -070033
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080034 with open(args.key, "rb") as key_file:
35 (pkey, cert, addl_cert) = pkcs12.load_key_and_certificates(
36 key_file.read(), cpi_password
37 )
Zack Williams7af92fe2021-08-15 15:37:50 -070038
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080039 pkey_raw = pkey.private_bytes(
40 encoding=serialization.Encoding.PEM,
41 format=serialization.PrivateFormat.TraditionalOpenSSL,
42 encryption_algorithm=serialization.NoEncryption(),
Zack Williams7af92fe2021-08-15 15:37:50 -070043 )
44
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080045 if not os.path.exists("output"):
46 os.makedirs("output")
Zack Williams7af92fe2021-08-15 15:37:50 -070047
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080048 for signFile in args.signFiles:
49 with open(signFile, "r") as inFile:
50 inFileJson = json.loads(inFile.read())
51 # The output is 3 parameters concat with dot to a string
52 # 3 params are: protectedHeader, encodedCpiSignedData, digitalSignature
53 SIGNED = jws.sign(inFileJson, pkey_raw, algorithm="RS256")
Zack Williams7af92fe2021-08-15 15:37:50 -070054
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080055 print(f"* {inFileJson['cbsdSerialNumber']} data was signed")
56 with open(f"output/{signFile}.signed", "w") as out_file:
57 out_file.write(SIGNED)