Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5496 leency 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 
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 */