mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-26 19:25:02 +00:00
The current stable version of OpenSSL(0.9.8d) does not support RSA signature with SHA-256 and SHA-512 message digests. This utility outputs the hash of file data in a format suitable for use with the "openssl" command-line tool fir generating RSA signatures. Also modified the tests to use this to generate RSA signature rather than "openssl pkeyutl" which is not supported on current stable version of OpenSSL. Review URL: http://codereview.chromium.org/552227
225 lines
4.9 KiB
Bash
Executable File
225 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
# Script to generate padding.c containing PKCS 1.5 padding byte arrays for
|
|
# various combinations of RSA key lengths and message digest algorithms.
|
|
|
|
Pad_Preamble="0x00,0x01"
|
|
|
|
SHA1_digestinfo="0x30,0x21,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x05"\
|
|
",0x00,0x04,0x14"
|
|
SHA256_digestinfo="0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03"\
|
|
",0x04,0x02,0x01,0x05,0x00,0x04,0x20"
|
|
SHA512_digestinfo="0x30,0x51,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03"\
|
|
",0x04,0x02,0x03,0x05,0x00,0x04,0x40"
|
|
|
|
RSA1024_Len=128
|
|
RSA2048_Len=256
|
|
RSA4096_Len=512
|
|
RSA8192_Len=1024
|
|
|
|
SHA1_T_Len=35
|
|
SHA256_T_Len=51
|
|
SHA512_T_Len=83
|
|
|
|
HashAlgos=( SHA1 SHA256 SHA512 )
|
|
RSAAlgos=( RSA1024 RSA2048 RSA4096 RSA8192 )
|
|
|
|
function genFFOctets {
|
|
count=$1
|
|
while [ $count -gt 0 ]; do
|
|
echo -n "0xff,"
|
|
let count=count-1
|
|
done
|
|
}
|
|
|
|
|
|
cat <<EOF
|
|
/*
|
|
* DO NOT MODIFY THIS FILE DIRECTLY.
|
|
*
|
|
* This file is automatically generated by genpadding.sh and contains padding
|
|
* arrays corresponding to various combinations of algorithms for RSA signatures.
|
|
*/
|
|
|
|
EOF
|
|
|
|
|
|
echo '#include "rsa.h"'
|
|
echo '#include "sha.h"'
|
|
echo
|
|
echo
|
|
cat <<EOF
|
|
/*
|
|
* PKCS 1.5 padding (from the RSA PKCS#1 v2.1 standard)
|
|
*
|
|
* Depending on the RSA key size and hash function, the padding is calculated
|
|
* as follows:
|
|
*
|
|
* 0x00 || 0x01 || PS || 0x00 || T
|
|
*
|
|
* T: DER Encoded DigestInfo value which depends on the hash function used.
|
|
*
|
|
* SHA-1: (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H.
|
|
* SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 || H.
|
|
* SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40 || H.
|
|
*
|
|
* Length(T) = 35 octets for SHA-1
|
|
* Length(T) = 51 octets for SHA-256
|
|
* Length(T) = 83 octets for SHA-512
|
|
*
|
|
* PS: octet string consisting of {Length(RSA Key) - Length(T) - 3} 0xFF
|
|
*
|
|
*/
|
|
EOF
|
|
echo
|
|
echo
|
|
|
|
|
|
# Generate padding arrays.
|
|
algorithmcounter=0
|
|
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo "/* Algorithm Type $algorithmcounter */"
|
|
let algorithmcounter=algorithmcounter+1
|
|
eval rsalen=${rsaalgo}_Len
|
|
eval hashlen=${hashalgo}_T_Len
|
|
let nums=rsalen-hashlen-3
|
|
echo "const uint8_t padding${rsaalgo}_${hashalgo}[${rsaalgo}NUMBYTES - ${hashalgo}_DIGEST_SIZE] = {"
|
|
echo -n $Pad_Preamble,
|
|
genFFOctets $nums
|
|
echo -n "0x00,"
|
|
eval digestinfo=\$${hashalgo}_digestinfo
|
|
echo $digestinfo
|
|
echo "};"
|
|
echo
|
|
done
|
|
done
|
|
|
|
echo "const int kNumAlgorithms = $algorithmcounter;";
|
|
echo "#define NUMALGORITHMS $algorithmcounter"
|
|
echo
|
|
|
|
# Output DigestInfo field lengths.
|
|
cat <<EOF
|
|
#define SHA1_DIGESTINFO_LEN 15
|
|
#define SHA256_DIGESTINFO_LEN 19
|
|
#define SHA512_DIGESTINFO_LEN 19
|
|
EOF
|
|
|
|
|
|
# Generate DigestInfo arrays.
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo "const uint8_t ${hashalgo}_digestinfo[] = {"
|
|
eval digestinfo=\$${hashalgo}_digestinfo
|
|
echo $digestinfo
|
|
echo "};"
|
|
echo
|
|
done
|
|
|
|
# Generate DigestInfo to size map.
|
|
echo "const int digestinfo_size_map[] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo ${hashalgo}_DIGESTINFO_LEN,
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
# Generate algorithm signature length map.
|
|
echo "const int siglen_map[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo ${rsaalgo}NUMWORDS,
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
# Generate algorithm padding array map.
|
|
echo "const uint8_t* padding_map[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo padding${rsaalgo}_${hashalgo},
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
# Generate algorithm padding size map.
|
|
echo "const int padding_size_map[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo ${rsaalgo}NUMBYTES - ${hashalgo}_DIGEST_SIZE,
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
# Generate algorithm to message digest's output size map.
|
|
echo "const int hash_size_map[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo ${hashalgo}_DIGEST_SIZE,
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
# Generate algorithm to message digest's input block size map.
|
|
echo "const int hash_blocksize_map[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo ${hashalgo}_BLOCK_SIZE,
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
# Generate algorithm to message's digest ASN.1 DigestInfo map.
|
|
echo "const uint8_t* hash_digestinfo_map[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo ${hashalgo}_digestinfo,
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
|
|
# Generate algorithm description strings.
|
|
echo "const char* algo_strings[NUMALGORITHMS] = {"
|
|
for rsaalgo in ${RSAAlgos[@]}
|
|
do
|
|
for hashalgo in ${HashAlgos[@]}
|
|
do
|
|
echo \"${rsaalgo} ${hashalgo}\",
|
|
done
|
|
done
|
|
echo "};"
|
|
echo
|
|
|
|
#echo "#endif /* VBOOT_REFERENCE_PADDING_H_ */"
|