Files
OpenCellular/crypto/genpadding.sh
Gaurav Shah 8bf29d8ea1 Utility to output digests in format suitable for RSA signatures.
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
2010-01-28 19:43:24 -08:00

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_ */"