1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Written by Ben Laurie, 2001 */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    openssl-core@openssl.org.
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h>
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h>
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rsa.h>
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "evp_locl.h"
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This stuff should now all be supported through
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * crypto/engine/hw_openbsd_dev_crypto.c unless I botched it up */
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void *dummy=&dummy;
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* check flag after OpenSSL headers to ensure make depend works */
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_OPENBSD_DEV_CRYPTO
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <fcntl.h>
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <errno.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <sys/ioctl.h>
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <crypto/cryptodev.h>
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <unistd.h>
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <assert.h>
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* longest key supported in hardware */
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MAX_HW_KEY	24
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MAX_HW_IV	8
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MD5_DIGEST_LENGTH	16
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define MD5_CBLOCK		64
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int fd;
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_failed;
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct session_op session_op;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define CDATA(ctx) EVP_C_DATA(session_op,ctx)
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic void err(const char *str)
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    fprintf(stderr,"%s: errno %d\n",str,errno);
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_init(session_op *ses)
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(dev_failed)
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(!fd)
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int cryptodev_fd;
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if ((cryptodev_fd=open("/dev/crypto",O_RDWR,0)) < 0)
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    {
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    err("/dev/crypto");
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    dev_failed=1;
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    return 0;
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        if (ioctl(cryptodev_fd,CRIOGET,&fd) == -1)
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    {
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    err("CRIOGET failed");
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    close(cryptodev_fd);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    dev_failed=1;
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    return 0;
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	close(cryptodev_fd);
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert(ses);
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memset(ses,'\0',sizeof *ses);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_cleanup(EVP_CIPHER_CTX *ctx)
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ioctl(fd,CIOCFSESSION,&CDATA(ctx)->ses) == -1)
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err("CIOCFSESSION failed");
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    OPENSSL_free(CDATA(ctx)->key);
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_init_key(EVP_CIPHER_CTX *ctx,int cipher,
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       const unsigned char *key,int klen)
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(!dev_crypto_init(CDATA(ctx)))
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    CDATA(ctx)->key=OPENSSL_malloc(MAX_HW_KEY);
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert(ctx->cipher->iv_len <= MAX_HW_IV);
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memcpy(CDATA(ctx)->key,key,klen);
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    CDATA(ctx)->cipher=cipher;
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    CDATA(ctx)->keylen=klen;
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ioctl(fd,CIOCGSESSION,CDATA(ctx)) == -1)
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err("CIOCGSESSION failed");
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_cipher(EVP_CIPHER_CTX *ctx,unsigned char *out,
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     const unsigned char *in,unsigned int inl)
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    struct crypt_op cryp;
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned char lb[MAX_HW_IV];
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(!inl)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert(CDATA(ctx));
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert(!dev_failed);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memset(&cryp,'\0',sizeof cryp);
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.ses=CDATA(ctx)->ses;
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.op=ctx->encrypt ? COP_ENCRYPT : COP_DECRYPT;
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.flags=0;
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.len=inl;
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert((inl&(ctx->cipher->block_size-1)) == 0);
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.src=(caddr_t)in;
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.dst=(caddr_t)out;
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.mac=0;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ctx->cipher->iv_len)
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	cryp.iv=(caddr_t)ctx->iv;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(!ctx->encrypt)
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(lb,&in[cryp.len-ctx->cipher->iv_len],ctx->cipher->iv_len);
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ioctl(fd, CIOCCRYPT, &cryp) == -1)
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(errno == EINVAL) /* buffers are misaligned */
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    {
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    unsigned int cinl=0;
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    char *cin=NULL;
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    char *cout=NULL;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    /* NB: this can only make cinl != inl with stream ciphers */
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    cinl=(inl+3)/4*4;
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if(((unsigned long)in&3) || cinl != inl)
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cin=OPENSSL_malloc(cinl);
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(cin,in,inl);
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cryp.src=cin;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if(((unsigned long)out&3) || cinl != inl)
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cout=OPENSSL_malloc(cinl);
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		cryp.dst=cout;
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    cryp.len=cinl;
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if(ioctl(fd, CIOCCRYPT, &cryp) == -1)
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		err("CIOCCRYPT(2) failed");
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		printf("src=%p dst=%p\n",cryp.src,cryp.dst);
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		abort();
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if(cout)
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(out,cout,inl);
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(cout);
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if(cin)
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(cin);
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    {
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    err("CIOCCRYPT failed");
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    abort();
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    return 0;
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ctx->encrypt)
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(ctx->iv,&out[cryp.len-ctx->cipher->iv_len],ctx->cipher->iv_len);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(ctx->iv,lb,ctx->cipher->iv_len);
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_des_ede3_init_key(EVP_CIPHER_CTX *ctx,
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					const unsigned char *key,
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					const unsigned char *iv, int enc)
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    { return dev_crypto_init_key(ctx,CRYPTO_3DES_CBC,key,24); }
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define dev_crypto_des_ede3_cbc_cipher dev_crypto_cipher
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_def_cbc(dev_crypto_des_ede3, session_op, NID_des_ede3, 8, 24, 8,
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     0, dev_crypto_des_ede3_init_key,
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     dev_crypto_cleanup,
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     EVP_CIPHER_set_asn1_iv,
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     EVP_CIPHER_get_asn1_iv,
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     NULL)
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_rc4_init_key(EVP_CIPHER_CTX *ctx,
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					const unsigned char *key,
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project					const unsigned char *iv, int enc)
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    { return dev_crypto_init_key(ctx,CRYPTO_ARC4,key,16); }
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const EVP_CIPHER r4_cipher=
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NID_rc4,
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    1,16,0,	/* FIXME: key should be up to 256 bytes */
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    EVP_CIPH_VARIABLE_LENGTH,
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_rc4_init_key,
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_cipher,
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_cleanup,
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    sizeof(session_op),
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NULL,
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NULL,
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NULL
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EVP_CIPHER *EVP_dev_crypto_rc4(void)
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    { return &r4_cipher; }
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    session_op sess;
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    char *data;
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int len;
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned char md[EVP_MAX_MD_SIZE];
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    } MD_DATA;
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_init_digest(MD_DATA *md_data,int mac)
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(!dev_crypto_init(&md_data->sess))
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    md_data->len=0;
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    md_data->data=NULL;
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    md_data->sess.mac=mac;
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ioctl(fd,CIOCGSESSION,&md_data->sess) == -1)
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err("CIOCGSESSION failed");
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_cleanup_digest(MD_DATA *md_data)
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if (ioctl(fd,CIOCFSESSION,&md_data->sess.ses) == -1)
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	err("CIOCFSESSION failed");
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* FIXME: if device can do chained MACs, then don't accumulate */
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* FIXME: move accumulation to the framework */
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_md5_init(EVP_MD_CTX *ctx)
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    { return dev_crypto_init_digest(ctx->md_data,CRYPTO_MD5); }
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int do_digest(int ses,unsigned char *md,const void *data,int len)
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    struct crypt_op cryp;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    static unsigned char md5zero[16]=
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0xd4,0x1d,0x8c,0xd9,0x8f,0x00,0xb2,0x04,
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0xe9,0x80,0x09,0x98,0xec,0xf8,0x42,0x7e
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	};
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /* some cards can't do zero length */
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(!len)
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(md,md5zero,16);
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memset(&cryp,'\0',sizeof cryp);
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.ses=ses;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.op=COP_ENCRYPT;/* required to do the MAC rather than check it */
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.len=len;
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.src=(caddr_t)data;
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.dst=(caddr_t)data; // FIXME!!!
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    cryp.mac=(caddr_t)md;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ioctl(fd, CIOCCRYPT, &cryp) == -1)
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(errno == EINVAL) /* buffer is misaligned */
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    {
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    char *dcopy;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    dcopy=OPENSSL_malloc(len);
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    memcpy(dcopy,data,len);
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    cryp.src=dcopy;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    cryp.dst=cryp.src; // FIXME!!!
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    if(ioctl(fd, CIOCCRYPT, &cryp) == -1)
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		err("CIOCCRYPT(MAC2) failed");
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		abort();
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    OPENSSL_free(dcopy);
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    {
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    err("CIOCCRYPT(MAC) failed");
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    abort();
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    return 0;
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    }
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    //    printf("done\n");
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_md5_update(EVP_MD_CTX *ctx,const void *data,
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 unsigned long len)
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MD_DATA *md_data=ctx->md_data;
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ctx->flags&EVP_MD_CTX_FLAG_ONESHOT)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return do_digest(md_data->sess.ses,md_data->md,data,len);
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    md_data->data=OPENSSL_realloc(md_data->data,md_data->len+len);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memcpy(md_data->data+md_data->len,data,len);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    md_data->len+=len;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_md5_final(EVP_MD_CTX *ctx,unsigned char *md)
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int ret;
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MD_DATA *md_data=ctx->md_data;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    if(ctx->flags&EVP_MD_CTX_FLAG_ONESHOT)
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(md,md_data->md,MD5_DIGEST_LENGTH);
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=1;
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    else
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=do_digest(md_data->sess.ses,md,md_data->data,md_data->len);
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(md_data->data);
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	md_data->data=NULL;
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	md_data->len=0;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return ret;
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_md5_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from)
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const MD_DATA *from_md=from->md_data;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MD_DATA *to_md=to->md_data;
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    // How do we copy sessions?
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    assert(from->digest->flags&EVP_MD_FLAG_ONESHOT);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    to_md->data=OPENSSL_malloc(from_md->len);
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    memcpy(to_md->data,from_md->data,from_md->len);
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int dev_crypto_md5_cleanup(EVP_MD_CTX *ctx)
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return dev_crypto_cleanup_digest(ctx->md_data);
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const EVP_MD md5_md=
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NID_md5,
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    NID_md5WithRSAEncryption,
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MD5_DIGEST_LENGTH,
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    EVP_MD_FLAG_ONESHOT,	// XXX: set according to device info...
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_md5_init,
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_md5_update,
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_md5_final,
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_md5_copy,
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    dev_crypto_md5_cleanup,
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    EVP_PKEY_RSA_method,
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MD5_CBLOCK,
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    sizeof(MD_DATA),
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EVP_MD *EVP_dev_crypto_md5(void)
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    { return &md5_md; }
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
447