OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
ssl
d1_enc.c
Go to the documentation of this file.
1
/* ssl/d1_enc.c */
2
/*
3
* DTLS implementation written by Nagendra Modadugu
4
* (
[email protected]
) for the OpenSSL project 2005.
5
*/
6
/* ====================================================================
7
* Copyright (c) 1998-2005 The OpenSSL Project. All rights reserved.
8
*
9
* Redistribution and use in source and binary forms, with or without
10
* modification, are permitted provided that the following conditions
11
* are met:
12
*
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
*
16
* 2. Redistributions in binary form must reproduce the above copyright
17
* notice, this list of conditions and the following disclaimer in
18
* the documentation and/or other materials provided with the
19
* distribution.
20
*
21
* 3. All advertising materials mentioning features or use of this
22
* software must display the following acknowledgment:
23
* "This product includes software developed by the OpenSSL Project
24
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
25
*
26
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27
* endorse or promote products derived from this software without
28
* prior written permission. For written permission, please contact
29
*
[email protected]
.
30
*
31
* 5. Products derived from this software may not be called "OpenSSL"
32
* nor may "OpenSSL" appear in their names without prior written
33
* permission of the OpenSSL Project.
34
*
35
* 6. Redistributions of any form whatsoever must retain the following
36
* acknowledgment:
37
* "This product includes software developed by the OpenSSL Project
38
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
39
*
40
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51
* OF THE POSSIBILITY OF SUCH DAMAGE.
52
* ====================================================================
53
*
54
* This product includes cryptographic software written by Eric Young
55
* (
[email protected]
). This product includes software written by Tim
56
* Hudson (
[email protected]
).
57
*
58
*/
59
/* Copyright (C) 1995-1998 Eric Young (
[email protected]
)
60
* All rights reserved.
61
*
62
* This package is an SSL implementation written
63
* by Eric Young (
[email protected]
).
64
* The implementation was written so as to conform with Netscapes SSL.
65
*
66
* This library is free for commercial and non-commercial use as long as
67
* the following conditions are aheared to. The following conditions
68
* apply to all code found in this distribution, be it the RC4, RSA,
69
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
70
* included with this distribution is covered by the same copyright terms
71
* except that the holder is Tim Hudson (
[email protected]
).
72
*
73
* Copyright remains Eric Young's, and as such any Copyright notices in
74
* the code are not to be removed.
75
* If this package is used in a product, Eric Young should be given attribution
76
* as the author of the parts of the library used.
77
* This can be in the form of a textual message at program startup or
78
* in documentation (online or textual) provided with the package.
79
*
80
* Redistribution and use in source and binary forms, with or without
81
* modification, are permitted provided that the following conditions
82
* are met:
83
* 1. Redistributions of source code must retain the copyright
84
* notice, this list of conditions and the following disclaimer.
85
* 2. Redistributions in binary form must reproduce the above copyright
86
* notice, this list of conditions and the following disclaimer in the
87
* documentation and/or other materials provided with the distribution.
88
* 3. All advertising materials mentioning features or use of this software
89
* must display the following acknowledgement:
90
* "This product includes cryptographic software written by
91
* Eric Young (
[email protected]
)"
92
* The word 'cryptographic' can be left out if the rouines from the library
93
* being used are not cryptographic related :-).
94
* 4. If you include any Windows specific code (or a derivative thereof) from
95
* the apps directory (application code) you must include an acknowledgement:
96
* "This product includes software written by Tim Hudson (
[email protected]
)"
97
*
98
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
99
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
100
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
101
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
102
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
103
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
104
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
105
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
106
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
107
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
108
* SUCH DAMAGE.
109
*
110
* The licence and distribution terms for any publically available version or
111
* derivative of this code cannot be changed. i.e. this code cannot simply be
112
* copied and put under another distribution licence
113
* [including the GNU Public Licence.]
114
*/
115
116
#include <stdio.h>
117
#include "
ssl_locl.h
"
118
#ifndef OPENSSL_NO_COMP
119
#include <
openssl/comp.h
>
120
#endif
121
#include <
openssl/evp.h
>
122
#include <
openssl/hmac.h
>
123
#include <
openssl/md5.h
>
124
#include <
openssl/rand.h
>
125
#ifdef KSSL_DEBUG
126
#include <
openssl/des.h
>
127
#endif
128
129
int
dtls1_enc
(
SSL
*s,
int
send)
130
{
131
SSL3_RECORD
*rec;
132
EVP_CIPHER_CTX
*ds;
133
unsigned
long
l;
134
int
bs,i,ii,j,
k
,n=0;
135
const
EVP_CIPHER
*
enc
;
136
137
if
(send)
138
{
139
if
(
EVP_MD_CTX_md
(s->
write_hash
))
140
{
141
n=
EVP_MD_CTX_size
(s->
write_hash
);
142
if
(n < 0)
143
return
-1;
144
}
145
ds=s->
enc_write_ctx
;
146
rec= &(s->
s3
->
wrec
);
147
if
(s->
enc_write_ctx
== NULL)
148
enc=NULL;
149
else
150
{
151
enc=
EVP_CIPHER_CTX_cipher
(s->
enc_write_ctx
);
152
if
( rec->
data
!= rec->
input
)
153
/* we can't write into the input stream */
154
fprintf(stderr,
"%s:%d: rec->data != rec->input\n"
,
155
__FILE__, __LINE__);
156
else
if
(
EVP_CIPHER_block_size
(ds->
cipher
) > 1)
157
{
158
if
(
RAND_bytes
(rec->
input
,
EVP_CIPHER_block_size
(ds->
cipher
)) <= 0)
159
return
-1;
160
}
161
}
162
}
163
else
164
{
165
if
(
EVP_MD_CTX_md
(s->
read_hash
))
166
{
167
n=
EVP_MD_CTX_size
(s->
read_hash
);
168
if
(n < 0)
169
return
-1;
170
}
171
ds=s->
enc_read_ctx
;
172
rec= &(s->
s3
->
rrec
);
173
if
(s->
enc_read_ctx
== NULL)
174
enc=NULL;
175
else
176
enc=
EVP_CIPHER_CTX_cipher
(s->
enc_read_ctx
);
177
}
178
179
#ifdef KSSL_DEBUG
180
printf(
"dtls1_enc(%d)\n"
, send);
181
#endif
/* KSSL_DEBUG */
182
183
if
((s->
session
== NULL) || (ds == NULL) ||
184
(enc == NULL))
185
{
186
memmove(rec->
data
,rec->
input
,rec->
length
);
187
rec->
input
=rec->
data
;
188
}
189
else
190
{
191
l=rec->
length
;
192
bs=
EVP_CIPHER_block_size
(ds->
cipher
);
193
194
if
((bs != 1) && send)
195
{
196
i=bs-((int)l%bs);
197
198
/* Add weird padding of upto 256 bytes */
199
200
/* we need to add 'i' padding bytes of value j */
201
j=i-1;
202
if
(s->
options
&
SSL_OP_TLS_BLOCK_PADDING_BUG
)
203
{
204
if
(s->
s3
->
flags
&
TLS1_FLAGS_TLS_PADDING_BUG
)
205
j++;
206
}
207
for
(k=(
int
)l; k<(int)(l+i); k++)
208
rec->
input
[k]=j;
209
l+=i;
210
rec->
length
+=i;
211
}
212
213
#ifdef KSSL_DEBUG
214
{
215
unsigned
long
ui;
216
printf(
"EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n"
,
217
ds,rec->
data
,rec->
input
,l);
218
printf(
"\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n"
,
219
ds->
buf_len
, ds->
cipher
->
key_len
,
220
DES_KEY_SZ
,
DES_SCHEDULE_SZ
,
221
ds->
cipher
->
iv_len
);
222
printf(
"\t\tIV: "
);
223
for
(i=0; i<ds->
cipher
->
iv_len
; i++) printf(
"%02X"
, ds->
iv
[i]);
224
printf(
"\n"
);
225
printf(
"\trec->input="
);
226
for
(ui=0; ui<l; ui++) printf(
" %02x"
, rec->
input
[ui]);
227
printf(
"\n"
);
228
}
229
#endif
/* KSSL_DEBUG */
230
231
if
(!send)
232
{
233
if
(l == 0 || l%bs != 0)
234
return
-1;
235
}
236
237
EVP_Cipher
(ds,rec->
data
,rec->
input
,l);
238
239
#ifdef KSSL_DEBUG
240
{
241
unsigned
long
i;
242
printf(
"\trec->data="
);
243
for
(i=0; i<l; i++)
244
printf(
" %02x"
, rec->
data
[i]); printf(
"\n"
);
245
}
246
#endif
/* KSSL_DEBUG */
247
248
if
((bs != 1) && !send)
249
{
250
ii=i=rec->
data
[l-1];
/* padding_length */
251
i++;
252
if
(s->
options
&
SSL_OP_TLS_BLOCK_PADDING_BUG
)
253
{
254
/* First packet is even in size, so check */
255
if
((memcmp(s->
s3
->
read_sequence
,
256
"\0\0\0\0\0\0\0\0"
,8) == 0) && !(ii & 1))
257
s->
s3
->
flags
|=
TLS1_FLAGS_TLS_PADDING_BUG
;
258
if
(s->
s3
->
flags
&
TLS1_FLAGS_TLS_PADDING_BUG
)
259
i--;
260
}
261
/* TLS 1.0 does not bound the number of padding bytes by the block size.
262
* All of them must have value 'padding_length'. */
263
if
(i + bs > (
int
)rec->
length
)
264
{
265
/* Incorrect padding. SSLerr() and ssl3_alert are done
266
* by caller: we don't want to reveal whether this is
267
* a decryption error or a MAC verification failure
268
* (see http://www.openssl.org/~bodo/tls-cbc.txt)
269
*/
270
return
-1;
271
}
272
for
(j=(
int
)(l-i); j<(int)l; j++)
273
{
274
if
(rec->
data
[j] != ii)
275
{
276
/* Incorrect padding */
277
return
-1;
278
}
279
}
280
rec->
length
-=i;
281
282
rec->
data
+= bs;
/* skip the implicit IV */
283
rec->
input
+= bs;
284
rec->
length
-= bs;
285
}
286
}
287
return
(1);
288
}
289
Generated on Thu Jan 10 2013 09:53:43 for OpenSSL by
1.8.2