blob: 166cab4a41bf15af7f89d04fe9da29203a0f29c9 [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
Zack Williams84cb77a2022-01-14 14:46:39 -080032 cpi_password = bytes(
33 getpass.getpass(prompt="Password for CPI Key %s: " % args.key), "ascii"
34 )
Zack Williams7af92fe2021-08-15 15:37:50 -070035
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080036 with open(args.key, "rb") as key_file:
37 (pkey, cert, addl_cert) = pkcs12.load_key_and_certificates(
38 key_file.read(), cpi_password
39 )
Zack Williams7af92fe2021-08-15 15:37:50 -070040
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080041 pkey_raw = pkey.private_bytes(
42 encoding=serialization.Encoding.PEM,
43 format=serialization.PrivateFormat.TraditionalOpenSSL,
44 encryption_algorithm=serialization.NoEncryption(),
Zack Williams7af92fe2021-08-15 15:37:50 -070045 )
46
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080047 if not os.path.exists("output"):
48 os.makedirs("output")
Zack Williams7af92fe2021-08-15 15:37:50 -070049
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080050 for signFile in args.signFiles:
51 with open(signFile, "r") as inFile:
52 inFileJson = json.loads(inFile.read())
53 # The output is 3 parameters concat with dot to a string
54 # 3 params are: protectedHeader, encodedCpiSignedData, digitalSignature
55 SIGNED = jws.sign(inFileJson, pkey_raw, algorithm="RS256")
Zack Williams7af92fe2021-08-15 15:37:50 -070056
Wei-Yu Chen27f14ef2021-09-23 12:23:13 +080057 print(f"* {inFileJson['cbsdSerialNumber']} data was signed")
58 with open(f"output/{signFile}.signed", "w") as out_file:
59 out_file.write(SIGNED)