s2_clnt.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094
  1. /* ssl/s2_clnt.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. * Copyright (c) 1998-2001 The OpenSSL Project. All rights reserved.
  60. *
  61. * Redistribution and use in source and binary forms, with or without
  62. * modification, are permitted provided that the following conditions
  63. * are met:
  64. *
  65. * 1. Redistributions of source code must retain the above copyright
  66. * notice, this list of conditions and the following disclaimer.
  67. *
  68. * 2. Redistributions in binary form must reproduce the above copyright
  69. * notice, this list of conditions and the following disclaimer in
  70. * the documentation and/or other materials provided with the
  71. * distribution.
  72. *
  73. * 3. All advertising materials mentioning features or use of this
  74. * software must display the following acknowledgment:
  75. * "This product includes software developed by the OpenSSL Project
  76. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  77. *
  78. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  79. * endorse or promote products derived from this software without
  80. * prior written permission. For written permission, please contact
  81. * [email protected].
  82. *
  83. * 5. Products derived from this software may not be called "OpenSSL"
  84. * nor may "OpenSSL" appear in their names without prior written
  85. * permission of the OpenSSL Project.
  86. *
  87. * 6. Redistributions of any form whatsoever must retain the following
  88. * acknowledgment:
  89. * "This product includes software developed by the OpenSSL Project
  90. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  91. *
  92. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  93. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  94. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  95. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  96. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  97. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  98. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  99. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  100. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  101. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  102. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  103. * OF THE POSSIBILITY OF SUCH DAMAGE.
  104. * ====================================================================
  105. *
  106. * This product includes cryptographic software written by Eric Young
  107. * ([email protected]). This product includes software written by Tim
  108. * Hudson ([email protected]).
  109. *
  110. */
  111. #include "ssl_locl.h"
  112. #ifndef OPENSSL_NO_SSL2
  113. # include <stdio.h>
  114. # include <openssl/rand.h>
  115. # include <openssl/buffer.h>
  116. # include <openssl/objects.h>
  117. # include <openssl/evp.h>
  118. static const SSL_METHOD *ssl2_get_client_method(int ver);
  119. static int get_server_finished(SSL *s);
  120. static int get_server_verify(SSL *s);
  121. static int get_server_hello(SSL *s);
  122. static int client_hello(SSL *s);
  123. static int client_master_key(SSL *s);
  124. static int client_finished(SSL *s);
  125. static int client_certificate(SSL *s);
  126. static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
  127. unsigned char *to, int padding);
  128. # define BREAK break
  129. static const SSL_METHOD *ssl2_get_client_method(int ver)
  130. {
  131. if (ver == SSL2_VERSION)
  132. return (SSLv2_client_method());
  133. else
  134. return (NULL);
  135. }
  136. IMPLEMENT_ssl2_meth_func(SSLv2_client_method,
  137. ssl_undefined_function,
  138. ssl2_connect, ssl2_get_client_method)
  139. int ssl2_connect(SSL *s)
  140. {
  141. unsigned long l = (unsigned long)time(NULL);
  142. BUF_MEM *buf = NULL;
  143. int ret = -1;
  144. void (*cb) (const SSL *ssl, int type, int val) = NULL;
  145. int new_state, state;
  146. RAND_add(&l, sizeof(l), 0);
  147. ERR_clear_error();
  148. clear_sys_error();
  149. if (s->info_callback != NULL)
  150. cb = s->info_callback;
  151. else if (s->ctx->info_callback != NULL)
  152. cb = s->ctx->info_callback;
  153. /* init things to blank */
  154. s->in_handshake++;
  155. if (!SSL_in_init(s) || SSL_in_before(s))
  156. SSL_clear(s);
  157. for (;;) {
  158. state = s->state;
  159. switch (s->state) {
  160. case SSL_ST_BEFORE:
  161. case SSL_ST_CONNECT:
  162. case SSL_ST_BEFORE | SSL_ST_CONNECT:
  163. case SSL_ST_OK | SSL_ST_CONNECT:
  164. s->server = 0;
  165. if (cb != NULL)
  166. cb(s, SSL_CB_HANDSHAKE_START, 1);
  167. s->version = SSL2_VERSION;
  168. s->type = SSL_ST_CONNECT;
  169. buf = s->init_buf;
  170. if ((buf == NULL) && ((buf = BUF_MEM_new()) == NULL)) {
  171. ret = -1;
  172. goto end;
  173. }
  174. if (!BUF_MEM_grow(buf, SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) {
  175. if (buf == s->init_buf)
  176. buf = NULL;
  177. ret = -1;
  178. goto end;
  179. }
  180. s->init_buf = buf;
  181. buf = NULL;
  182. s->init_num = 0;
  183. s->state = SSL2_ST_SEND_CLIENT_HELLO_A;
  184. s->ctx->stats.sess_connect++;
  185. s->handshake_func = ssl2_connect;
  186. BREAK;
  187. case SSL2_ST_SEND_CLIENT_HELLO_A:
  188. case SSL2_ST_SEND_CLIENT_HELLO_B:
  189. s->shutdown = 0;
  190. ret = client_hello(s);
  191. if (ret <= 0)
  192. goto end;
  193. s->init_num = 0;
  194. s->state = SSL2_ST_GET_SERVER_HELLO_A;
  195. BREAK;
  196. case SSL2_ST_GET_SERVER_HELLO_A:
  197. case SSL2_ST_GET_SERVER_HELLO_B:
  198. ret = get_server_hello(s);
  199. if (ret <= 0)
  200. goto end;
  201. s->init_num = 0;
  202. if (!s->hit) { /* new session */
  203. s->state = SSL2_ST_SEND_CLIENT_MASTER_KEY_A;
  204. BREAK;
  205. } else {
  206. s->state = SSL2_ST_CLIENT_START_ENCRYPTION;
  207. break;
  208. }
  209. case SSL2_ST_SEND_CLIENT_MASTER_KEY_A:
  210. case SSL2_ST_SEND_CLIENT_MASTER_KEY_B:
  211. ret = client_master_key(s);
  212. if (ret <= 0)
  213. goto end;
  214. s->init_num = 0;
  215. s->state = SSL2_ST_CLIENT_START_ENCRYPTION;
  216. break;
  217. case SSL2_ST_CLIENT_START_ENCRYPTION:
  218. /*
  219. * Ok, we now have all the stuff needed to start encrypting, so
  220. * lets fire it up :-)
  221. */
  222. if (!ssl2_enc_init(s, 1)) {
  223. ret = -1;
  224. goto end;
  225. }
  226. s->s2->clear_text = 0;
  227. s->state = SSL2_ST_SEND_CLIENT_FINISHED_A;
  228. break;
  229. case SSL2_ST_SEND_CLIENT_FINISHED_A:
  230. case SSL2_ST_SEND_CLIENT_FINISHED_B:
  231. ret = client_finished(s);
  232. if (ret <= 0)
  233. goto end;
  234. s->init_num = 0;
  235. s->state = SSL2_ST_GET_SERVER_VERIFY_A;
  236. break;
  237. case SSL2_ST_GET_SERVER_VERIFY_A:
  238. case SSL2_ST_GET_SERVER_VERIFY_B:
  239. ret = get_server_verify(s);
  240. if (ret <= 0)
  241. goto end;
  242. s->init_num = 0;
  243. s->state = SSL2_ST_GET_SERVER_FINISHED_A;
  244. break;
  245. case SSL2_ST_GET_SERVER_FINISHED_A:
  246. case SSL2_ST_GET_SERVER_FINISHED_B:
  247. ret = get_server_finished(s);
  248. if (ret <= 0)
  249. goto end;
  250. break;
  251. case SSL2_ST_SEND_CLIENT_CERTIFICATE_A:
  252. case SSL2_ST_SEND_CLIENT_CERTIFICATE_B:
  253. case SSL2_ST_SEND_CLIENT_CERTIFICATE_C:
  254. case SSL2_ST_SEND_CLIENT_CERTIFICATE_D:
  255. case SSL2_ST_X509_GET_CLIENT_CERTIFICATE:
  256. ret = client_certificate(s);
  257. if (ret <= 0)
  258. goto end;
  259. s->init_num = 0;
  260. s->state = SSL2_ST_GET_SERVER_FINISHED_A;
  261. break;
  262. case SSL_ST_OK:
  263. if (s->init_buf != NULL) {
  264. BUF_MEM_free(s->init_buf);
  265. s->init_buf = NULL;
  266. }
  267. s->init_num = 0;
  268. /* ERR_clear_error(); */
  269. /*
  270. * If we want to cache session-ids in the client and we
  271. * successfully add the session-id to the cache, and there is a
  272. * callback, then pass it out. 26/11/96 - eay - only add if not a
  273. * re-used session.
  274. */
  275. ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
  276. if (s->hit)
  277. s->ctx->stats.sess_hit++;
  278. ret = 1;
  279. /* s->server=0; */
  280. s->ctx->stats.sess_connect_good++;
  281. if (cb != NULL)
  282. cb(s, SSL_CB_HANDSHAKE_DONE, 1);
  283. goto end;
  284. /* break; */
  285. default:
  286. SSLerr(SSL_F_SSL2_CONNECT, SSL_R_UNKNOWN_STATE);
  287. return (-1);
  288. /* break; */
  289. }
  290. if ((cb != NULL) && (s->state != state)) {
  291. new_state = s->state;
  292. s->state = state;
  293. cb(s, SSL_CB_CONNECT_LOOP, 1);
  294. s->state = new_state;
  295. }
  296. }
  297. end:
  298. s->in_handshake--;
  299. if (buf != NULL)
  300. BUF_MEM_free(buf);
  301. if (cb != NULL)
  302. cb(s, SSL_CB_CONNECT_EXIT, ret);
  303. return (ret);
  304. }
  305. static int get_server_hello(SSL *s)
  306. {
  307. unsigned char *buf;
  308. unsigned char *p;
  309. int i, j;
  310. unsigned long len;
  311. STACK_OF(SSL_CIPHER) *sk = NULL, *cl, *prio, *allow;
  312. buf = (unsigned char *)s->init_buf->data;
  313. p = buf;
  314. if (s->state == SSL2_ST_GET_SERVER_HELLO_A) {
  315. i = ssl2_read(s, (char *)&(buf[s->init_num]), 11 - s->init_num);
  316. if (i < (11 - s->init_num))
  317. return (ssl2_part_read(s, SSL_F_GET_SERVER_HELLO, i));
  318. s->init_num = 11;
  319. if (*(p++) != SSL2_MT_SERVER_HELLO) {
  320. if (p[-1] != SSL2_MT_ERROR) {
  321. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  322. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_READ_WRONG_PACKET_TYPE);
  323. } else
  324. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_PEER_ERROR);
  325. return (-1);
  326. }
  327. # if 0
  328. s->hit = (*(p++)) ? 1 : 0;
  329. /*
  330. * Some [PPC?] compilers fail to increment p in above statement, e.g.
  331. * one provided with Rhapsody 5.5, but most recent example XL C 11.1
  332. * for AIX, even without optimization flag...
  333. */
  334. # else
  335. s->hit = (*p) ? 1 : 0;
  336. p++;
  337. # endif
  338. s->s2->tmp.cert_type = *(p++);
  339. n2s(p, i);
  340. if (i < s->version)
  341. s->version = i;
  342. n2s(p, i);
  343. s->s2->tmp.cert_length = i;
  344. n2s(p, i);
  345. s->s2->tmp.csl = i;
  346. n2s(p, i);
  347. s->s2->tmp.conn_id_length = i;
  348. s->state = SSL2_ST_GET_SERVER_HELLO_B;
  349. }
  350. /* SSL2_ST_GET_SERVER_HELLO_B */
  351. len =
  352. 11 + (unsigned long)s->s2->tmp.cert_length +
  353. (unsigned long)s->s2->tmp.csl +
  354. (unsigned long)s->s2->tmp.conn_id_length;
  355. if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) {
  356. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_MESSAGE_TOO_LONG);
  357. return -1;
  358. }
  359. j = (int)len - s->init_num;
  360. i = ssl2_read(s, (char *)&(buf[s->init_num]), j);
  361. if (i != j)
  362. return (ssl2_part_read(s, SSL_F_GET_SERVER_HELLO, i));
  363. if (s->msg_callback) {
  364. /* SERVER-HELLO */
  365. s->msg_callback(0, s->version, 0, buf, (size_t)len, s,
  366. s->msg_callback_arg);
  367. }
  368. /* things are looking good */
  369. p = buf + 11;
  370. if (s->hit) {
  371. if (s->s2->tmp.cert_length != 0) {
  372. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_REUSE_CERT_LENGTH_NOT_ZERO);
  373. return (-1);
  374. }
  375. if (s->s2->tmp.cert_type != 0) {
  376. if (!(s->options & SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG)) {
  377. SSLerr(SSL_F_GET_SERVER_HELLO,
  378. SSL_R_REUSE_CERT_TYPE_NOT_ZERO);
  379. return (-1);
  380. }
  381. }
  382. if (s->s2->tmp.csl != 0) {
  383. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_REUSE_CIPHER_LIST_NOT_ZERO);
  384. return (-1);
  385. }
  386. } else {
  387. # ifdef undef
  388. /* very bad */
  389. memset(s->session->session_id, 0,
  390. SSL_MAX_SSL_SESSION_ID_LENGTH_IN_BYTES);
  391. s->session->session_id_length = 0;
  392. */
  393. # endif
  394. /*
  395. * we need to do this in case we were trying to reuse a client
  396. * session but others are already reusing it. If this was a new
  397. * 'blank' session ID, the session-id length will still be 0
  398. */
  399. if (s->session->session_id_length > 0) {
  400. if (!ssl_get_new_session(s, 0)) {
  401. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  402. return (-1);
  403. }
  404. }
  405. if (ssl2_set_certificate(s, s->s2->tmp.cert_type,
  406. s->s2->tmp.cert_length, p) <= 0) {
  407. ssl2_return_error(s, SSL2_PE_BAD_CERTIFICATE);
  408. return (-1);
  409. }
  410. p += s->s2->tmp.cert_length;
  411. if (s->s2->tmp.csl == 0) {
  412. ssl2_return_error(s, SSL2_PE_NO_CIPHER);
  413. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_NO_CIPHER_LIST);
  414. return (-1);
  415. }
  416. /*
  417. * We have just received a list of ciphers back from the server. We
  418. * need to get the ones that match, then select the one we want the
  419. * most :-).
  420. */
  421. /* load the ciphers */
  422. sk = ssl_bytes_to_cipher_list(s, p, s->s2->tmp.csl,
  423. &s->session->ciphers);
  424. p += s->s2->tmp.csl;
  425. if (sk == NULL) {
  426. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  427. SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_MALLOC_FAILURE);
  428. return (-1);
  429. }
  430. (void)sk_SSL_CIPHER_set_cmp_func(sk, ssl_cipher_ptr_id_cmp);
  431. /* get the array of ciphers we will accept */
  432. cl = SSL_get_ciphers(s);
  433. (void)sk_SSL_CIPHER_set_cmp_func(cl, ssl_cipher_ptr_id_cmp);
  434. /*
  435. * If server preference flag set, choose the first
  436. * (highest priority) cipher the server sends, otherwise
  437. * client preference has priority.
  438. */
  439. if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
  440. prio = sk;
  441. allow = cl;
  442. } else {
  443. prio = cl;
  444. allow = sk;
  445. }
  446. /*
  447. * In theory we could have ciphers sent back that we don't want to
  448. * use but that does not matter since we will check against the list
  449. * we originally sent and for performance reasons we should not
  450. * bother to match the two lists up just to check.
  451. */
  452. for (i = 0; i < sk_SSL_CIPHER_num(prio); i++) {
  453. if (sk_SSL_CIPHER_find(allow, sk_SSL_CIPHER_value(prio, i)) >= 0)
  454. break;
  455. }
  456. if (i >= sk_SSL_CIPHER_num(prio)) {
  457. ssl2_return_error(s, SSL2_PE_NO_CIPHER);
  458. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_NO_CIPHER_MATCH);
  459. return (-1);
  460. }
  461. s->session->cipher = sk_SSL_CIPHER_value(prio, i);
  462. if (s->session->peer != NULL) { /* can't happen */
  463. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  464. SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
  465. return (-1);
  466. }
  467. s->session->peer = s->session->sess_cert->peer_key->x509;
  468. /* peer_key->x509 has been set by ssl2_set_certificate. */
  469. CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
  470. }
  471. if (s->session->sess_cert == NULL
  472. || s->session->peer != s->session->sess_cert->peer_key->x509)
  473. /* can't happen */
  474. {
  475. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  476. SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
  477. return (-1);
  478. }
  479. s->s2->conn_id_length = s->s2->tmp.conn_id_length;
  480. if (s->s2->conn_id_length > sizeof s->s2->conn_id) {
  481. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  482. SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_SSL2_CONNECTION_ID_TOO_LONG);
  483. return -1;
  484. }
  485. memcpy(s->s2->conn_id, p, s->s2->tmp.conn_id_length);
  486. return (1);
  487. }
  488. static int client_hello(SSL *s)
  489. {
  490. unsigned char *buf;
  491. unsigned char *p, *d;
  492. /* CIPHER **cipher;*/
  493. int i, n, j;
  494. buf = (unsigned char *)s->init_buf->data;
  495. if (s->state == SSL2_ST_SEND_CLIENT_HELLO_A) {
  496. if ((s->session == NULL) || (s->session->ssl_version != s->version)) {
  497. if (!ssl_get_new_session(s, 0)) {
  498. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  499. return (-1);
  500. }
  501. }
  502. /* else use the pre-loaded session */
  503. p = buf; /* header */
  504. d = p + 9; /* data section */
  505. *(p++) = SSL2_MT_CLIENT_HELLO; /* type */
  506. s2n(SSL2_VERSION, p); /* version */
  507. n = j = 0;
  508. n = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), d, 0);
  509. d += n;
  510. if (n == 0) {
  511. SSLerr(SSL_F_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE);
  512. return (-1);
  513. }
  514. s2n(n, p); /* cipher spec num bytes */
  515. if ((s->session->session_id_length > 0) &&
  516. (s->session->session_id_length <=
  517. SSL2_MAX_SSL_SESSION_ID_LENGTH)) {
  518. i = s->session->session_id_length;
  519. s2n(i, p); /* session id length */
  520. memcpy(d, s->session->session_id, (unsigned int)i);
  521. d += i;
  522. } else {
  523. s2n(0, p);
  524. }
  525. s->s2->challenge_length = SSL2_CHALLENGE_LENGTH;
  526. s2n(SSL2_CHALLENGE_LENGTH, p); /* challenge length */
  527. /*
  528. * challenge id data
  529. */
  530. if (RAND_pseudo_bytes(s->s2->challenge, SSL2_CHALLENGE_LENGTH) <= 0)
  531. return -1;
  532. memcpy(d, s->s2->challenge, SSL2_CHALLENGE_LENGTH);
  533. d += SSL2_CHALLENGE_LENGTH;
  534. s->state = SSL2_ST_SEND_CLIENT_HELLO_B;
  535. s->init_num = d - buf;
  536. s->init_off = 0;
  537. }
  538. /* SSL2_ST_SEND_CLIENT_HELLO_B */
  539. return (ssl2_do_write(s));
  540. }
  541. static int client_master_key(SSL *s)
  542. {
  543. unsigned char *buf;
  544. unsigned char *p, *d;
  545. int clear, enc, karg, i;
  546. SSL_SESSION *sess;
  547. const EVP_CIPHER *c;
  548. const EVP_MD *md;
  549. buf = (unsigned char *)s->init_buf->data;
  550. if (s->state == SSL2_ST_SEND_CLIENT_MASTER_KEY_A) {
  551. if (!ssl_cipher_get_evp(s->session, &c, &md, NULL, NULL, NULL)) {
  552. ssl2_return_error(s, SSL2_PE_NO_CIPHER);
  553. SSLerr(SSL_F_CLIENT_MASTER_KEY,
  554. SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
  555. return (-1);
  556. }
  557. sess = s->session;
  558. p = buf;
  559. d = p + 10;
  560. *(p++) = SSL2_MT_CLIENT_MASTER_KEY; /* type */
  561. i = ssl_put_cipher_by_char(s, sess->cipher, p);
  562. p += i;
  563. /* make key_arg data */
  564. i = EVP_CIPHER_iv_length(c);
  565. sess->key_arg_length = i;
  566. if (i > SSL_MAX_KEY_ARG_LENGTH) {
  567. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  568. SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
  569. return -1;
  570. }
  571. if (i > 0)
  572. if (RAND_pseudo_bytes(sess->key_arg, i) <= 0)
  573. return -1;
  574. /* make a master key */
  575. i = EVP_CIPHER_key_length(c);
  576. sess->master_key_length = i;
  577. if (i > 0) {
  578. if (i > (int)sizeof(sess->master_key)) {
  579. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  580. SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
  581. return -1;
  582. }
  583. if (RAND_bytes(sess->master_key, i) <= 0) {
  584. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  585. return (-1);
  586. }
  587. }
  588. if (sess->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC)
  589. enc = 8;
  590. else if (SSL_C_IS_EXPORT(sess->cipher))
  591. enc = 5;
  592. else
  593. enc = i;
  594. if ((int)i < enc) {
  595. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  596. SSLerr(SSL_F_CLIENT_MASTER_KEY, SSL_R_CIPHER_TABLE_SRC_ERROR);
  597. return (-1);
  598. }
  599. clear = i - enc;
  600. s2n(clear, p);
  601. memcpy(d, sess->master_key, (unsigned int)clear);
  602. d += clear;
  603. enc = ssl_rsa_public_encrypt(sess->sess_cert, enc,
  604. &(sess->master_key[clear]), d,
  605. (s->
  606. s2->ssl2_rollback) ? RSA_SSLV23_PADDING
  607. : RSA_PKCS1_PADDING);
  608. if (enc <= 0) {
  609. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  610. SSLerr(SSL_F_CLIENT_MASTER_KEY, SSL_R_PUBLIC_KEY_ENCRYPT_ERROR);
  611. return (-1);
  612. }
  613. # ifdef PKCS1_CHECK
  614. if (s->options & SSL_OP_PKCS1_CHECK_1)
  615. d[1]++;
  616. if (s->options & SSL_OP_PKCS1_CHECK_2)
  617. sess->master_key[clear]++;
  618. # endif
  619. s2n(enc, p);
  620. d += enc;
  621. karg = sess->key_arg_length;
  622. s2n(karg, p); /* key arg size */
  623. if (karg > (int)sizeof(sess->key_arg)) {
  624. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  625. SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
  626. return -1;
  627. }
  628. memcpy(d, sess->key_arg, (unsigned int)karg);
  629. d += karg;
  630. s->state = SSL2_ST_SEND_CLIENT_MASTER_KEY_B;
  631. s->init_num = d - buf;
  632. s->init_off = 0;
  633. }
  634. /* SSL2_ST_SEND_CLIENT_MASTER_KEY_B */
  635. return (ssl2_do_write(s));
  636. }
  637. static int client_finished(SSL *s)
  638. {
  639. unsigned char *p;
  640. if (s->state == SSL2_ST_SEND_CLIENT_FINISHED_A) {
  641. p = (unsigned char *)s->init_buf->data;
  642. *(p++) = SSL2_MT_CLIENT_FINISHED;
  643. if (s->s2->conn_id_length > sizeof s->s2->conn_id) {
  644. SSLerr(SSL_F_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR);
  645. return -1;
  646. }
  647. memcpy(p, s->s2->conn_id, (unsigned int)s->s2->conn_id_length);
  648. s->state = SSL2_ST_SEND_CLIENT_FINISHED_B;
  649. s->init_num = s->s2->conn_id_length + 1;
  650. s->init_off = 0;
  651. }
  652. return (ssl2_do_write(s));
  653. }
  654. /* read the data and then respond */
  655. static int client_certificate(SSL *s)
  656. {
  657. unsigned char *buf;
  658. unsigned char *p, *d;
  659. int i;
  660. unsigned int n;
  661. int cert_ch_len;
  662. unsigned char *cert_ch;
  663. buf = (unsigned char *)s->init_buf->data;
  664. /*
  665. * We have a cert associated with the SSL, so attach it to the session if
  666. * it does not have one
  667. */
  668. if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_A) {
  669. i = ssl2_read(s, (char *)&(buf[s->init_num]),
  670. SSL2_MAX_CERT_CHALLENGE_LENGTH + 2 - s->init_num);
  671. if (i < (SSL2_MIN_CERT_CHALLENGE_LENGTH + 2 - s->init_num))
  672. return (ssl2_part_read(s, SSL_F_CLIENT_CERTIFICATE, i));
  673. s->init_num += i;
  674. if (s->msg_callback) {
  675. /* REQUEST-CERTIFICATE */
  676. s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s,
  677. s->msg_callback_arg);
  678. }
  679. /* type=buf[0]; */
  680. /* type eq x509 */
  681. if (buf[1] != SSL2_AT_MD5_WITH_RSA_ENCRYPTION) {
  682. ssl2_return_error(s, SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE);
  683. SSLerr(SSL_F_CLIENT_CERTIFICATE, SSL_R_BAD_AUTHENTICATION_TYPE);
  684. return (-1);
  685. }
  686. if ((s->cert == NULL) ||
  687. (s->cert->key->x509 == NULL) ||
  688. (s->cert->key->privatekey == NULL)) {
  689. s->state = SSL2_ST_X509_GET_CLIENT_CERTIFICATE;
  690. } else
  691. s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
  692. }
  693. cert_ch = buf + 2;
  694. cert_ch_len = s->init_num - 2;
  695. if (s->state == SSL2_ST_X509_GET_CLIENT_CERTIFICATE) {
  696. X509 *x509 = NULL;
  697. EVP_PKEY *pkey = NULL;
  698. /*
  699. * If we get an error we need to ssl->rwstate=SSL_X509_LOOKUP;
  700. * return(error); We should then be retried when things are ok and we
  701. * can get a cert or not
  702. */
  703. i = 0;
  704. if (s->ctx->client_cert_cb != NULL) {
  705. i = s->ctx->client_cert_cb(s, &(x509), &(pkey));
  706. }
  707. if (i < 0) {
  708. s->rwstate = SSL_X509_LOOKUP;
  709. return (-1);
  710. }
  711. s->rwstate = SSL_NOTHING;
  712. if ((i == 1) && (pkey != NULL) && (x509 != NULL)) {
  713. s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
  714. if (!SSL_use_certificate(s, x509) || !SSL_use_PrivateKey(s, pkey)) {
  715. i = 0;
  716. }
  717. X509_free(x509);
  718. EVP_PKEY_free(pkey);
  719. } else if (i == 1) {
  720. if (x509 != NULL)
  721. X509_free(x509);
  722. if (pkey != NULL)
  723. EVP_PKEY_free(pkey);
  724. SSLerr(SSL_F_CLIENT_CERTIFICATE,
  725. SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
  726. i = 0;
  727. }
  728. if (i == 0) {
  729. /*
  730. * We have no client certificate to respond with so send the
  731. * correct error message back
  732. */
  733. s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_B;
  734. p = buf;
  735. *(p++) = SSL2_MT_ERROR;
  736. s2n(SSL2_PE_NO_CERTIFICATE, p);
  737. s->init_off = 0;
  738. s->init_num = 3;
  739. /* Write is done at the end */
  740. }
  741. }
  742. if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_B) {
  743. return (ssl2_do_write(s));
  744. }
  745. if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_C) {
  746. EVP_MD_CTX ctx;
  747. /*
  748. * ok, now we calculate the checksum do it first so we can reuse buf
  749. * :-)
  750. */
  751. p = buf;
  752. EVP_MD_CTX_init(&ctx);
  753. EVP_SignInit_ex(&ctx, s->ctx->rsa_md5, NULL);
  754. EVP_SignUpdate(&ctx, s->s2->key_material, s->s2->key_material_length);
  755. EVP_SignUpdate(&ctx, cert_ch, (unsigned int)cert_ch_len);
  756. i = i2d_X509(s->session->sess_cert->peer_key->x509, &p);
  757. /*
  758. * Don't update the signature if it fails - FIXME: probably should
  759. * handle this better
  760. */
  761. if (i > 0)
  762. EVP_SignUpdate(&ctx, buf, (unsigned int)i);
  763. p = buf;
  764. d = p + 6;
  765. *(p++) = SSL2_MT_CLIENT_CERTIFICATE;
  766. *(p++) = SSL2_CT_X509_CERTIFICATE;
  767. n = i2d_X509(s->cert->key->x509, &d);
  768. s2n(n, p);
  769. if (!EVP_SignFinal(&ctx, d, &n, s->cert->key->privatekey)) {
  770. /*
  771. * this is not good. If things have failed it means there so
  772. * something wrong with the key. We will continue with a 0 length
  773. * signature
  774. */
  775. }
  776. EVP_MD_CTX_cleanup(&ctx);
  777. s2n(n, p);
  778. d += n;
  779. s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_D;
  780. s->init_num = d - buf;
  781. s->init_off = 0;
  782. }
  783. /* if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_D) */
  784. return (ssl2_do_write(s));
  785. }
  786. static int get_server_verify(SSL *s)
  787. {
  788. unsigned char *p;
  789. int i, n, len;
  790. p = (unsigned char *)s->init_buf->data;
  791. if (s->state == SSL2_ST_GET_SERVER_VERIFY_A) {
  792. i = ssl2_read(s, (char *)&(p[s->init_num]), 1 - s->init_num);
  793. if (i < (1 - s->init_num))
  794. return (ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i));
  795. s->init_num += i;
  796. s->state = SSL2_ST_GET_SERVER_VERIFY_B;
  797. if (*p != SSL2_MT_SERVER_VERIFY) {
  798. if (p[0] != SSL2_MT_ERROR) {
  799. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  800. SSLerr(SSL_F_GET_SERVER_VERIFY, SSL_R_READ_WRONG_PACKET_TYPE);
  801. } else {
  802. SSLerr(SSL_F_GET_SERVER_VERIFY, SSL_R_PEER_ERROR);
  803. /* try to read the error message */
  804. i = ssl2_read(s, (char *)&(p[s->init_num]), 3 - s->init_num);
  805. return ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i);
  806. }
  807. return (-1);
  808. }
  809. }
  810. p = (unsigned char *)s->init_buf->data;
  811. len = 1 + s->s2->challenge_length;
  812. n = len - s->init_num;
  813. i = ssl2_read(s, (char *)&(p[s->init_num]), n);
  814. if (i < n)
  815. return (ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i));
  816. if (s->msg_callback) {
  817. /* SERVER-VERIFY */
  818. s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg);
  819. }
  820. p += 1;
  821. if (CRYPTO_memcmp(p, s->s2->challenge, s->s2->challenge_length) != 0) {
  822. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  823. SSLerr(SSL_F_GET_SERVER_VERIFY, SSL_R_CHALLENGE_IS_DIFFERENT);
  824. return (-1);
  825. }
  826. return (1);
  827. }
  828. static int get_server_finished(SSL *s)
  829. {
  830. unsigned char *buf;
  831. unsigned char *p;
  832. int i, n, len;
  833. buf = (unsigned char *)s->init_buf->data;
  834. p = buf;
  835. if (s->state == SSL2_ST_GET_SERVER_FINISHED_A) {
  836. i = ssl2_read(s, (char *)&(buf[s->init_num]), 1 - s->init_num);
  837. if (i < (1 - s->init_num))
  838. return (ssl2_part_read(s, SSL_F_GET_SERVER_FINISHED, i));
  839. s->init_num += i;
  840. if (*p == SSL2_MT_REQUEST_CERTIFICATE) {
  841. s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_A;
  842. return (1);
  843. } else if (*p != SSL2_MT_SERVER_FINISHED) {
  844. if (p[0] != SSL2_MT_ERROR) {
  845. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  846. SSLerr(SSL_F_GET_SERVER_FINISHED,
  847. SSL_R_READ_WRONG_PACKET_TYPE);
  848. } else {
  849. SSLerr(SSL_F_GET_SERVER_FINISHED, SSL_R_PEER_ERROR);
  850. /* try to read the error message */
  851. i = ssl2_read(s, (char *)&(p[s->init_num]), 3 - s->init_num);
  852. return ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i);
  853. }
  854. return (-1);
  855. }
  856. s->state = SSL2_ST_GET_SERVER_FINISHED_B;
  857. }
  858. len = 1 + SSL2_SSL_SESSION_ID_LENGTH;
  859. n = len - s->init_num;
  860. i = ssl2_read(s, (char *)&(buf[s->init_num]), n);
  861. if (i < n) {
  862. /*
  863. * XXX could be shorter than SSL2_SSL_SESSION_ID_LENGTH,
  864. * that's the maximum
  865. */
  866. return (ssl2_part_read(s, SSL_F_GET_SERVER_FINISHED, i));
  867. }
  868. s->init_num += i;
  869. if (s->msg_callback) {
  870. /* SERVER-FINISHED */
  871. s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s,
  872. s->msg_callback_arg);
  873. }
  874. if (!s->hit) { /* new session */
  875. /* new session-id */
  876. /*
  877. * Make sure we were not trying to re-use an old SSL_SESSION or bad
  878. * things can happen
  879. */
  880. /* ZZZZZZZZZZZZZ */
  881. s->session->session_id_length = SSL2_SSL_SESSION_ID_LENGTH;
  882. memcpy(s->session->session_id, p + 1, SSL2_SSL_SESSION_ID_LENGTH);
  883. } else {
  884. if (!(s->options & SSL_OP_MICROSOFT_SESS_ID_BUG)) {
  885. if ((s->session->session_id_length >
  886. sizeof s->session->session_id)
  887. || (0 !=
  888. memcmp(buf + 1, s->session->session_id,
  889. (unsigned int)s->session->session_id_length))) {
  890. ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
  891. SSLerr(SSL_F_GET_SERVER_FINISHED,
  892. SSL_R_SSL_SESSION_ID_IS_DIFFERENT);
  893. return (-1);
  894. }
  895. }
  896. }
  897. s->state = SSL_ST_OK;
  898. return (1);
  899. }
  900. /* loads in the certificate from the server */
  901. int ssl2_set_certificate(SSL *s, int type, int len, const unsigned char *data)
  902. {
  903. STACK_OF(X509) *sk = NULL;
  904. EVP_PKEY *pkey = NULL;
  905. SESS_CERT *sc = NULL;
  906. int i;
  907. X509 *x509 = NULL;
  908. int ret = 0;
  909. x509 = d2i_X509(NULL, &data, (long)len);
  910. if (x509 == NULL) {
  911. SSLerr(SSL_F_SSL2_SET_CERTIFICATE, ERR_R_X509_LIB);
  912. goto err;
  913. }
  914. if ((sk = sk_X509_new_null()) == NULL || !sk_X509_push(sk, x509)) {
  915. SSLerr(SSL_F_SSL2_SET_CERTIFICATE, ERR_R_MALLOC_FAILURE);
  916. goto err;
  917. }
  918. i = ssl_verify_cert_chain(s, sk);
  919. if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)) {
  920. SSLerr(SSL_F_SSL2_SET_CERTIFICATE, SSL_R_CERTIFICATE_VERIFY_FAILED);
  921. goto err;
  922. }
  923. ERR_clear_error(); /* but we keep s->verify_result */
  924. s->session->verify_result = s->verify_result;
  925. /* server's cert for this session */
  926. sc = ssl_sess_cert_new();
  927. if (sc == NULL) {
  928. ret = -1;
  929. goto err;
  930. }
  931. if (s->session->sess_cert)
  932. ssl_sess_cert_free(s->session->sess_cert);
  933. s->session->sess_cert = sc;
  934. sc->peer_pkeys[SSL_PKEY_RSA_ENC].x509 = x509;
  935. sc->peer_key = &(sc->peer_pkeys[SSL_PKEY_RSA_ENC]);
  936. pkey = X509_get_pubkey(x509);
  937. x509 = NULL;
  938. if (pkey == NULL) {
  939. SSLerr(SSL_F_SSL2_SET_CERTIFICATE,
  940. SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY);
  941. goto err;
  942. }
  943. if (pkey->type != EVP_PKEY_RSA) {
  944. SSLerr(SSL_F_SSL2_SET_CERTIFICATE, SSL_R_PUBLIC_KEY_NOT_RSA);
  945. goto err;
  946. }
  947. if (!ssl_set_peer_cert_type(sc, SSL2_CT_X509_CERTIFICATE))
  948. goto err;
  949. ret = 1;
  950. err:
  951. sk_X509_free(sk);
  952. X509_free(x509);
  953. EVP_PKEY_free(pkey);
  954. return (ret);
  955. }
  956. static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
  957. unsigned char *to, int padding)
  958. {
  959. EVP_PKEY *pkey = NULL;
  960. int i = -1;
  961. if ((sc == NULL) || (sc->peer_key->x509 == NULL) ||
  962. ((pkey = X509_get_pubkey(sc->peer_key->x509)) == NULL)) {
  963. SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT, SSL_R_NO_PUBLICKEY);
  964. return (-1);
  965. }
  966. if (pkey->type != EVP_PKEY_RSA) {
  967. SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT, SSL_R_PUBLIC_KEY_IS_NOT_RSA);
  968. goto end;
  969. }
  970. /* we have the public key */
  971. i = RSA_public_encrypt(len, from, to, pkey->pkey.rsa, padding);
  972. if (i < 0)
  973. SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT, ERR_R_RSA_LIB);
  974. end:
  975. EVP_PKEY_free(pkey);
  976. return (i);
  977. }
  978. #else /* !OPENSSL_NO_SSL2 */
  979. # if PEDANTIC
  980. static void *dummy = &dummy;
  981. # endif
  982. #endif