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: #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:
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