shim.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  1. /*
  2. * Copyright (C) 2014 Space Monkey, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. *
  16. */
  17. #include <string.h>
  18. #include <openssl/conf.h>
  19. #include <openssl/bio.h>
  20. #include <openssl/crypto.h>
  21. #include <openssl/engine.h>
  22. #include <openssl/err.h>
  23. #include <openssl/evp.h>
  24. #include <openssl/ssl.h>
  25. #include "_cgo_export.h"
  26. /*
  27. * Functions defined in other .c files
  28. */
  29. extern int go_init_locks();
  30. extern void go_thread_locking_callback(int, int, const char*, int);
  31. static int go_write_bio_puts(BIO *b, const char *str) {
  32. return go_write_bio_write(b, (char*)str, (int)strlen(str));
  33. }
  34. /*
  35. ************************************************
  36. * v1.1.X and later implementation
  37. ************************************************
  38. */
  39. #if OPENSSL_VERSION_NUMBER >= 0x1010000fL
  40. void X_BIO_set_data(BIO* bio, void* data) {
  41. BIO_set_data(bio, data);
  42. }
  43. void* X_BIO_get_data(BIO* bio) {
  44. return BIO_get_data(bio);
  45. }
  46. EVP_MD_CTX* X_EVP_MD_CTX_new() {
  47. return EVP_MD_CTX_new();
  48. }
  49. void X_EVP_MD_CTX_free(EVP_MD_CTX* ctx) {
  50. EVP_MD_CTX_free(ctx);
  51. }
  52. static int x_bio_create(BIO *b) {
  53. BIO_set_shutdown(b, 1);
  54. BIO_set_init(b, 1);
  55. BIO_set_data(b, NULL);
  56. BIO_clear_flags(b, ~0);
  57. return 1;
  58. }
  59. static int x_bio_free(BIO *b) {
  60. return 1;
  61. }
  62. static BIO_METHOD *writeBioMethod;
  63. static BIO_METHOD *readBioMethod;
  64. BIO_METHOD* BIO_s_readBio() { return readBioMethod; }
  65. BIO_METHOD* BIO_s_writeBio() { return writeBioMethod; }
  66. int x_bio_init_methods() {
  67. writeBioMethod = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "Go Write BIO");
  68. if (!writeBioMethod) {
  69. return 1;
  70. }
  71. if (1 != BIO_meth_set_write(writeBioMethod,
  72. (int (*)(BIO *, const char *, int))go_write_bio_write)) {
  73. return 2;
  74. }
  75. if (1 != BIO_meth_set_puts(writeBioMethod, go_write_bio_puts)) {
  76. return 3;
  77. }
  78. if (1 != BIO_meth_set_ctrl(writeBioMethod, go_write_bio_ctrl)) {
  79. return 4;
  80. }
  81. if (1 != BIO_meth_set_create(writeBioMethod, x_bio_create)) {
  82. return 5;
  83. }
  84. if (1 != BIO_meth_set_destroy(writeBioMethod, x_bio_free)) {
  85. return 6;
  86. }
  87. readBioMethod = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "Go Read BIO");
  88. if (!readBioMethod) {
  89. return 7;
  90. }
  91. if (1 != BIO_meth_set_read(readBioMethod, go_read_bio_read)) {
  92. return 8;
  93. }
  94. if (1 != BIO_meth_set_ctrl(readBioMethod, go_read_bio_ctrl)) {
  95. return 9;
  96. }
  97. if (1 != BIO_meth_set_create(readBioMethod, x_bio_create)) {
  98. return 10;
  99. }
  100. if (1 != BIO_meth_set_destroy(readBioMethod, x_bio_free)) {
  101. return 11;
  102. }
  103. return 0;
  104. }
  105. const EVP_MD *X_EVP_dss() {
  106. return NULL;
  107. }
  108. const EVP_MD *X_EVP_dss1() {
  109. return NULL;
  110. }
  111. const EVP_MD *X_EVP_sha() {
  112. return NULL;
  113. }
  114. int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx) {
  115. return EVP_CIPHER_CTX_encrypting(ctx);
  116. }
  117. int X_X509_add_ref(X509* x509) {
  118. return X509_up_ref(x509);
  119. }
  120. const ASN1_TIME *X_X509_get0_notBefore(const X509 *x) {
  121. return X509_get0_notBefore(x);
  122. }
  123. const ASN1_TIME *X_X509_get0_notAfter(const X509 *x) {
  124. return X509_get0_notAfter(x);
  125. }
  126. HMAC_CTX *X_HMAC_CTX_new(void) {
  127. return HMAC_CTX_new();
  128. }
  129. void X_HMAC_CTX_free(HMAC_CTX *ctx) {
  130. HMAC_CTX_free(ctx);
  131. }
  132. #endif
  133. /*
  134. ************************************************
  135. * v1.0.X implementation
  136. ************************************************
  137. */
  138. #if OPENSSL_VERSION_NUMBER < 0x1010000fL
  139. static int x_bio_create(BIO *b) {
  140. b->shutdown = 1;
  141. b->init = 1;
  142. b->num = -1;
  143. b->ptr = NULL;
  144. b->flags = 0;
  145. return 1;
  146. }
  147. static int x_bio_free(BIO *b) {
  148. return 1;
  149. }
  150. static BIO_METHOD writeBioMethod = {
  151. BIO_TYPE_SOURCE_SINK,
  152. "Go Write BIO",
  153. (int (*)(BIO *, const char *, int))go_write_bio_write,
  154. NULL,
  155. go_write_bio_puts,
  156. NULL,
  157. go_write_bio_ctrl,
  158. x_bio_create,
  159. x_bio_free,
  160. NULL};
  161. static BIO_METHOD* BIO_s_writeBio() { return &writeBioMethod; }
  162. static BIO_METHOD readBioMethod = {
  163. BIO_TYPE_SOURCE_SINK,
  164. "Go Read BIO",
  165. NULL,
  166. go_read_bio_read,
  167. NULL,
  168. NULL,
  169. go_read_bio_ctrl,
  170. x_bio_create,
  171. x_bio_free,
  172. NULL};
  173. static BIO_METHOD* BIO_s_readBio() { return &readBioMethod; }
  174. int x_bio_init_methods() {
  175. /* statically initialized above */
  176. return 0;
  177. }
  178. void X_BIO_set_data(BIO* bio, void* data) {
  179. bio->ptr = data;
  180. }
  181. void* X_BIO_get_data(BIO* bio) {
  182. return bio->ptr;
  183. }
  184. EVP_MD_CTX* X_EVP_MD_CTX_new() {
  185. return EVP_MD_CTX_create();
  186. }
  187. void X_EVP_MD_CTX_free(EVP_MD_CTX* ctx) {
  188. EVP_MD_CTX_destroy(ctx);
  189. }
  190. int X_X509_add_ref(X509* x509) {
  191. CRYPTO_add(&x509->references, 1, CRYPTO_LOCK_X509);
  192. return 1;
  193. }
  194. const ASN1_TIME *X_X509_get0_notBefore(const X509 *x) {
  195. return x->cert_info->validity->notBefore;
  196. }
  197. const ASN1_TIME *X_X509_get0_notAfter(const X509 *x) {
  198. return x->cert_info->validity->notAfter;
  199. }
  200. const EVP_MD *X_EVP_dss() {
  201. return EVP_dss();
  202. }
  203. const EVP_MD *X_EVP_dss1() {
  204. return EVP_dss1();
  205. }
  206. const EVP_MD *X_EVP_sha() {
  207. return EVP_sha();
  208. }
  209. int X_EVP_CIPHER_CTX_encrypting(const EVP_CIPHER_CTX *ctx) {
  210. return ctx->encrypt;
  211. }
  212. HMAC_CTX *X_HMAC_CTX_new(void) {
  213. /* v1.1.0 uses a OPENSSL_zalloc to allocate the memory which does not exist
  214. * in previous versions. malloc+memset to get the same behavior */
  215. HMAC_CTX *ctx = (HMAC_CTX *)OPENSSL_malloc(sizeof(HMAC_CTX));
  216. if (ctx) {
  217. memset(ctx, 0, sizeof(HMAC_CTX));
  218. HMAC_CTX_init(ctx);
  219. }
  220. return ctx;
  221. }
  222. void X_HMAC_CTX_free(HMAC_CTX *ctx) {
  223. if (ctx) {
  224. HMAC_CTX_cleanup(ctx);
  225. OPENSSL_free(ctx);
  226. }
  227. }
  228. #endif
  229. /*
  230. ************************************************
  231. * common implementation
  232. ************************************************
  233. */
  234. int X_shim_init() {
  235. int rc = 0;
  236. OPENSSL_config(NULL);
  237. ENGINE_load_builtin_engines();
  238. SSL_load_error_strings();
  239. SSL_library_init();
  240. OpenSSL_add_all_algorithms();
  241. //
  242. // Set up OPENSSL thread safety callbacks. We only set the locking
  243. // callback because the default id callback implementation is good
  244. // enough for us.
  245. rc = go_init_locks();
  246. if (rc != 0) {
  247. return rc;
  248. }
  249. CRYPTO_set_locking_callback(go_thread_locking_callback);
  250. rc = x_bio_init_methods();
  251. if (rc != 0) {
  252. return rc;
  253. }
  254. return 0;
  255. }
  256. void X_OPENSSL_free(void *ref) {
  257. OPENSSL_free(ref);
  258. }
  259. long X_SSL_set_options(SSL* ssl, long options) {
  260. return SSL_set_options(ssl, options);
  261. }
  262. long X_SSL_get_options(SSL* ssl) {
  263. return SSL_get_options(ssl);
  264. }
  265. long X_SSL_clear_options(SSL* ssl, long options) {
  266. return SSL_clear_options(ssl, options);
  267. }
  268. long X_SSL_set_tlsext_host_name(SSL *ssl, const char *name) {
  269. return SSL_set_tlsext_host_name(ssl, name);
  270. }
  271. const char * X_SSL_get_cipher_name(const SSL *ssl) {
  272. return SSL_get_cipher_name(ssl);
  273. }
  274. int X_SSL_session_reused(SSL *ssl) {
  275. return SSL_session_reused(ssl);
  276. }
  277. int X_SSL_new_index() {
  278. return SSL_get_ex_new_index(0, NULL, NULL, NULL, NULL);
  279. }
  280. int X_SSL_verify_cb(int ok, X509_STORE_CTX* store) {
  281. SSL* ssl = (SSL *)X509_STORE_CTX_get_ex_data(store,
  282. SSL_get_ex_data_X509_STORE_CTX_idx());
  283. void* p = SSL_get_ex_data(ssl, get_ssl_idx());
  284. // get the pointer to the go Ctx object and pass it back into the thunk
  285. return go_ssl_verify_cb_thunk(p, ok, store);
  286. }
  287. const SSL_METHOD *X_SSLv23_method() {
  288. return SSLv23_method();
  289. }
  290. const SSL_METHOD *X_SSLv3_method() {
  291. #ifndef OPENSSL_NO_SSL3_METHOD
  292. return SSLv3_method();
  293. #else
  294. return NULL;
  295. #endif
  296. }
  297. const SSL_METHOD *X_TLSv1_method() {
  298. return TLSv1_method();
  299. }
  300. const SSL_METHOD *X_TLSv1_1_method() {
  301. #if defined(TLS1_1_VERSION) && !defined(OPENSSL_SYSNAME_MACOSX)
  302. return TLSv1_1_method();
  303. #else
  304. return NULL;
  305. #endif
  306. }
  307. const SSL_METHOD *X_TLSv1_2_method() {
  308. #if defined(TLS1_2_VERSION) && !defined(OPENSSL_SYSNAME_MACOSX)
  309. return TLSv1_2_method();
  310. #else
  311. return NULL;
  312. #endif
  313. }
  314. int X_SSL_CTX_new_index() {
  315. return SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL);
  316. }
  317. long X_SSL_CTX_set_options(SSL_CTX* ctx, long options) {
  318. return SSL_CTX_set_options(ctx, options);
  319. }
  320. long X_SSL_CTX_clear_options(SSL_CTX* ctx, long options) {
  321. return SSL_CTX_clear_options(ctx, options);
  322. }
  323. long X_SSL_CTX_get_options(SSL_CTX* ctx) {
  324. return SSL_CTX_get_options(ctx);
  325. }
  326. long X_SSL_CTX_set_mode(SSL_CTX* ctx, long modes) {
  327. return SSL_CTX_set_mode(ctx, modes);
  328. }
  329. long X_SSL_CTX_get_mode(SSL_CTX* ctx) {
  330. return SSL_CTX_get_mode(ctx);
  331. }
  332. long X_SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long modes) {
  333. return SSL_CTX_set_session_cache_mode(ctx, modes);
  334. }
  335. long X_SSL_CTX_sess_set_cache_size(SSL_CTX* ctx, long t) {
  336. return SSL_CTX_sess_set_cache_size(ctx, t);
  337. }
  338. long X_SSL_CTX_sess_get_cache_size(SSL_CTX* ctx) {
  339. return SSL_CTX_sess_get_cache_size(ctx);
  340. }
  341. long X_SSL_CTX_set_timeout(SSL_CTX* ctx, long t) {
  342. return SSL_CTX_set_timeout(ctx, t);
  343. }
  344. long X_SSL_CTX_get_timeout(SSL_CTX* ctx) {
  345. return SSL_CTX_get_timeout(ctx);
  346. }
  347. long X_SSL_CTX_add_extra_chain_cert(SSL_CTX* ctx, X509 *cert) {
  348. return SSL_CTX_add_extra_chain_cert(ctx, cert);
  349. }
  350. long X_SSL_CTX_set_tmp_ecdh(SSL_CTX* ctx, EC_KEY *key) {
  351. return SSL_CTX_set_tmp_ecdh(ctx, key);
  352. }
  353. long X_SSL_CTX_set_tlsext_servername_callback(
  354. SSL_CTX* ctx, int (*cb)(SSL *con, int *ad, void *args)) {
  355. return SSL_CTX_set_tlsext_servername_callback(ctx, cb);
  356. }
  357. int X_SSL_CTX_verify_cb(int ok, X509_STORE_CTX* store) {
  358. SSL* ssl = (SSL *)X509_STORE_CTX_get_ex_data(store,
  359. SSL_get_ex_data_X509_STORE_CTX_idx());
  360. SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(ssl);
  361. void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx());
  362. // get the pointer to the go Ctx object and pass it back into the thunk
  363. return go_ssl_ctx_verify_cb_thunk(p, ok, store);
  364. }
  365. long X_SSL_CTX_set_tmp_dh(SSL_CTX* ctx, DH *dh) {
  366. return SSL_CTX_set_tmp_dh(ctx, dh);
  367. }
  368. long X_PEM_read_DHparams(SSL_CTX* ctx, DH *dh) {
  369. return SSL_CTX_set_tmp_dh(ctx, dh);
  370. }
  371. int X_SSL_CTX_set_tlsext_ticket_key_cb(SSL_CTX *sslctx,
  372. int (*cb)(SSL *s, unsigned char key_name[16],
  373. unsigned char iv[EVP_MAX_IV_LENGTH],
  374. EVP_CIPHER_CTX *ctx, HMAC_CTX *hctx, int enc)) {
  375. return SSL_CTX_set_tlsext_ticket_key_cb(sslctx, cb);
  376. }
  377. int X_SSL_CTX_ticket_key_cb(SSL *s, unsigned char key_name[16],
  378. unsigned char iv[EVP_MAX_IV_LENGTH],
  379. EVP_CIPHER_CTX *cctx, HMAC_CTX *hctx, int enc) {
  380. SSL_CTX* ssl_ctx = SSL_get_SSL_CTX(s);
  381. void* p = SSL_CTX_get_ex_data(ssl_ctx, get_ssl_ctx_idx());
  382. // get the pointer to the go Ctx object and pass it back into the thunk
  383. return go_ticket_key_cb_thunk(p, s, key_name, iv, cctx, hctx, enc);
  384. }
  385. int X_BIO_get_flags(BIO *b) {
  386. return BIO_get_flags(b);
  387. }
  388. void X_BIO_set_flags(BIO *b, int flags) {
  389. return BIO_set_flags(b, flags);
  390. }
  391. void X_BIO_clear_flags(BIO *b, int flags) {
  392. BIO_clear_flags(b, flags);
  393. }
  394. int X_BIO_read(BIO *b, void *buf, int len) {
  395. return BIO_read(b, buf, len);
  396. }
  397. int X_BIO_write(BIO *b, const void *buf, int len) {
  398. return BIO_write(b, buf, len);
  399. }
  400. BIO *X_BIO_new_write_bio() {
  401. return BIO_new(BIO_s_writeBio());
  402. }
  403. BIO *X_BIO_new_read_bio() {
  404. return BIO_new(BIO_s_readBio());
  405. }
  406. const EVP_MD *X_EVP_get_digestbyname(const char *name) {
  407. return EVP_get_digestbyname(name);
  408. }
  409. const EVP_MD *X_EVP_md_null() {
  410. return EVP_md_null();
  411. }
  412. const EVP_MD *X_EVP_md5() {
  413. return EVP_md5();
  414. }
  415. const EVP_MD *X_EVP_ripemd160() {
  416. return EVP_ripemd160();
  417. }
  418. const EVP_MD *X_EVP_sha224() {
  419. return EVP_sha224();
  420. }
  421. const EVP_MD *X_EVP_sha1() {
  422. return EVP_sha1();
  423. }
  424. const EVP_MD *X_EVP_sha256() {
  425. return EVP_sha256();
  426. }
  427. const EVP_MD *X_EVP_sha384() {
  428. return EVP_sha384();
  429. }
  430. const EVP_MD *X_EVP_sha512() {
  431. return EVP_sha512();
  432. }
  433. int X_EVP_MD_size(const EVP_MD *md) {
  434. return EVP_MD_size(md);
  435. }
  436. int X_EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl) {
  437. return EVP_DigestInit_ex(ctx, type, impl);
  438. }
  439. int X_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt) {
  440. return EVP_DigestUpdate(ctx, d, cnt);
  441. }
  442. int X_EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s) {
  443. return EVP_DigestFinal_ex(ctx, md, s);
  444. }
  445. int X_EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type) {
  446. return EVP_SignInit(ctx, type);
  447. }
  448. int X_EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt) {
  449. return EVP_SignUpdate(ctx, d, cnt);
  450. }
  451. EVP_PKEY *X_EVP_PKEY_new(void) {
  452. return EVP_PKEY_new();
  453. }
  454. void X_EVP_PKEY_free(EVP_PKEY *pkey) {
  455. EVP_PKEY_free(pkey);
  456. }
  457. int X_EVP_PKEY_size(EVP_PKEY *pkey) {
  458. return EVP_PKEY_size(pkey);
  459. }
  460. struct rsa_st *X_EVP_PKEY_get1_RSA(EVP_PKEY *pkey) {
  461. return EVP_PKEY_get1_RSA(pkey);
  462. }
  463. int X_EVP_PKEY_set1_RSA(EVP_PKEY *pkey, struct rsa_st *key) {
  464. return EVP_PKEY_set1_RSA(pkey, key);
  465. }
  466. int X_EVP_PKEY_assign_charp(EVP_PKEY *pkey, int type, char *key) {
  467. return EVP_PKEY_assign(pkey, type, key);
  468. }
  469. int X_EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s, EVP_PKEY *pkey) {
  470. return EVP_SignFinal(ctx, md, s, pkey);
  471. }
  472. int X_EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type) {
  473. return EVP_VerifyInit(ctx, type);
  474. }
  475. int X_EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d,
  476. unsigned int cnt) {
  477. return EVP_VerifyUpdate(ctx, d, cnt);
  478. }
  479. int X_EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, unsigned int siglen, EVP_PKEY *pkey) {
  480. return EVP_VerifyFinal(ctx, sigbuf, siglen, pkey);
  481. }
  482. int X_EVP_CIPHER_block_size(EVP_CIPHER *c) {
  483. return EVP_CIPHER_block_size(c);
  484. }
  485. int X_EVP_CIPHER_key_length(EVP_CIPHER *c) {
  486. return EVP_CIPHER_key_length(c);
  487. }
  488. int X_EVP_CIPHER_iv_length(EVP_CIPHER *c) {
  489. return EVP_CIPHER_iv_length(c);
  490. }
  491. int X_EVP_CIPHER_nid(EVP_CIPHER *c) {
  492. return EVP_CIPHER_nid(c);
  493. }
  494. int X_EVP_CIPHER_CTX_block_size(EVP_CIPHER_CTX *ctx) {
  495. return EVP_CIPHER_CTX_block_size(ctx);
  496. }
  497. int X_EVP_CIPHER_CTX_key_length(EVP_CIPHER_CTX *ctx) {
  498. return EVP_CIPHER_CTX_key_length(ctx);
  499. }
  500. int X_EVP_CIPHER_CTX_iv_length(EVP_CIPHER_CTX *ctx) {
  501. return EVP_CIPHER_CTX_iv_length(ctx);
  502. }
  503. const EVP_CIPHER *X_EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx) {
  504. return EVP_CIPHER_CTX_cipher(ctx);
  505. }
  506. size_t X_HMAC_size(const HMAC_CTX *e) {
  507. return HMAC_size(e);
  508. }
  509. int X_HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md, ENGINE *impl) {
  510. return HMAC_Init_ex(ctx, key, len, md, impl);
  511. }
  512. int X_HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len) {
  513. return HMAC_Update(ctx, data, len);
  514. }
  515. int X_HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) {
  516. return HMAC_Final(ctx, md, len);
  517. }
  518. int X_sk_X509_num(STACK_OF(X509) *sk) {
  519. return sk_X509_num(sk);
  520. }
  521. X509 *X_sk_X509_value(STACK_OF(X509)* sk, int i) {
  522. return sk_X509_value(sk, i);
  523. }