From 06abc12baef8c1401a4ab6e12a76b38eb3b84429 Mon Sep 17 00:00:00 2001 From: yosiokat Date: Wed, 7 May 2008 09:19:46 +0000 Subject: [PATCH] =?UTF-8?q?ACSign=5FEncrypto=E3=81=A7=E3=80=81=E7=BD=B2?= =?UTF-8?q?=E5=90=8D=E5=86=85=E3=81=AE=E3=83=8F=E3=83=83=E3=82=B7=E3=83=A5?= =?UTF-8?q?=E3=82=92BER=E3=82=A8=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=81=8B=E3=81=A9=E3=81=86=E3=81=8B=E3=82=92?= =?UTF-8?q?=E9=81=B8=E6=8A=9E=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1287 b08762b0-b915-fc4b-9d8c-17b2551a87ff --- .../acsign/ARM9/src/acsign_encrypt.c | 28 +++++++++++++++---- include/sysmenu/acsign/ARM9/acsign.h | 3 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/build/libraries_sysmenu/acsign/ARM9/src/acsign_encrypt.c b/build/libraries_sysmenu/acsign/ARM9/src/acsign_encrypt.c index 5d524254..fdb4d898 100644 --- a/build/libraries_sysmenu/acsign/ARM9/src/acsign_encrypt.c +++ b/build/libraries_sysmenu/acsign/ARM9/src/acsign_encrypt.c @@ -84,18 +84,21 @@ static int add_padding(unsigned char *out, // // RSA // +#define SIGN_DATA_ENCODE_BER_LEN 0x0f #define ACS_ENCRYPTED_SIGN_LEN 128 -BOOL ACSign_Encrypto(void *sign, const void *key, const void *data, int length) +BOOL ACSign_Encrypto(void *sign, const void *key, const void *data, int length, BOOL isEncodeBER ) { BN_CTX *ctx; BIGNUM src, dst, exp, mod; u8 buf[ACS_ENCRYPTED_SIGN_LEN]; - int len = length; + u8 dataBER[ACS_ENCRYPTED_SIGN_LEN]; BOOL result = TRUE; KeyParam key_mod; KeyParam key_prvExp; + const void *pData; + int len; - if (NULL == sign || NULL == key || NULL == data || 0 > length) { + if (NULL == sign || NULL == key || NULL == data || 0 > length || ( ACS_ENCRYPTED_SIGN_LEN - SIGN_DATA_ENCODE_BER_LEN ) < length ) { return FALSE; } @@ -103,9 +106,24 @@ BOOL ACSign_Encrypto(void *sign, const void *key, const void *data, int length) OS_TPrintf( "RSA PrivKey Param get failed.\n" ); return FALSE; } - - if ( add_padding( buf, ACS_ENCRYPTED_SIGN_LEN, data, length ) ) { + if( isEncodeBER ) { + const u8 *pSignDataEncodeBER = (const u8 *)"\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"; + u8 *p = dataBER; + int i; + for( i = 0; i < SIGN_DATA_ENCODE_BER_LEN; i++ ) { + *p++ = pSignDataEncodeBER[ i ]; + } + for( i = 0; i < length; i++ ) { + *p++ = ((const u8 *)data)[ i ]; + } + pData = dataBER; + length += SIGN_DATA_ENCODE_BER_LEN; + }else { + pData = data; + } + + if ( add_padding( buf, ACS_ENCRYPTED_SIGN_LEN, pData, length ) ) { OS_TPrintf("encode_padding was failed.\n"); result = FALSE; goto end; diff --git a/include/sysmenu/acsign/ARM9/acsign.h b/include/sysmenu/acsign/ARM9/acsign.h index 17969eb2..f17dc7e7 100644 --- a/include/sysmenu/acsign/ARM9/acsign.h +++ b/include/sysmenu/acsign/ARM9/acsign.h @@ -40,7 +40,8 @@ BOOL ACSign_Encrypto( void *sign, // 署名出力バッファへのポインタ const void *key, // DERフォーマット秘密鍵へのポインタ const void *data, // 署名対象データへのポインタ - int length // 署名対象データ長 + int length, // 署名対象データ長 + BOOL isEncodeBER // 署名データをDERエンコードするか? ); //