summaryrefslogtreecommitdiff
path: root/polarssl/src/include/polarssl/openssl.h
blob: 62609a29737d5f2485f7b41c5e5b32980ad25b6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
 * \file openssl.h
 *
 * \brief OpenSSL wrapper (definitions, inline functions).
 *
 *  Copyright (C) 2006-2010, Brainspark B.V.
 *
 *  This file is part of PolarSSL (http://www.polarssl.org)
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
 *
 *  All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
/*
 * OpenSSL wrapper contributed by David Barett
 */
#ifndef POLARSSL_OPENSSL_H
#define POLARSSL_OPENSSL_H

#include "aes.h"
#include "md5.h"
#include "rsa.h"
#include "sha1.h"

#define AES_SIZE                16
#define AES_BLOCK_SIZE          16
#define AES_KEY                 aes_context
#define MD5_CTX                 md5_context
#define SHA_CTX                 sha1_context

#define SHA1_Init( CTX ) \
        sha1_starts( (CTX) )
#define SHA1_Update(  CTX, BUF, LEN ) \
        sha1_update( (CTX), (unsigned char *)(BUF), (LEN) )
#define SHA1_Final( OUT, CTX ) \
        sha1_finish( (CTX), (OUT) )

#define MD5_Init( CTX ) \
        md5_starts( (CTX) )
#define MD5_Update( CTX, BUF, LEN ) \
        md5_update( (CTX), (unsigned char *)(BUF), (LEN) )
#define MD5_Final( OUT, CTX ) \
        md5_finish( (CTX), (OUT) )

#define AES_set_encrypt_key( KEY, KEYSIZE, CTX ) \
        aes_setkey_enc( (CTX), (KEY), (KEYSIZE) )
#define AES_set_decrypt_key( KEY, KEYSIZE, CTX ) \
        aes_setkey_dec( (CTX), (KEY), (KEYSIZE) )
#define AES_cbc_encrypt( INPUT, OUTPUT, LEN, CTX, IV, MODE ) \
        aes_crypt_cbc( (CTX), (MODE), (LEN), (IV), (INPUT), (OUTPUT) )

/*
 * RSA stuff follows. TODO: needs cleanup
 */
inline int __RSA_Passthrough( void *output, void *input, int size )
{
    memcpy( output, input, size );
    return size;
}

inline rsa_context* d2i_RSA_PUBKEY( void *ignore, unsigned char **bufptr,
                                    int len )
{
    unsigned char *buffer = *(unsigned char **) bufptr;
    rsa_context *rsa;
    
    /*
     * Not a general-purpose parser: only parses public key from *exactly*
     *   openssl genrsa -out privkey.pem 512 (or 1024)
     *   openssl rsa -in privkey.pem -out privatekey.der -outform der
     *   openssl rsa -in privkey.pem -out pubkey.der -outform der -pubout
     *
     * TODO: make a general-purpose parse
     */
    if( ignore != 0 || ( len != 94 && len != 162 ) )
        return( 0 );

    rsa = (rsa_context *) malloc( sizeof( rsa_rsa ) );
    if( rsa == NULL )
        return( 0 );

    memset( rsa, 0, sizeof( rsa_context ) );

    if( ( len ==  94 && 
          mpi_read_binary( &rsa->N, &buffer[ 25],  64 ) == 0 &&
          mpi_read_binary( &rsa->E, &buffer[ 91],   3 ) == 0 ) ||
        ( len == 162 &&
          mpi_read_binary( &rsa->N, &buffer[ 29], 128 ) == 0 ) &&
          mpi_read_binary( &rsa->E, &buffer[159],   3 ) == 0 )
    {
        /*
         * key read successfully
         */
        rsa->len = ( mpi_msb( &rsa->N ) + 7 ) >> 3;
        return( rsa );
    }
    else
    {
        memset( rsa, 0, sizeof( rsa_context ) );
        free( rsa );
        return( 0 );
    }
}

#define RSA                     rsa_context
#define RSA_PKCS1_PADDING       1 /* ignored; always encrypt with this */
#define RSA_size( CTX )         (CTX)->len
#define RSA_free( CTX )         rsa_free( CTX )
#define ERR_get_error( )        "ERR_get_error() not supported"
#define RSA_blinding_off( IGNORE )

#define d2i_RSAPrivateKey( a, b, c ) new rsa_context /* TODO: C++ bleh */

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; }
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; }
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; }
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; }

#ifdef __cplusplus
}
#endif

#endif /* openssl.h */