Signed-off-by: Denys Dmytriyenko <[email protected]>
---
.../u-boot/u-boot-k3-r5/gen_x509_cert.sh | 311 +++++++++++++++++++++
.../recipes-bsp/u-boot/u-boot-k3-r5_2018.01.bb | 27 +-
2 files changed, 337 insertions(+), 1 deletion(-)
create mode 100755
meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5/gen_x509_cert.sh
diff --git a/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5/gen_x509_cert.sh
b/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5/gen_x509_cert.sh
new file mode 100755
index 0000000..82d6042
--- /dev/null
+++ b/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5/gen_x509_cert.sh
@@ -0,0 +1,311 @@
+#!/bin/bash
+#
+# Script to add x509 certificate to binary/ELF
+
+# Variables
+VALID_SHAS="sha256 sha384 sha512 sha224"
+OUTPUT=x509-firmware.bin
+TEMP_X509=x509-temp.cert
+CERT=certificate.bin
+RAND_KEY=eckey.pem
+VALID_ROM_CORES="r5 m3"
+VALID_DMSC_CORES="r5-00 r5-01 a53-00 a53-01 a53-10 a53-11"
+SHA=sha512
+CORE=m3
+LOADADDR=0x00040000
+VALID_MASTERS="rom dmsc"
+
+declare -A sha_oids
+sha_oids["sha256"]=2.16.840.1.101.3.4.2.1
+sha_oids["sha384"]=2.16.840.1.101.3.4.2.2
+sha_oids["sha512"]=2.16.840.1.101.3.4.2.3
+sha_oids["sha224"]=2.16.840.1.101.3.4.2.4
+
+declare -A core_ids
+core_ids["a53-00"]=0x20
+core_ids["a53-01"]=0x21
+core_ids["a53-10"]=0x22
+core_ids["a53-11"]=0x23
+core_ids["r5-00"]=0x01
+core_ids["r5-01"]=0x02
+
+gen_key() {
+ openssl ecparam -out $RAND_KEY -name prime256v1 -genkey
+ KEY=$RAND_KEY
+}
+
+declare -A options_help
+usage() {
+ if [ -n "$*" ]; then
+ echo "ERROR: $*"
+ fi
+ echo -n "Usage: $0 "
+ for option in "${!options_help[@]}"
+ do
+ arg=`echo ${options_help[$option]}|cut -d ':' -f1`
+ if [ -n "$arg" ]; then
+ arg=" $arg"
+ fi
+ echo -n "[-$option$arg] "
+ done
+ echo
+ echo -e "\nWhere:"
+ for option in "${!options_help[@]}"
+ do
+ arg=`echo ${options_help[$option]}|cut -d ':' -f1`
+ txt=`echo ${options_help[$option]}|cut -d ':' -f2`
+ tb="\t\t\t"
+ if [ -n "$arg" ]; then
+ arg=" $arg"
+ tb="\t"
+ fi
+ echo -e " -$option$arg:$tb$txt"
+ done
+ echo
+ echo "Examples of usage:-"
+ echo "# Generate x509 certificate with random key from elf"
+ echo " CROSS_COMPILE=arm-linux-gnueabihf- $0 -b
ti-sci-firmware-am6x.elf -o dmsc.bin -l 0x40000"
+ echo "# Generate x509 certificate with random key from bin"
+ echo " $0 -b ti-sci-firmware-am6x.bin -o dmsc.bin -l 0x40000"
+ echo "# Example of signing the DMSC binary"
+ echo " $0 -m rom -c m3 -b ti-sci-firmware-am6x.bin -o dmsc.bin -l
0x40000"
+ echo "# Example of signing the SPL binary"
+ echo " $0 -m rom -c r5 -b spl/u-boot-spl.bin -o tiboot3.bin -l
0x41c00000"
+ echo "# Example of signing the ATF binary to run on A53"
+ echo " $0 -m dmsc -c a53-00 -b bl31.bin -o atf.bin -l 0x70000000"
+}
+
+options_help[e]="elf_file:ELF file that needs to be signed"
+options_help[b]="bin_file:Bin file that needs to be signed"
+options_help[k]="key_file:file with key inside it. If not provided script
generates a random key."
+options_help[o]="output_file:Name of the final output file. default
x509-firmware.bin"
+options_help[c]="core:target core on which the image would be running. Default
is m3. Valid option for rom are $VALID_ROM_CORES. Valid options for DMSC are
$VALID_DMSC_CORES"
+options_help[d]=":Countersign DMSC firmware image. This signs a previously
signed image for a second time."
+options_help[s]="sha_type:sha type to be used for certificate generation.
Default is sha512. Valid option are $VALID_SHAS"
+options_help[l]="loadaddr: Target load address of the binary in hex. Default
to $LOADADDR"
+options_help[m]="master: Master name for which the image is created. This
master software parses the certificate and load the images accordingly. Default
to rom. valid options are $VALID_MASTERS"
+
+while getopts "e:b:k:o:c:ds:l:m:h" opt
+do
+ case $opt in
+ e)
+ ELF=$OPTARG
+ ;;
+ b)
+ BIN=$OPTARG
+ ;;
+ k)
+ KEY=$OPTARG
+ ;;
+ o)
+ OUTPUT=$OPTARG
+ ;;
+ l)
+ LOADADDR=$OPTARG
+ ;;
+ s)
+ SHA=$OPTARG
+ sha_valid=0
+ for tsha in $VALID_SHAS
+ do
+ if [ "$tsha" == "$SHA" ]; then
+ sha_valid=1
+ fi
+ done
+ if [ $sha_valid == 0 ]; then
+ usage "Invalid sha input $SHA"
+ exit 1
+ fi
+ ;;
+ c)
+ CORE=$OPTARG
+ ;;
+ d)
+ CERTTYPE=3 # CERT_TYPE_FIRMWARE_COUNTERSIGN
+ ;;
+ m)
+ MASTER=$OPTARG
+ master_valid=0
+ for vmaster in $VALID_MASTERS
+ do
+ if [ "$vmaster" == "$MASTER" ]; then
+ master_valid=1
+ fi
+ done
+ if [ $master_valid == 0 ]; then
+ usage "Invalid master input $MASTER"
+ exit 1
+ fi
+ ;;
+ h)
+ usage
+ exit 0
+ ;;
+ \?)
+ usage "Invalid Option '-$OPTARG'"
+ exit 1
+ ;;
+ :)
+ usage "Option '-$OPTARG' Needs an argument."
+ exit 1
+ ;;
+ esac
+done
+
+if [ "$#" -eq 0 ]
+then
+ usage "Arguments missing"
+ exit 1
+fi
+
+if [ -z "$BIN" -a -z "$ELF" ]; then
+ usage "Either Input bin file or ELF file to sign"
+ exit 1
+fi
+
+if [ "$MASTER" == "dmsc" ]; then
+ VALID_CORES=$VALID_DMSC_CORES
+else
+ # Defaut to ROM image
+ VALID_CORES=$VALID_ROM_CORES
+ MASTER="rom"
+fi
+
+# Verify for valid core inputs
+core_valid=0
+for tcore in $VALID_CORES
+do
+ if [ "$tcore" == "$CORE" ]; then
+ core_valid=1
+ fi
+done
+if [ $core_valid == 0 ]; then
+ usage "Invalid target core $CORE"
+ exit 1
+fi
+
+# Generate random key if user doesn't provide a key
+if [ -z "$KEY" ]; then
+ gen_key
+fi
+
+if [ "$MASTER" == "dmsc" ]; then
+ BOOTCORE=${core_ids["$CORE"]}
+ BOOTCORE_OPTS_VER=$(printf "%01x" 1)
+ # Add input args option for SET and CLR flags.
+ BOOTCORE_OPTS_SETFLAG=$(printf "%08x" 0)
+ BOOTCORE_OPTS_CLRFLAG=$(printf "%08x" 0x100) # Clear FLAG_ARMV8_AARCH32
+
BOOTCORE_OPTS="0x$BOOTCORE_OPTS_VER$BOOTCORE_OPTS_SETFLAG$BOOTCORE_OPTS_CLRFLAG"
+ # Set the cert type to zero.
+ # We are not using public/private key store now
+ CERTTYPE=$(printf "0x%08x" 0)
+else
+ if [ "$CORE" == "m3" ]; then
+ if [ -z "$CERTTYPE" ]; then
+ CERTTYPE=2 # CERT_TYPE_FIRMWARE_IMAGE_BIN
+ fi
+ BOOTCORE=0 # DMSC Controller (M3)
+ BOOTCORE_OPTS=32
+ else
+ CERTTYPE=1 # CERT_TYPE_PRIMARY_IMAGE_BIN
+ BOOTCORE=16 # MCU (R5)
+ BOOTCORE_OPTS=32
+ fi
+fi
+
+if [ -z "$BIN" ]; then
+ echo "Generating bin from elf $ELF"
+ BIN=firmware.bin
+ ${CROSS_COMPILE}objcopy -g -S --gap-fill 0x0 -O binary $ELF $BIN
+ if [ "$?" != "0" ]; then
+ echo "ERROR: Generating bin from $ELF failed. CROSS_COMPILE?"
+ exit 1
+ fi
+fi
+
+SHA_OID=${sha_oids["$SHA"]}
+SHA_VAL=`openssl dgst -$SHA -hex $BIN | sed -e "s/^.*= //g"`
+BIN_SIZE=`cat $BIN | wc -c`
+ADDR=`printf "%08x" $LOADADDR`
+
+# Generate x509 Template
+gen_template() {
+cat << 'EOF' > x509-template.txt
+ [ req ]
+ distinguished_name = req_distinguished_name
+ x509_extensions = v3_ca
+ prompt = no
+ dirstring_type = nobmp
+
+ [ req_distinguished_name ]
+ C = US
+ ST = SC
+ L = New York
+ O = Texas Instruments., Inc.
+ OU = DSP
+ CN = Albert
+ emailAddress = [email protected]
+
+ [ v3_ca ]
+ basicConstraints = CA:true
+ 1.3.6.1.4.1.294.1.1 = ASN1:SEQUENCE:boot_seq
+ 1.3.6.1.4.1.294.1.2 = ASN1:SEQUENCE:image_integrity
+ 1.3.6.1.4.1.294.1.3 = ASN1:SEQUENCE:swrv
+# 1.3.6.1.4.1.294.1.4 = ASN1:SEQUENCE:encryption
+ 1.3.6.1.4.1.294.1.8 = ASN1:SEQUENCE:debug
+
+ [ boot_seq ]
+ certType = INTEGER:TEST_CERT_TYPE
+ bootCore = INTEGER:TEST_BOOT_CORE
+ bootCoreOpts = INTEGER:TEST_BOOT_CORE_OPTS
+ destAddr = FORMAT:HEX,OCT:TEST_BOOT_ADDR
+ imageSize = INTEGER:TEST_IMAGE_LENGTH
+
+ [ image_integrity ]
+ shaType = OID:TEST_IMAGE_SHA_OID
+ shaValue = FORMAT:HEX,OCT:TEST_IMAGE_SHA_VAL
+
+ [ swrv ]
+ swrv = INTEGER:0
+
+# [ encryption ]
+# initalVector = FORMAT:HEX,OCT:TEST_IMAGE_ENC_IV
+# randomString = FORMAT:HEX,OCT:TEST_IMAGE_ENC_RS
+# iterationCnt = INTEGER:TEST_IMAGE_KEY_DERIVE_INDEX
+# salt = FORMAT:HEX,OCT:TEST_IMAGE_KEY_DERIVE_SALT
+
+ [ debug ]
+ debugUID =
FORMAT:HEX,OCT:0000000000000000000000000000000000000000000000000000000000000000
+ debugType = INTEGER:4
+ coreDbgEn = INTEGER:0
+ coreDbgSecEn = INTEGER:0
+EOF
+}
+
+gen_cert() {
+ echo "Certificate being generated :"
+ echo " LOADADDR = 0x$ADDR"
+ echo " IMAGE_SIZE = $BIN_SIZE"
+ echo " CERT_TYPE = $CERTTYPE"
+ sed -e "s/TEST_IMAGE_LENGTH/$BIN_SIZE/" \
+ -e "s/TEST_IMAGE_SHA_OID/$SHA_OID/" \
+ -e "s/TEST_IMAGE_SHA_VAL/$SHA_VAL/" \
+ -e "s/TEST_CERT_TYPE/$CERTTYPE/" \
+ -e "s/TEST_BOOT_CORE_OPTS/$BOOTCORE_OPTS/" \
+ -e "s/TEST_BOOT_CORE/$BOOTCORE/" \
+ -e "s/TEST_BOOT_ADDR/$ADDR/" x509-template.txt > $TEMP_X509
+ openssl req -new -x509 -key $KEY -nodes -outform DER -out $CERT -config
$TEMP_X509 -$SHA
+}
+
+gen_template
+gen_cert
+cat $CERT $BIN > $OUTPUT
+
+echo "SUCCESS: Image $OUTPUT generated."
+
+# Remove all intermediate files
+rm $TEMP_X509 $CERT x509-template.txt
+if [ "$KEY" == "$RAND_KEY" ]; then
+ rm $RAND_KEY
+fi
+
diff --git a/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5_2018.01.bb
b/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5_2018.01.bb
index e841128..7900a24 100644
--- a/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5_2018.01.bb
+++ b/meta-arago-distro/recipes-bsp/u-boot/u-boot-k3-r5_2018.01.bb
@@ -1,9 +1,22 @@
require recipes-bsp/u-boot/u-boot-ti-staging_${PV}.bb
PROVIDES = ""
+PKG_${PN} = "${PN}"
+PKG_${PN}-dev = "${PN}-dev"
+PKG_${PN}-dbg = "${PN}-dbg"
COMPATIBLE_MACHINE = "k3"
+SYSFW_VER = "2018.06"
+SYSFW_BIN_am65xx-evm = "ti-sci-firmware-am6x-gp.bin"
+
+SRC_URI += " \
+ file://gen_x509_cert.sh \
+ http://lcpd.gt.design.ti.com/sysfw/${SYSFW_VER}/${SYSFW_BIN};name=sysfw"
+
+SRC_URI[sysfw.md5sum] = "f93adb3a1a289a01b780ecf300a5866c"
+SRC_URI[sysfw.sha256sum] =
"ace29e33f89ce01ae28bc830607dabe29ae928a706a235e335151f24bca6cb42"
+
CROSS_COMPILE_V7 = "${ELT_TARGET_SYS_ARMV7}-"
PATH_prepend = "${TOOLCHAIN_PATH_ARMV7}/bin:"
@@ -11,9 +24,21 @@ UBOOT_MACHINE_am65xx-evm = "am65x_evm_r5_defconfig"
EXTRA_OEMAKE = 'ARCH=arm CROSS_COMPILE=${CROSS_COMPILE_V7}
CC="${CROSS_COMPILE_V7}gcc ${TOOLCHAIN_OPTIONS}" V=1'
EXTRA_OEMAKE += 'HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"'
-EXTRA_OEMAKE += 'SYSFW=${SYSFW_FILE}'
+EXTRA_OEMAKE += 'SYSFW=${WORKDIR}/sysfw.bin'
UBOOT_BINARY = "tiboot3.bin"
UBOOT_IMAGE = "tiboot3-${MACHINE}-${PV}-${PR}.bin"
UBOOT_SYMLINK = "tiboot3-${MACHINE}.bin"
SPL_BINARY_k3 = ""
+
+do_configure_append() {
+ ${WORKDIR}/gen_x509_cert.sh -m rom -c m3 -b ${WORKDIR}/${SYSFW_BIN} -o
${WORKDIR}/sysfw.bin -l 0x40000
+}
+
+do_install_append() {
+ install -m 644 ${WORKDIR}/sysfw.bin ${D}/boot/
+}
+
+do_deploy_append() {
+ install -m 644 ${WORKDIR}/sysfw.bin ${DEPLOYDIR}/
+}
--
2.7.4
_______________________________________________
meta-arago mailing list
[email protected]
http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago