OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
test
dhtest.c
Go to the documentation of this file.
1
/* crypto/dh/dhtest.c */
2
/* Copyright (C) 1995-1998 Eric Young (
[email protected]
)
3
* All rights reserved.
4
*
5
* This package is an SSL implementation written
6
* by Eric Young (
[email protected]
).
7
* The implementation was written so as to conform with Netscapes SSL.
8
*
9
* This library is free for commercial and non-commercial use as long as
10
* the following conditions are aheared to. The following conditions
11
* apply to all code found in this distribution, be it the RC4, RSA,
12
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
13
* included with this distribution is covered by the same copyright terms
14
* except that the holder is Tim Hudson (
[email protected]
).
15
*
16
* Copyright remains Eric Young's, and as such any Copyright notices in
17
* the code are not to be removed.
18
* If this package is used in a product, Eric Young should be given attribution
19
* as the author of the parts of the library used.
20
* This can be in the form of a textual message at program startup or
21
* in documentation (online or textual) provided with the package.
22
*
23
* Redistribution and use in source and binary forms, with or without
24
* modification, are permitted provided that the following conditions
25
* are met:
26
* 1. Redistributions of source code must retain the copyright
27
* notice, this list of conditions and the following disclaimer.
28
* 2. Redistributions in binary form must reproduce the above copyright
29
* notice, this list of conditions and the following disclaimer in the
30
* documentation and/or other materials provided with the distribution.
31
* 3. All advertising materials mentioning features or use of this software
32
* must display the following acknowledgement:
33
* "This product includes cryptographic software written by
34
* Eric Young (
[email protected]
)"
35
* The word 'cryptographic' can be left out if the rouines from the library
36
* being used are not cryptographic related :-).
37
* 4. If you include any Windows specific code (or a derivative thereof) from
38
* the apps directory (application code) you must include an acknowledgement:
39
* "This product includes software written by Tim Hudson (
[email protected]
)"
40
*
41
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51
* SUCH DAMAGE.
52
*
53
* The licence and distribution terms for any publically available version or
54
* derivative of this code cannot be changed. i.e. this code cannot simply be
55
* copied and put under another distribution licence
56
* [including the GNU Public Licence.]
57
*/
58
59
/* Until the key-gen callbacks are modified to use newer prototypes, we allow
60
* deprecated functions for openssl-internal code */
61
#ifdef OPENSSL_NO_DEPRECATED
62
#undef OPENSSL_NO_DEPRECATED
63
#endif
64
65
#include <stdio.h>
66
#include <stdlib.h>
67
#include <string.h>
68
69
#include "../e_os.h"
70
71
#include <
openssl/crypto.h
>
72
#include <
openssl/bio.h
>
73
#include <
openssl/bn.h
>
74
#include <
openssl/rand.h
>
75
#include <
openssl/err.h
>
76
77
#ifdef OPENSSL_NO_DH
78
int
main
(
int
argc,
char
*argv[])
79
{
80
printf(
"No DH support\n"
);
81
return
(0);
82
}
83
#else
84
#include <
openssl/dh.h
>
85
86
#ifdef OPENSSL_SYS_WIN16
87
#define MS_CALLBACK _far _loadds
88
#else
89
#define MS_CALLBACK
90
#endif
91
92
static
int
MS_CALLBACK
cb
(
int
p
,
int
n,
BN_GENCB
*
arg
);
93
94
static
const
char
rnd_seed[] =
"string to make the random number generator think it has entropy"
;
95
96
int
main
(
int
argc,
char
*argv[])
97
{
98
BN_GENCB
_cb;
99
DH
*
a
;
100
DH
*
b
=NULL;
101
char
buf[12];
102
unsigned
char
*abuf=NULL,*bbuf=NULL;
103
int
i,alen,blen,aout,bout,ret=1;
104
BIO
*
out
;
105
106
CRYPTO_malloc_debug_init
();
107
CRYPTO_dbg_set_options
(
V_CRYPTO_MDEBUG_ALL
);
108
CRYPTO_mem_ctrl
(
CRYPTO_MEM_CHECK_ON
);
109
110
#ifdef OPENSSL_SYS_WIN32
111
CRYPTO_malloc_init
();
112
#endif
113
114
RAND_seed
(rnd_seed,
sizeof
rnd_seed);
115
116
out=
BIO_new
(
BIO_s_file
());
117
if
(out == NULL)
EXIT
(1);
118
BIO_set_fp
(out,stdout,
BIO_NOCLOSE
);
119
120
BN_GENCB_set
(&_cb, &
cb
, out);
121
if
(((a =
DH_new
()) == NULL) || !
DH_generate_parameters_ex
(a, 64,
122
DH_GENERATOR_5
, &_cb))
123
goto
err;
124
125
if
(!
DH_check
(a, &i))
goto
err;
126
if
(i &
DH_CHECK_P_NOT_PRIME
)
127
BIO_puts
(out,
"p value is not prime\n"
);
128
if
(i &
DH_CHECK_P_NOT_SAFE_PRIME
)
129
BIO_puts
(out,
"p value is not a safe prime\n"
);
130
if
(i &
DH_UNABLE_TO_CHECK_GENERATOR
)
131
BIO_puts
(out,
"unable to check the generator value\n"
);
132
if
(i &
DH_NOT_SUITABLE_GENERATOR
)
133
BIO_puts
(out,
"the g value is not a generator\n"
);
134
135
BIO_puts
(out,
"\np ="
);
136
BN_print
(out,a->
p
);
137
BIO_puts
(out,
"\ng ="
);
138
BN_print
(out,a->
g
);
139
BIO_puts
(out,
"\n"
);
140
141
b=
DH_new
();
142
if
(b == NULL)
goto
err;
143
144
b->
p
=
BN_dup
(a->
p
);
145
b->
g
=
BN_dup
(a->
g
);
146
if
((b->
p
== NULL) || (b->
g
== NULL))
goto
err;
147
148
/* Set a to run with normal modexp and b to use constant time */
149
a->
flags
&= ~
DH_FLAG_NO_EXP_CONSTTIME
;
150
b->
flags
|=
DH_FLAG_NO_EXP_CONSTTIME
;
151
152
if
(!
DH_generate_key
(a))
goto
err;
153
BIO_puts
(out,
"pri 1="
);
154
BN_print
(out,a->
priv_key
);
155
BIO_puts
(out,
"\npub 1="
);
156
BN_print
(out,a->
pub_key
);
157
BIO_puts
(out,
"\n"
);
158
159
if
(!
DH_generate_key
(b))
goto
err;
160
BIO_puts
(out,
"pri 2="
);
161
BN_print
(out,b->
priv_key
);
162
BIO_puts
(out,
"\npub 2="
);
163
BN_print
(out,b->
pub_key
);
164
BIO_puts
(out,
"\n"
);
165
166
alen=
DH_size
(a);
167
abuf=(
unsigned
char
*)
OPENSSL_malloc
(alen);
168
aout=
DH_compute_key
(abuf,b->
pub_key
,a);
169
170
BIO_puts
(out,
"key1 ="
);
171
for
(i=0; i<aout; i++)
172
{
173
sprintf(buf,
"%02X"
,abuf[i]);
174
BIO_puts
(out,buf);
175
}
176
BIO_puts
(out,
"\n"
);
177
178
blen=
DH_size
(b);
179
bbuf=(
unsigned
char
*)
OPENSSL_malloc
(blen);
180
bout=
DH_compute_key
(bbuf,a->
pub_key
,b);
181
182
BIO_puts
(out,
"key2 ="
);
183
for
(i=0; i<bout; i++)
184
{
185
sprintf(buf,
"%02X"
,bbuf[i]);
186
BIO_puts
(out,buf);
187
}
188
BIO_puts
(out,
"\n"
);
189
if
((aout < 4) || (bout != aout) || (memcmp(abuf,bbuf,aout) != 0))
190
{
191
fprintf(stderr,
"Error in DH routines\n"
);
192
ret=1;
193
}
194
else
195
ret=0;
196
err:
197
ERR_print_errors_fp
(stderr);
198
199
if
(abuf != NULL)
OPENSSL_free
(abuf);
200
if
(bbuf != NULL)
OPENSSL_free
(bbuf);
201
if
(b != NULL)
DH_free
(b);
202
if
(a != NULL)
DH_free
(a);
203
BIO_free
(out);
204
#ifdef OPENSSL_SYS_NETWARE
205
if
(ret) printf(
"ERROR: %d\n"
, ret);
206
#endif
207
EXIT
(ret);
208
return
(ret);
209
}
210
211
static
int
MS_CALLBACK
cb
(
int
p
,
int
n,
BN_GENCB
*
arg
)
212
{
213
char
c
=
'*'
;
214
215
if
(p == 0) c=
'.'
;
216
if
(p == 1) c=
'+'
;
217
if
(p == 2) c=
'*'
;
218
if
(p == 3) c=
'\n'
;
219
BIO_write
(arg->
arg
,&c,1);
220
(
void
)
BIO_flush
(arg->
arg
);
221
#ifdef LINT
222
p=n;
223
#endif
224
return
1;
225
}
226
#endif
Generated on Thu Jan 10 2013 09:53:35 for OpenSSL by
1.8.2