Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**
  2.  * \file openssl.h
  3.  *
  4.  * \brief OpenSSL wrapper (definitions, inline functions).
  5.  *
  6.  *  Copyright (C) 2006-2010, Brainspark B.V.
  7.  *
  8.  *  This file is part of PolarSSL (http://www.polarssl.org)
  9.  *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  10.  *
  11.  *  All rights reserved.
  12.  *
  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.
  17.  *
  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.
  22.  *
  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.
  26.  */
  27. /*
  28.  * OpenSSL wrapper contributed by David Barett
  29.  */
  30. #ifndef POLARSSL_OPENSSL_H
  31. #define POLARSSL_OPENSSL_H
  32.  
  33. #include "aes.h"
  34. #include "md5.h"
  35. #include "rsa.h"
  36. #include "sha1.h"
  37.  
  38. #define AES_SIZE                16
  39. #define AES_BLOCK_SIZE          16
  40. #define AES_KEY                 aes_context
  41. #define MD5_CTX                 md5_context
  42. #define SHA_CTX                 sha1_context
  43.  
  44. #define SHA1_Init( CTX ) \
  45.         sha1_starts( (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) )
  50.  
  51. #define MD5_Init( CTX ) \
  52.         md5_starts( (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) )
  57.  
  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) )
  64.  
  65. /*
  66.  * RSA stuff follows. TODO: needs cleanup
  67.  */
  68. inline int __RSA_Passthrough( void *output, void *input, int size )
  69. {
  70.     memcpy( output, input, size );
  71.     return size;
  72. }
  73.  
  74. inline rsa_context* d2i_RSA_PUBKEY( void *ignore, unsigned char **bufptr,
  75.                                     int len )
  76. {
  77.     unsigned char *buffer = *(unsigned char **) bufptr;
  78.     rsa_context *rsa;
  79.    
  80.     /*
  81.      * Not a general-purpose parser: only parses public key from *exactly*
  82.      *   openssl genrsa -out privkey.pem 512 (or 1024)
  83.      *   openssl rsa -in privkey.pem -out privatekey.der -outform der
  84.      *   openssl rsa -in privkey.pem -out pubkey.der -outform der -pubout
  85.      *
  86.      * TODO: make a general-purpose parse
  87.      */
  88.     if( ignore != 0 || ( len != 94 && len != 162 ) )
  89.         return( 0 );
  90.  
  91.     rsa = (rsa_context *) malloc( sizeof( rsa_rsa ) );
  92.     if( rsa == NULL )
  93.         return( 0 );
  94.  
  95.     memset( rsa, 0, sizeof( rsa_context ) );
  96.  
  97.     if( ( len ==  94 &&
  98.           mpi_read_binary( &rsa->N, &buffer[ 25],  64 ) == 0 &&
  99.           mpi_read_binary( &rsa->E, &buffer[ 91],   3 ) == 0 ) ||
  100.         ( len == 162 &&
  101.           mpi_read_binary( &rsa->N, &buffer[ 29], 128 ) == 0 ) &&
  102.           mpi_read_binary( &rsa->E, &buffer[159],   3 ) == 0 )
  103.     {
  104.         /*
  105.          * key read successfully
  106.          */
  107.         rsa->len = ( mpi_msb( &rsa->N ) + 7 ) >> 3;
  108.         return( rsa );
  109.     }
  110.     else
  111.     {
  112.         memset( rsa, 0, sizeof( rsa_context ) );
  113.         free( rsa );
  114.         return( 0 );
  115.     }
  116. }
  117.  
  118. #define RSA                     rsa_context
  119. #define RSA_PKCS1_PADDING       1 /* ignored; always encrypt with this */
  120. #define RSA_size( CTX )         (CTX)->len
  121. #define RSA_free( CTX )         rsa_free( CTX )
  122. #define ERR_get_error( )        "ERR_get_error() not supported"
  123. #define RSA_blinding_off( IGNORE )
  124.  
  125. #define d2i_RSAPrivateKey( a, b, c ) new rsa_context /* TODO: C++ bleh */
  126.  
  127. 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; }
  128. 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; }
  129. 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; }
  130. 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; }
  131.  
  132. #ifdef __cplusplus
  133. }
  134. #endif
  135.  
  136. #endif /* openssl.h */
  137.