4 * \brief OpenSSL wrapper (definitions, inline functions).
6 * Copyright (C) 2006-2010, Brainspark B.V.
8 * This file is part of PolarSSL (http://www.polarssl.org)
9 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
11 * All rights reserved.
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License along
24 * with this program; if not, write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 * OpenSSL wrapper contributed by David Barett
30 #ifndef POLARSSL_OPENSSL_H
31 #define POLARSSL_OPENSSL_H
39 #define AES_BLOCK_SIZE 16
40 #define AES_KEY aes_context
41 #define MD5_CTX md5_context
42 #define SHA_CTX sha1_context
44 #define SHA1_Init( CTX ) \
46 #define SHA1_Update( CTX, BUF, LEN ) \
47 sha1_update( (CTX), (unsigned char *)(BUF), (LEN) )
48 #define SHA1_Final( OUT, CTX ) \
49 sha1_finish( (CTX), (OUT) )
51 #define MD5_Init( CTX ) \
53 #define MD5_Update( CTX, BUF, LEN ) \
54 md5_update( (CTX), (unsigned char *)(BUF), (LEN) )
55 #define MD5_Final( OUT, CTX ) \
56 md5_finish( (CTX), (OUT) )
58 #define AES_set_encrypt_key( KEY, KEYSIZE, CTX ) \
59 aes_setkey_enc( (CTX), (KEY), (KEYSIZE) )
60 #define AES_set_decrypt_key( KEY, KEYSIZE, CTX ) \
61 aes_setkey_dec( (CTX), (KEY), (KEYSIZE) )
62 #define AES_cbc_encrypt( INPUT, OUTPUT, LEN, CTX, IV, MODE ) \
63 aes_crypt_cbc( (CTX), (MODE), (LEN), (IV), (INPUT), (OUTPUT) )
70 * RSA stuff follows. TODO: needs cleanup
72 inline int __RSA_Passthrough( void *output
, void *input
, int size
)
74 memcpy( output
, input
, size
);
78 inline rsa_context
* d2i_RSA_PUBKEY( void *ignore
, unsigned char **bufptr
,
81 unsigned char *buffer
= *(unsigned char **) bufptr
;
85 * Not a general-purpose parser: only parses public key from *exactly*
86 * openssl genrsa -out privkey.pem 512 (or 1024)
87 * openssl rsa -in privkey.pem -out privatekey.der -outform der
88 * openssl rsa -in privkey.pem -out pubkey.der -outform der -pubout
90 * TODO: make a general-purpose parse
92 if( ignore
!= 0 || ( len
!= 94 && len
!= 162 ) )
95 rsa
= (rsa_context
*) malloc( sizeof( rsa_rsa
) );
99 memset( rsa
, 0, sizeof( rsa_context
) );
102 mpi_read_binary( &rsa
->N
, &buffer
[ 25], 64 ) == 0 &&
103 mpi_read_binary( &rsa
->E
, &buffer
[ 91], 3 ) == 0 ) ||
105 mpi_read_binary( &rsa
->N
, &buffer
[ 29], 128 ) == 0 ) &&
106 mpi_read_binary( &rsa
->E
, &buffer
[159], 3 ) == 0 )
109 * key read successfully
111 rsa
->len
= ( mpi_msb( &rsa
->N
) + 7 ) >> 3;
116 memset( rsa
, 0, sizeof( rsa_context
) );
122 #define RSA rsa_context
123 #define RSA_PKCS1_PADDING 1 /* ignored; always encrypt with this */
124 #define RSA_size( CTX ) (CTX)->len
125 #define RSA_free( CTX ) rsa_free( CTX )
126 #define ERR_get_error( ) "ERR_get_error() not supported"
127 #define RSA_blinding_off( IGNORE )
129 #define d2i_RSAPrivateKey( a, b, c ) new rsa_context /* TODO: C++ bleh */
131 inline int RSA_public_decrypt ( int size
, unsigned char* input
, unsigned char* output
, RSA
* key
, int ignore
) { int outsize
=size
; if( !rsa_pkcs1_decrypt( key
, RSA_PUBLIC
, &outsize
, input
, output
) ) return outsize
; else return -1; }
132 inline int RSA_private_decrypt( int size
, unsigned char* input
, unsigned char* output
, RSA
* key
, int ignore
) { int outsize
=size
; if( !rsa_pkcs1_decrypt( key
, RSA_PRIVATE
, &outsize
, input
, output
) ) return outsize
; else return -1; }
133 inline int RSA_public_encrypt ( int size
, unsigned char* input
, unsigned char* output
, RSA
* key
, int ignore
) { if( !rsa_pkcs1_encrypt( key
, RSA_PUBLIC
, size
, input
, output
) ) return RSA_size(key
); else return -1; }
134 inline int RSA_private_encrypt( int size
, unsigned char* input
, unsigned char* output
, RSA
* key
, int ignore
) { if( !rsa_pkcs1_encrypt( key
, RSA_PRIVATE
, size
, input
, output
) ) return RSA_size(key
); else return -1; }
140 #endif /* openssl.h */