# SPDX-License-Identifier: GPL-2.0+ # Copyright 2022 Google LLC # """Bintool implementation for openssl openssl provides a number of features useful for signing images Documentation is at https://www.coreboot.org/CBFS Source code is at https://www.openssl.org/ """ import hashlib from binman import bintool from u_boot_pylib import tools class Bintoolopenssl(bintool.Bintool): """openssl tool This bintool supports creating new openssl certificates. It also supports fetching a binary openssl Documentation about openssl is at https://www.openssl.org/ """ def __init__(self, name): super().__init__( name, 'openssl cryptography toolkit', version_regex=r'OpenSSL (.*) \(', version_args='version') def x509_cert(self, cert_fname, input_fname, key_fname, cn, revision, config_fname): """Create a certificate Args: cert_fname (str): Filename of certificate to create input_fname (str): Filename containing data to sign key_fname (str): Filename of .pem file cn (str): Common name revision (int): Revision number config_fname (str): Filename to write fconfig into Returns: str: Tool output """ indata = tools.read_file(input_fname) hashval = hashlib.sha512(indata).hexdigest() with open(config_fname, 'w', encoding='utf-8') as outf: print(f'''[ req ] distinguished_name = req_distinguished_name x509_extensions = v3_ca prompt = no dirstring_type = nobmp [ req_distinguished_name ] CN = {cert_fname} [ v3_ca ] basicConstraints = CA:true 1.3.6.1.4.1.294.1.3 = ASN1:SEQUENCE:swrv 1.3.6.1.4.1.294.1.34 = ASN1:SEQUENCE:sysfw_image_integrity [ swrv ] swrv = INTEGER:{revision} [ sysfw_image_integrity ] shaType = OID:2.16.840.1.101.3.4.2.3 shaValue = FORMAT:HEX,OCT:{hashval} imageSize = INTEGER:{len(indata)} ''', file=outf) args = ['req', '-new', '-x509', '-key', key_fname, '-nodes', '-outform', 'DER', '-out', cert_fname, '-config', config_fname, '-sha512'] return self.run_cmd(*args) def fetch(self, method): """Fetch handler for openssl This installs the openssl package using the apt utility. Args: method (FETCH_...): Method to use Returns: True if the file was fetched and now installed, None if a method other than FETCH_BIN was requested Raises: Valuerror: Fetching could not be completed """ if method != bintool.FETCH_BIN: return None return self.apt_install('openssl')