tls_select.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294
  1. /*
  2. * TLS module - select interface
  3. *
  4. * Copyright (C) 2005 iptelorg GmbH
  5. * Copyright (C) 2006 enum.at
  6. *
  7. * This file is part of Kamailio, a free SIP server.
  8. *
  9. * Kamailio is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version
  13. *
  14. * Kamailio is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Exception: permission to copy, modify, propagate, and distribute a work
  24. * formed by combining OpenSSL toolkit software and the code in this file,
  25. * such as linking with software components and libraries released under
  26. * OpenSSL project license.
  27. */
  28. /** Kamailio TLS support :: Select interface.
  29. * @file
  30. * @ingroup tls
  31. * Module: @ref tls
  32. */
  33. #include <openssl/ssl.h>
  34. #include <openssl/x509v3.h>
  35. #include "../../globals.h"
  36. #include "../../tcp_server.h"
  37. #include "../../tcp_conn.h"
  38. #include "../../ut.h"
  39. #include "../../cfg/cfg.h"
  40. #include "../../dprint.h"
  41. #include "tls_server.h"
  42. #include "tls_select.h"
  43. #include "tls_mod.h"
  44. #include "tls_init.h" /* features macros */
  45. #include "tls_cfg.h"
  46. enum {
  47. CERT_LOCAL = 1, /* Select local certificate */
  48. CERT_PEER, /* Select peer certificate */
  49. CERT_SUBJECT, /* Select subject part of certificate */
  50. CERT_ISSUER, /* Select issuer part of certificate */
  51. CERT_VERIFIED, /* Test for verified certificate */
  52. CERT_REVOKED, /* Test for revoked certificate */
  53. CERT_EXPIRED, /* Expiration certificate test */
  54. CERT_SELFSIGNED, /* self-signed certificate test */
  55. CERT_NOTBEFORE, /* Select validity end from certificate */
  56. CERT_NOTAFTER, /* Select validity start from certificate */
  57. COMP_CN, /* Common name */
  58. COMP_O, /* Organization name */
  59. COMP_OU, /* Organization unit */
  60. COMP_C, /* Country name */
  61. COMP_ST, /* State */
  62. COMP_L, /* Locality/town */
  63. COMP_HOST, /* hostname from subject/alternative */
  64. COMP_URI, /* URI from subject/alternative */
  65. COMP_E, /* Email address */
  66. COMP_IP, /* IP from subject/alternative */
  67. TLSEXT_SN /* Server name of the peer */
  68. };
  69. enum {
  70. PV_CERT_LOCAL = 1<<0, /* Select local certificate */
  71. PV_CERT_PEER = 1<<1, /* Select peer certificate */
  72. PV_CERT_SUBJECT = 1<<2, /* Select subject part of certificate */
  73. PV_CERT_ISSUER = 1<<3, /* Select issuer part of certificate */
  74. PV_CERT_VERIFIED = 1<<4, /* Test for verified certificate */
  75. PV_CERT_REVOKED = 1<<5, /* Test for revoked certificate */
  76. PV_CERT_EXPIRED = 1<<6, /* Expiration certificate test */
  77. PV_CERT_SELFSIGNED = 1<<7, /* self-signed certificate test */
  78. PV_CERT_NOTBEFORE = 1<<8, /* Select validity end from certificate */
  79. PV_CERT_NOTAFTER = 1<<9, /* Select validity start from certificate */
  80. PV_COMP_CN = 1<<10, /* Common name */
  81. PV_COMP_O = 1<<11, /* Organization name */
  82. PV_COMP_OU = 1<<12, /* Organization unit */
  83. PV_COMP_C = 1<<13, /* Country name */
  84. PV_COMP_ST = 1<<14, /* State */
  85. PV_COMP_L = 1<<15, /* Locality/town */
  86. PV_COMP_HOST = 1<<16, /* hostname from subject/alternative */
  87. PV_COMP_URI = 1<<17, /* URI from subject/alternative */
  88. PV_COMP_E = 1<<18, /* Email address */
  89. PV_COMP_IP = 1<<19, /* IP from subject/alternative */
  90. PV_TLSEXT_SNI = 1<<20, /* Peer's server name (TLS extension) */
  91. };
  92. static struct tcp_connection* _tls_pv_con = 0;
  93. void tls_set_pv_con(struct tcp_connection *c)
  94. {
  95. _tls_pv_con = c;
  96. }
  97. struct tcp_connection* get_cur_connection(struct sip_msg* msg)
  98. {
  99. struct tcp_connection* c;
  100. if(_tls_pv_con != 0)
  101. return _tls_pv_con;
  102. if (msg->rcv.proto != PROTO_TLS) {
  103. ERR("Transport protocol is not TLS (bug in config)\n");
  104. return 0;
  105. }
  106. c = tcpconn_get(msg->rcv.proto_reserved1, 0, 0, 0,
  107. cfg_get(tls, tls_cfg, con_lifetime));
  108. if (c && c->type != PROTO_TLS) {
  109. ERR("Connection found but is not TLS\n");
  110. tcpconn_put(c);
  111. return 0;
  112. }
  113. return c;
  114. }
  115. static SSL* get_ssl(struct tcp_connection* c)
  116. {
  117. struct tls_extra_data* extra;
  118. if (!c || !c->extra_data) {
  119. ERR("Unable to extract SSL data from TLS connection\n");
  120. return 0;
  121. }
  122. extra = (struct tls_extra_data*)c->extra_data;
  123. return extra->ssl;
  124. }
  125. static int get_cert(X509** cert, struct tcp_connection** c, struct sip_msg* msg, int my)
  126. {
  127. SSL* ssl;
  128. *cert = 0;
  129. *c = get_cur_connection(msg);
  130. if (!(*c)) {
  131. INFO("TLS connection not found\n");
  132. return -1;
  133. }
  134. ssl = get_ssl(*c);
  135. if (!ssl) goto err;
  136. *cert = my ? SSL_get_certificate(ssl) : SSL_get_peer_certificate(ssl);
  137. if (!*cert) {
  138. ERR("Unable to retrieve TLS certificate from SSL structure\n");
  139. goto err;
  140. }
  141. return 0;
  142. err:
  143. tcpconn_put(*c);
  144. return -1;
  145. }
  146. static int get_cipher(str* res, sip_msg_t* msg)
  147. {
  148. str cipher;
  149. static char buf[1024];
  150. struct tcp_connection* c;
  151. SSL* ssl;
  152. c = get_cur_connection(msg);
  153. if (!c) {
  154. INFO("TLS connection not found in select_cipher\n");
  155. goto err;
  156. }
  157. ssl = get_ssl(c);
  158. if (!ssl) goto err;
  159. cipher.s = (char*)SSL_CIPHER_get_name(SSL_get_current_cipher(ssl));
  160. cipher.len = cipher.s ? strlen(cipher.s) : 0;
  161. if (cipher.len >= 1024) {
  162. ERR("Cipher name too long\n");
  163. goto err;
  164. }
  165. memcpy(buf, cipher.s, cipher.len);
  166. res->s = buf;
  167. res->len = cipher.len;
  168. tcpconn_put(c);
  169. return 0;
  170. err:
  171. if (c) tcpconn_put(c);
  172. return -1;
  173. }
  174. static int sel_cipher(str* res, select_t* s, sip_msg_t* msg)
  175. {
  176. return get_cipher(res, msg);
  177. }
  178. static int pv_cipher(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  179. {
  180. if (get_cipher(&res->rs, msg) < 0) {
  181. return pv_get_null(msg, param, res);
  182. }
  183. res->flags = PV_VAL_STR;
  184. return 0;
  185. }
  186. static int get_bits(str* res, int* i, sip_msg_t* msg)
  187. {
  188. str bits;
  189. int b;
  190. static char buf[1024];
  191. struct tcp_connection* c;
  192. SSL* ssl;
  193. c = get_cur_connection(msg);
  194. if (!c) {
  195. INFO("TLS connection not found in select_bits\n");
  196. goto err;
  197. }
  198. ssl = get_ssl(c);
  199. if (!ssl) goto err;
  200. b = SSL_CIPHER_get_bits(SSL_get_current_cipher(ssl), 0);
  201. bits.s = int2str(b, &bits.len);
  202. if (bits.len >= 1024) {
  203. ERR("Bits string too long\n");
  204. goto err;
  205. }
  206. memcpy(buf, bits.s, bits.len);
  207. res->s = buf;
  208. res->len = bits.len;
  209. if (i) *i = b;
  210. tcpconn_put(c);
  211. return 0;
  212. err:
  213. if (c) tcpconn_put(c);
  214. return -1;
  215. }
  216. static int sel_bits(str* res, select_t* s, sip_msg_t* msg)
  217. {
  218. return get_bits(res, NULL, msg);
  219. }
  220. static int pv_bits(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  221. {
  222. if (get_bits(&res->rs, &res->ri, msg) < 0) {
  223. return pv_get_null(msg, param, res);
  224. }
  225. res->flags = PV_VAL_STR | PV_VAL_INT;
  226. return 0;
  227. }
  228. static int get_version(str* res, sip_msg_t* msg)
  229. {
  230. str version;
  231. static char buf[1024];
  232. struct tcp_connection* c;
  233. SSL* ssl;
  234. c = get_cur_connection(msg);
  235. if (!c) {
  236. INFO("TLS connection not found in select_version\n");
  237. goto err;
  238. }
  239. ssl = get_ssl(c);
  240. if (!ssl) goto err;
  241. version.s = (char*)SSL_get_version(ssl);
  242. version.len = version.s ? strlen(version.s) : 0;
  243. if (version.len >= 1024) {
  244. ERR("Version string too long\n");
  245. goto err;
  246. }
  247. memcpy(buf, version.s, version.len);
  248. res->s = buf;
  249. res->len = version.len;
  250. tcpconn_put(c);
  251. return 0;
  252. err:
  253. if (c) tcpconn_put(c);
  254. return -1;
  255. }
  256. static int sel_version(str* res, select_t* s, sip_msg_t* msg)
  257. {
  258. return get_version(res, msg);
  259. }
  260. static int pv_version(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  261. {
  262. if (get_version(&res->rs, msg) < 0) {
  263. return pv_get_null(msg, param, res);
  264. }
  265. res->flags = PV_VAL_STR;
  266. return 0;
  267. }
  268. static int get_desc(str* res, sip_msg_t* msg)
  269. {
  270. static char buf[128];
  271. struct tcp_connection* c;
  272. SSL* ssl;
  273. c = get_cur_connection(msg);
  274. if (!c) {
  275. INFO("TLS connection not found in select_desc\n");
  276. goto err;
  277. }
  278. ssl = get_ssl(c);
  279. if (!ssl) goto err;
  280. buf[0] = '\0';
  281. SSL_CIPHER_description(SSL_get_current_cipher(ssl), buf, 128);
  282. res->s = buf;
  283. res->len = strlen(buf);
  284. tcpconn_put(c);
  285. return 0;
  286. err:
  287. if (c) tcpconn_put(c);
  288. return -1;
  289. }
  290. static int sel_desc(str* res, select_t* s, sip_msg_t* msg)
  291. {
  292. return get_desc(res, msg);
  293. }
  294. static int pv_desc(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  295. {
  296. if (get_desc(&res->rs, msg) < 0) {
  297. return pv_get_null(msg, param, res);
  298. }
  299. res->flags = PV_VAL_STR;
  300. return 0;
  301. }
  302. static int get_cert_version(str* res, int local, sip_msg_t* msg)
  303. {
  304. static char buf[INT2STR_MAX_LEN];
  305. X509* cert;
  306. struct tcp_connection* c;
  307. char* version;
  308. if (get_cert(&cert, &c, msg, local) < 0) return -1;
  309. version = int2str(X509_get_version(cert), &res->len);
  310. memcpy(buf, version, res->len);
  311. res->s = buf;
  312. if (!local) X509_free(cert);
  313. tcpconn_put(c);
  314. return 0;
  315. }
  316. static int sel_cert_version(str* res, select_t* s, sip_msg_t* msg)
  317. {
  318. int local;
  319. switch(s->params[s->n - 2].v.i) {
  320. case CERT_PEER: local = 0; break;
  321. case CERT_LOCAL: local = 1; break;
  322. default:
  323. BUG("Bug in call to sel_cert_version\n");
  324. return -1;
  325. }
  326. return get_cert_version(res, local, msg);
  327. }
  328. static int pv_cert_version(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  329. {
  330. int local;
  331. if (param->pvn.u.isname.name.n & PV_CERT_PEER) {
  332. local = 0;
  333. } else if (param->pvn.u.isname.name.n & PV_CERT_LOCAL) {
  334. local = 1;
  335. } else {
  336. BUG("bug in call to pv_cert_version\n");
  337. return pv_get_null(msg, param, res);
  338. }
  339. if (get_cert_version(&res->rs, local, msg) < 0) {
  340. return pv_get_null(msg, param, res);
  341. }
  342. res->flags = PV_VAL_STR;
  343. return 0;
  344. }
  345. /*
  346. * Check whether peer certificate exists and verify the result
  347. * of certificate verification
  348. */
  349. static int check_cert(str* res, int* ires, int local, int err, sip_msg_t* msg)
  350. {
  351. static str succ = STR_STATIC_INIT("1");
  352. static str fail = STR_STATIC_INIT("0");
  353. struct tcp_connection* c;
  354. SSL* ssl;
  355. X509* cert = 0;
  356. c = get_cur_connection(msg);
  357. if (!c) return -1;
  358. ssl = get_ssl(c);
  359. if (!ssl) goto error;
  360. if (local) {
  361. DBG("Verification of local certificates not supported\n");
  362. goto error;
  363. } else {
  364. if ((cert = SSL_get_peer_certificate(ssl)) && SSL_get_verify_result(ssl) == err) {
  365. *res = succ;
  366. if (ires) *ires = 1;
  367. } else {
  368. *res = fail;
  369. if (ires) *ires = 0;
  370. }
  371. }
  372. if (cert) X509_free(cert);
  373. tcpconn_put(c);
  374. return 0;
  375. error:
  376. if (cert) X509_free(cert);
  377. if (c) tcpconn_put(c);
  378. return -1;
  379. }
  380. static int sel_check_cert(str* res, select_t* s, sip_msg_t* msg)
  381. {
  382. int local, err;
  383. switch(s->params[s->n - 2].v.i) {
  384. case CERT_PEER: local = 0; break;
  385. case CERT_LOCAL: local = 1; break;
  386. default:
  387. BUG("Bug in call to sel_cert_version\n");
  388. return -1;
  389. }
  390. switch (s->params[s->n - 1].v.i) {
  391. case CERT_VERIFIED: err = X509_V_OK; break;
  392. case CERT_REVOKED: err = X509_V_ERR_CERT_REVOKED; break;
  393. case CERT_EXPIRED: err = X509_V_ERR_CERT_HAS_EXPIRED; break;
  394. case CERT_SELFSIGNED: err = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; break;
  395. default:
  396. BUG("Unexpected parameter value \"%d\"\n", s->params[s->n - 1].v.i);
  397. return -1;
  398. }
  399. return check_cert(res, NULL, local, err, msg);
  400. }
  401. static int pv_check_cert(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  402. {
  403. int err;
  404. switch (param->pvn.u.isname.name.n) {
  405. case PV_CERT_VERIFIED: err = X509_V_OK; break;
  406. case PV_CERT_REVOKED: err = X509_V_ERR_CERT_REVOKED; break;
  407. case PV_CERT_EXPIRED: err = X509_V_ERR_CERT_HAS_EXPIRED; break;
  408. case PV_CERT_SELFSIGNED: err = X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; break;
  409. default:
  410. BUG("unexpected parameter value \"%d\"\n", param->pvn.u.isname.name.n);
  411. return pv_get_null(msg, param, res);
  412. }
  413. if (check_cert(&res->rs, &res->ri, 0, err, msg) < 0) {
  414. return pv_get_null(msg, param, res);
  415. }
  416. res->flags = PV_VAL_STR | PV_VAL_INT;
  417. return 0;
  418. }
  419. static int get_validity(str* res, int local, int bound, sip_msg_t* msg)
  420. {
  421. #define NOT_BEFORE 0
  422. #define NOT_AFTER 1
  423. static char buf[1024];
  424. X509* cert;
  425. struct tcp_connection* c;
  426. BUF_MEM* p;
  427. BIO* mem = 0;
  428. ASN1_TIME* date;
  429. if (get_cert(&cert, &c, msg, local) < 0) return -1;
  430. switch (bound) {
  431. case NOT_BEFORE: date = X509_get_notBefore(cert); break;
  432. case NOT_AFTER: date = X509_get_notAfter(cert); break;
  433. default:
  434. BUG("Unexpected parameter value \"%d\"\n", bound);
  435. goto err;
  436. }
  437. mem = BIO_new(BIO_s_mem());
  438. if (!mem) {
  439. ERR("Error while creating memory BIO\n");
  440. goto err;
  441. }
  442. if (!ASN1_TIME_print(mem, date)) {
  443. ERR("Error while printing certificate date/time\n");
  444. goto err;
  445. }
  446. BIO_get_mem_ptr(mem, &p);
  447. if (p->length >= 1024) {
  448. ERR("Date/time too long\n");
  449. goto err;
  450. }
  451. memcpy(buf, p->data, p->length);
  452. res->s = buf;
  453. res->len = p->length;
  454. BIO_free(mem);
  455. if (!local) X509_free(cert);
  456. tcpconn_put(c);
  457. return 0;
  458. err:
  459. if (mem) BIO_free(mem);
  460. if (!local) X509_free(cert);
  461. tcpconn_put(c);
  462. return -1;
  463. }
  464. static int sel_validity(str* res, select_t* s, sip_msg_t* msg)
  465. {
  466. int local, bound;
  467. switch(s->params[s->n - 2].v.i) {
  468. case CERT_PEER: local = 0; break;
  469. case CERT_LOCAL: local = 1; break;
  470. default:
  471. BUG("Could not determine certificate\n");
  472. return -1;
  473. }
  474. switch (s->params[s->n - 1].v.i) {
  475. case CERT_NOTBEFORE: bound = NOT_BEFORE; break;
  476. case CERT_NOTAFTER: bound = NOT_AFTER; break;
  477. default:
  478. BUG("Unexpected parameter value \"%d\"\n", s->params[s->n - 1].v.i);
  479. return -1;
  480. }
  481. return get_validity(res, local, bound, msg);
  482. }
  483. static int pv_validity(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  484. {
  485. int bound;
  486. switch (param->pvn.u.isname.name.n) {
  487. case PV_CERT_NOTBEFORE: bound = NOT_BEFORE; break;
  488. case PV_CERT_NOTAFTER: bound = NOT_AFTER; break;
  489. default:
  490. BUG("unexpected parameter value \"%d\"\n", param->pvn.u.isname.name.n);
  491. return pv_get_null(msg, param, res);
  492. }
  493. if (get_validity(&res->rs, 0, bound, msg) < 0) {
  494. return pv_get_null(msg, param, res);
  495. }
  496. res->flags = PV_VAL_STR;
  497. return 0;
  498. }
  499. static int get_sn(str* res, int* ires, int local, sip_msg_t* msg)
  500. {
  501. static char buf[INT2STR_MAX_LEN];
  502. X509* cert;
  503. struct tcp_connection* c;
  504. char* sn;
  505. int num;
  506. if (get_cert(&cert, &c, msg, local) < 0) return -1;
  507. num = ASN1_INTEGER_get(X509_get_serialNumber(cert));
  508. sn = int2str(num, &res->len);
  509. memcpy(buf, sn, res->len);
  510. res->s = buf;
  511. if (ires) *ires = num;
  512. if (!local) X509_free(cert);
  513. tcpconn_put(c);
  514. return 0;
  515. }
  516. static int sel_sn(str* res, select_t* s, sip_msg_t* msg)
  517. {
  518. int local;
  519. switch(s->params[s->n - 2].v.i) {
  520. case CERT_PEER: local = 0; break;
  521. case CERT_LOCAL: local = 1; break;
  522. default:
  523. BUG("Could not determine certificate\n");
  524. return -1;
  525. }
  526. return get_sn(res, NULL, local, msg);
  527. }
  528. static int pv_sn(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  529. {
  530. int local;
  531. if (param->pvn.u.isname.name.n & PV_CERT_PEER) {
  532. local = 0;
  533. } else if (param->pvn.u.isname.name.n & PV_CERT_LOCAL) {
  534. local = 1;
  535. } else {
  536. BUG("could not determine certificate\n");
  537. return pv_get_null(msg, param, res);
  538. }
  539. if (get_sn(&res->rs, &res->ri, local, msg) < 0) {
  540. return pv_get_null(msg, param, res);
  541. }
  542. res->flags = PV_VAL_STR | PV_VAL_INT;
  543. return 0;
  544. }
  545. static int get_comp(str* res, int local, int issuer, int nid, sip_msg_t* msg)
  546. {
  547. static char buf[1024];
  548. X509* cert;
  549. struct tcp_connection* c;
  550. X509_NAME* name;
  551. X509_NAME_ENTRY* e;
  552. ASN1_STRING* asn1;
  553. int index, text_len;
  554. char* elem;
  555. unsigned char* text_s;
  556. text_s = 0;
  557. if (get_cert(&cert, &c, msg, local) < 0) return -1;
  558. name = issuer ? X509_get_issuer_name(cert) : X509_get_subject_name(cert);
  559. if (!name) {
  560. ERR("Cannot extract subject or issuer name from peer certificate\n");
  561. goto err;
  562. }
  563. index = X509_NAME_get_index_by_NID(name, nid, -1);
  564. if (index == -1) {
  565. switch(nid) {
  566. case NID_commonName: elem = "CommonName"; break;
  567. case NID_organizationName: elem = "OrganizationName"; break;
  568. case NID_organizationalUnitName: elem = "OrganizationalUnitUname"; break;
  569. case NID_countryName: elem = "CountryName"; break;
  570. case NID_stateOrProvinceName: elem = "StateOrProvinceName"; break;
  571. case NID_localityName: elem = "LocalityName"; break;
  572. default: elem = "Unknown"; break;
  573. }
  574. DBG("Element %s not found in certificate subject/issuer\n", elem);
  575. goto err;
  576. }
  577. e = X509_NAME_get_entry(name, index);
  578. asn1 = X509_NAME_ENTRY_get_data(e);
  579. text_len = ASN1_STRING_to_UTF8(&text_s, asn1);
  580. if (text_len < 0 || text_len >= 1024) {
  581. ERR("Error converting ASN1 string\n");
  582. goto err;
  583. }
  584. memcpy(buf, text_s, text_len);
  585. res->s = buf;
  586. res->len = text_len;
  587. OPENSSL_free(text_s);
  588. if (!local) X509_free(cert);
  589. tcpconn_put(c);
  590. return 0;
  591. err:
  592. if (text_s) OPENSSL_free(text_s);
  593. if (!local) X509_free(cert);
  594. tcpconn_put(c);
  595. return -1;
  596. }
  597. static int sel_comp(str* res, select_t* s, sip_msg_t* msg)
  598. {
  599. int i, local = 0, issuer = 0;
  600. int nid = NID_commonName;
  601. for(i = 1; i <= s->n - 1; i++) {
  602. switch(s->params[i].v.i) {
  603. case CERT_LOCAL: local = 1; break;
  604. case CERT_PEER: local = 0; break;
  605. case CERT_SUBJECT: issuer = 0; break;
  606. case CERT_ISSUER: issuer = 1; break;
  607. case COMP_CN: nid = NID_commonName; break;
  608. case COMP_O: nid = NID_organizationName; break;
  609. case COMP_OU: nid = NID_organizationalUnitName; break;
  610. case COMP_C: nid = NID_countryName; break;
  611. case COMP_ST: nid = NID_stateOrProvinceName; break;
  612. case COMP_L: nid = NID_localityName; break;
  613. default:
  614. BUG("Bug in sel_comp: %d\n", s->params[s->n - 1].v.i);
  615. return -1;
  616. }
  617. }
  618. return get_comp(res, local, issuer, nid, msg);
  619. }
  620. static int pv_comp(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  621. {
  622. int ind_local, local = 0, issuer = 0, nid = NID_commonName;
  623. /* copy callback value as we modify it */
  624. ind_local = param->pvn.u.isname.name.n;
  625. DBG("ind_local = %x", ind_local);
  626. if (ind_local & PV_CERT_PEER) {
  627. local = 0;
  628. ind_local = ind_local ^ PV_CERT_PEER;
  629. } else if (ind_local & PV_CERT_LOCAL) {
  630. local = 1;
  631. ind_local = ind_local ^ PV_CERT_LOCAL;
  632. } else {
  633. BUG("could not determine certificate\n");
  634. return pv_get_null(msg, param, res);
  635. }
  636. if (ind_local & PV_CERT_SUBJECT) {
  637. issuer = 0;
  638. ind_local = ind_local ^ PV_CERT_SUBJECT;
  639. } else if (ind_local & PV_CERT_ISSUER) {
  640. issuer = 1;
  641. ind_local = ind_local ^ PV_CERT_ISSUER;
  642. } else {
  643. BUG("could not determine subject or issuer\n");
  644. return pv_get_null(msg, param, res);
  645. }
  646. switch(ind_local) {
  647. case PV_COMP_CN: nid = NID_commonName; break;
  648. case PV_COMP_O: nid = NID_organizationName; break;
  649. case PV_COMP_OU: nid = NID_organizationalUnitName; break;
  650. case PV_COMP_C: nid = NID_countryName; break;
  651. case PV_COMP_ST: nid = NID_stateOrProvinceName; break;
  652. case PV_COMP_L: nid = NID_localityName; break;
  653. default: nid = NID_undef;
  654. }
  655. if (get_comp(&res->rs, local, issuer, nid, msg) < 0) {
  656. return pv_get_null(msg, param, res);
  657. }
  658. res->flags = PV_VAL_STR;
  659. return 0;
  660. }
  661. static int get_alt(str* res, int local, int type, sip_msg_t* msg)
  662. {
  663. static char buf[1024];
  664. int n, found = 0;
  665. STACK_OF(GENERAL_NAME)* names = 0;
  666. GENERAL_NAME* nm;
  667. X509* cert;
  668. struct tcp_connection* c;
  669. str text;
  670. struct ip_addr ip;
  671. if (get_cert(&cert, &c, msg, local) < 0) return -1;
  672. names = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);
  673. if (!names) {
  674. DBG("Cannot get certificate alternative subject\n");
  675. goto err;
  676. }
  677. for (n = 0; n < sk_GENERAL_NAME_num(names); n++) {
  678. nm = sk_GENERAL_NAME_value(names, n);
  679. if (nm->type != type) continue;
  680. switch(type) {
  681. case GEN_EMAIL:
  682. case GEN_DNS:
  683. case GEN_URI:
  684. text.s = (char*)nm->d.ia5->data;
  685. text.len = nm->d.ia5->length;
  686. if (text.len >= 1024) {
  687. ERR("Alternative subject text too long\n");
  688. goto err;
  689. }
  690. memcpy(buf, text.s, text.len);
  691. res->s = buf;
  692. res->len = text.len;
  693. found = 1;
  694. break;
  695. case GEN_IPADD:
  696. ip.len = nm->d.iPAddress->length;
  697. ip.af = (ip.len == 16) ? AF_INET6 : AF_INET;
  698. memcpy(ip.u.addr, nm->d.iPAddress->data, ip.len);
  699. text.s = ip_addr2a(&ip);
  700. text.len = strlen(text.s);
  701. memcpy(buf, text.s, text.len);
  702. res->s = buf;
  703. res->len = text.len;
  704. found = 1;
  705. break;
  706. }
  707. break;
  708. }
  709. if (!found) goto err;
  710. if (names) sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
  711. if (!local) X509_free(cert);
  712. tcpconn_put(c);
  713. return 0;
  714. err:
  715. if (names) sk_GENERAL_NAME_pop_free(names, GENERAL_NAME_free);
  716. if (!local) X509_free(cert);
  717. tcpconn_put(c);
  718. return -1;
  719. }
  720. static int sel_alt(str* res, select_t* s, sip_msg_t* msg)
  721. {
  722. int type = GEN_URI, local = 0, i;
  723. for(i = 1; i <= s->n - 1; i++) {
  724. switch(s->params[i].v.i) {
  725. case CERT_LOCAL: local = 1; break;
  726. case CERT_PEER: local = 0; break;
  727. case COMP_E: type = GEN_EMAIL; break;
  728. case COMP_HOST: type = GEN_DNS; break;
  729. case COMP_URI: type = GEN_URI; break;
  730. case COMP_IP: type = GEN_IPADD; break;
  731. default:
  732. BUG("Bug in sel_alt: %d\n", s->params[s->n - 1].v.i);
  733. return -1;
  734. }
  735. }
  736. return get_alt(res, local, type, msg);
  737. }
  738. static int pv_alt(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  739. {
  740. int ind_local, local = 0, type = GEN_URI;
  741. ind_local = param->pvn.u.isname.name.n;
  742. if (ind_local & PV_CERT_PEER) {
  743. local = 0;
  744. ind_local = ind_local ^ PV_CERT_PEER;
  745. } else if (ind_local & PV_CERT_LOCAL) {
  746. local = 1;
  747. ind_local = ind_local ^ PV_CERT_LOCAL;
  748. } else {
  749. BUG("could not determine certificate\n");
  750. return pv_get_null(msg, param, res);
  751. }
  752. switch(ind_local) {
  753. case PV_COMP_E: type = GEN_EMAIL; break;
  754. case PV_COMP_HOST: type = GEN_DNS; break;
  755. case PV_COMP_URI: type = GEN_URI; break;
  756. case PV_COMP_IP: type = GEN_IPADD; break;
  757. default:
  758. BUG("ind_local=%d\n", ind_local);
  759. return pv_get_null(msg, param, res);
  760. }
  761. if (get_alt(&res->rs, local, type, msg) < 0) {
  762. return pv_get_null(msg, param, res);
  763. }
  764. res->flags = PV_VAL_STR;
  765. return 0;
  766. }
  767. static int sel_tls(str* res, select_t* s, struct sip_msg* msg)
  768. {
  769. return sel_desc(res, s, msg);
  770. }
  771. static int sel_name(str* res, select_t* s, struct sip_msg* msg)
  772. {
  773. return sel_comp(res, s, msg);
  774. }
  775. static int sel_cert(str* res, select_t* s, struct sip_msg* msg)
  776. {
  777. return sel_comp(res, s, msg);
  778. }
  779. #ifdef OPENSSL_NO_TLSEXT
  780. static int get_tlsext_sn(str* res, sip_msg_t* msg)
  781. {
  782. ERR("TLS extension 'server name' is not available! "
  783. "please install openssl with TLS extension support and recompile "
  784. "the server\n");
  785. return -1;
  786. }
  787. #else
  788. static int get_tlsext_sn(str* res, sip_msg_t* msg)
  789. {
  790. static char buf[1024];
  791. struct tcp_connection* c;
  792. str server_name;
  793. SSL* ssl;
  794. c = get_cur_connection(msg);
  795. if (!c) {
  796. INFO("TLS connection not found in select_desc\n");
  797. goto error;
  798. }
  799. ssl = get_ssl(c);
  800. if (!ssl) goto error;
  801. buf[0] = '\0';
  802. server_name.s = (char*)SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
  803. if (server_name.s) {
  804. server_name.len = strlen(server_name.s);
  805. DBG("received server_name (TLS extension): '%.*s'\n",
  806. STR_FMT(&server_name));
  807. } else {
  808. DBG("SSL_get_servername returned NULL\n");
  809. goto error;
  810. }
  811. /* copy server_name into the buffer. If the buffer is too small copy only
  812. * the last bytes as these are the more important ones and prefix with
  813. * '+' */
  814. if (server_name.len > sizeof(buf)) {
  815. ERR("server_name to big for buffer\n");
  816. buf[0] = '+';
  817. memcpy(buf + 1, server_name.s + 1 + server_name.len - sizeof(buf),
  818. sizeof(buf) - 1);
  819. res->len = sizeof(buf);
  820. } else {
  821. memcpy(buf, server_name.s, server_name.len);
  822. res->len = server_name.len;
  823. }
  824. res->s = buf;
  825. tcpconn_put(c);
  826. return 0;
  827. error:
  828. if (c) tcpconn_put(c);
  829. return -1;
  830. }
  831. #endif
  832. static int sel_tlsext_sn(str* res, select_t* s, sip_msg_t* msg)
  833. {
  834. return get_tlsext_sn(res, msg);
  835. }
  836. static int pv_tlsext_sn(sip_msg_t* msg, pv_param_t* param, pv_value_t* res)
  837. {
  838. if (param->pvn.u.isname.name.n != PV_TLSEXT_SNI) {
  839. BUG("unexpected parameter value \"%d\"\n",
  840. param->pvn.u.isname.name.n);
  841. return pv_get_null(msg, param, res);
  842. }
  843. if (get_tlsext_sn(&res->rs, msg) < 0) {
  844. return pv_get_null(msg, param, res);
  845. }
  846. res->flags = PV_VAL_STR;
  847. return 0;
  848. }
  849. select_row_t tls_sel[] = {
  850. /* Current cipher parameters */
  851. { NULL, SEL_PARAM_STR, STR_STATIC_INIT("tls"), sel_tls, 0},
  852. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("version"), sel_version, 0},
  853. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("desc"), sel_desc, 0},
  854. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("description"), sel_desc, 0},
  855. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("cipher"), sel_cipher, 0},
  856. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("serverName"), sel_tlsext_sn, 0},
  857. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("server_name"), sel_tlsext_sn, 0},
  858. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("peer"), sel_cert, DIVERSION | CERT_PEER},
  859. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("my"), sel_cert, DIVERSION | CERT_LOCAL},
  860. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("me"), sel_cert, DIVERSION | CERT_LOCAL},
  861. { sel_tls, SEL_PARAM_STR, STR_STATIC_INIT("myself"), sel_cert, DIVERSION | CERT_LOCAL},
  862. { sel_cipher, SEL_PARAM_STR, STR_STATIC_INIT("bits"), sel_bits, 0},
  863. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("subject"), sel_name, DIVERSION | CERT_SUBJECT},
  864. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("subj"), sel_name, DIVERSION | CERT_SUBJECT},
  865. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("issuer"), sel_name, DIVERSION | CERT_ISSUER},
  866. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("verified"), sel_check_cert, DIVERSION | CERT_VERIFIED},
  867. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("revoked"), sel_check_cert, DIVERSION | CERT_REVOKED},
  868. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("expired"), sel_check_cert, DIVERSION | CERT_EXPIRED},
  869. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("self_signed"), sel_check_cert, DIVERSION | CERT_SELFSIGNED},
  870. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("version"), sel_cert_version, 0},
  871. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("sn"), sel_sn, 0},
  872. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("serialNumber"), sel_sn, 0},
  873. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("serial_number"), sel_sn, 0},
  874. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("notBefore"), sel_validity, DIVERSION | CERT_NOTBEFORE},
  875. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("not_before"), sel_validity, DIVERSION | CERT_NOTBEFORE},
  876. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("notAfter"), sel_validity, DIVERSION | CERT_NOTAFTER},
  877. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("not_after"), sel_validity, DIVERSION | CERT_NOTAFTER},
  878. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("email"), sel_alt, DIVERSION | COMP_E},
  879. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("emailAddress"), sel_alt, DIVERSION | COMP_E},
  880. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("email_address"), sel_alt, DIVERSION | COMP_E},
  881. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("host"), sel_alt, DIVERSION | COMP_HOST},
  882. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("hostname"), sel_alt, DIVERSION | COMP_HOST},
  883. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("dns"), sel_alt, DIVERSION | COMP_HOST},
  884. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("uri"), sel_alt, DIVERSION | COMP_URI},
  885. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("url"), sel_alt, DIVERSION | COMP_URI},
  886. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("urn"), sel_alt, DIVERSION | COMP_URI},
  887. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("ip"), sel_alt, DIVERSION | COMP_IP},
  888. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("IPAddress"), sel_alt, DIVERSION | COMP_IP},
  889. { sel_cert, SEL_PARAM_STR, STR_STATIC_INIT("ip_address"), sel_alt, DIVERSION | COMP_IP},
  890. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("cn"), sel_comp, DIVERSION | COMP_CN},
  891. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("commonName"), sel_comp, DIVERSION | COMP_CN},
  892. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("common_name"), sel_comp, DIVERSION | COMP_CN},
  893. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("name"), sel_comp, DIVERSION | COMP_CN},
  894. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("l"), sel_comp, DIVERSION | COMP_L},
  895. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("localityName"), sel_comp, DIVERSION | COMP_L},
  896. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("locality_name"), sel_comp, DIVERSION | COMP_L},
  897. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("locality"), sel_comp, DIVERSION | COMP_L},
  898. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("c"), sel_comp, DIVERSION | COMP_C},
  899. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("countryName"), sel_comp, DIVERSION | COMP_C},
  900. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("country_name"), sel_comp, DIVERSION | COMP_C},
  901. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("country"), sel_comp, DIVERSION | COMP_C},
  902. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("st"), sel_comp, DIVERSION | COMP_ST},
  903. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("stateOrProvinceName"), sel_comp, DIVERSION | COMP_ST},
  904. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("state_or_province_name"), sel_comp, DIVERSION | COMP_ST},
  905. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("state"), sel_comp, DIVERSION | COMP_ST},
  906. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("o"), sel_comp, DIVERSION | COMP_O},
  907. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("organizationName"), sel_comp, DIVERSION | COMP_O},
  908. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("organization_name"), sel_comp, DIVERSION | COMP_O},
  909. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("organization"), sel_comp, DIVERSION | COMP_O},
  910. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("ou"), sel_comp, DIVERSION | COMP_OU},
  911. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("organizationalUnitName"), sel_comp, DIVERSION | COMP_OU},
  912. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("organizational_unit_name"), sel_comp, DIVERSION | COMP_OU},
  913. { sel_name, SEL_PARAM_STR, STR_STATIC_INIT("unit"), sel_comp, DIVERSION | COMP_OU},
  914. { NULL, SEL_PARAM_INT, STR_NULL, NULL, 0}
  915. };
  916. /*
  917. * pseudo variables
  918. */
  919. pv_export_t tls_pv[] = {
  920. /* TLS session parameters */
  921. {{"tls_version", sizeof("tls_version")-1},
  922. PVT_OTHER, pv_version, 0,
  923. 0, 0, 0, 0 },
  924. {{"tls_description", sizeof("tls_description")-1},
  925. PVT_OTHER, pv_desc, 0,
  926. 0, 0, 0, 0 },
  927. {{"tls_cipher_info", sizeof("tls_cipher_info")-1},
  928. PVT_OTHER, pv_cipher, 0,
  929. 0, 0, 0, 0 },
  930. {{"tls_cipher_bits", sizeof("tls_cipher_bits")-1},
  931. PVT_OTHER, pv_bits, 0,
  932. 0, 0, 0, 0 },
  933. /* general certificate parameters for peer and local */
  934. {{"tls_peer_version", sizeof("tls_peer_version")-1},
  935. PVT_OTHER, pv_cert_version, 0,
  936. 0, 0, pv_init_iname, PV_CERT_PEER },
  937. {{"tls_my_version", sizeof("tls_my_version")-1},
  938. PVT_OTHER, pv_cert_version, 0,
  939. 0, 0, pv_init_iname, PV_CERT_LOCAL },
  940. {{"tls_peer_serial", sizeof("tls_peer_serial")-1},
  941. PVT_OTHER, pv_sn, 0,
  942. 0, 0, pv_init_iname, PV_CERT_PEER },
  943. {{"tls_my_serial", sizeof("tls_my_serial")-1},
  944. PVT_OTHER, pv_sn,0,
  945. 0, 0, pv_init_iname, PV_CERT_LOCAL },
  946. /* certificate parameters for peer and local, for subject and issuer*/
  947. {{"tls_peer_subject", sizeof("tls_peer_subject")-1},
  948. PVT_OTHER, pv_comp, 0,
  949. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT },
  950. {{"tls_peer_issuer", sizeof("tls_peer_issuer")-1},
  951. PVT_OTHER, pv_comp, 0,
  952. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER },
  953. {{"tls_my_subject", sizeof("tls_my_subject")-1},
  954. PVT_OTHER, pv_comp, 0,
  955. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT },
  956. {{"tls_my_issuer", sizeof("tls_my_issuer")-1},
  957. PVT_OTHER, pv_comp, 0,
  958. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER },
  959. {{"tls_peer_subject_cn", sizeof("tls_peer_subject_cn")-1},
  960. PVT_OTHER, pv_comp, 0,
  961. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT | PV_COMP_CN },
  962. {{"tls_peer_issuer_cn", sizeof("tls_peer_issuer_cn")-1},
  963. PVT_OTHER, pv_comp, 0,
  964. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER | PV_COMP_CN },
  965. {{"tls_my_subject_cn", sizeof("tls_my_subject_cn")-1},
  966. PVT_OTHER, pv_comp, 0,
  967. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_CN },
  968. {{"tls_my_issuer_cn", sizeof("tls_my_issuer_cn")-1},
  969. PVT_OTHER, pv_comp, 0,
  970. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER | PV_COMP_CN },
  971. {{"tls_peer_subject_locality", sizeof("tls_peer_subject_locality")-1},
  972. PVT_OTHER, pv_comp, 0,
  973. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT | PV_COMP_L },
  974. {{"tls_peer_issuer_locality", sizeof("tls_peer_issuer_locality")-1},
  975. PVT_OTHER, pv_comp, 0,
  976. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER | PV_COMP_L },
  977. {{"tls_my_subject_locality", sizeof("tls_my_subject_locality")-1},
  978. PVT_OTHER, pv_comp, 0,
  979. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_L },
  980. {{"tls_my_issuer_locality", sizeof("tls_my_issuer_locality")-1},
  981. PVT_OTHER, pv_comp, 0,
  982. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER | PV_COMP_L },
  983. {{"tls_peer_subject_country", sizeof("tls_peer_subject_country")-1},
  984. PVT_OTHER, pv_comp, 0,
  985. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT | PV_COMP_C },
  986. {{"tls_peer_issuer_country", sizeof("tls_peer_issuer_country")-1},
  987. PVT_OTHER, pv_comp, 0,
  988. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER | PV_COMP_C },
  989. {{"tls_my_subject_country", sizeof("tls_my_subject_country")-1},
  990. PVT_OTHER, pv_comp, 0,
  991. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_C },
  992. {{"tls_my_issuer_country", sizeof("tls_my_issuer_country")-1},
  993. PVT_OTHER, pv_comp, 0,
  994. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER | PV_COMP_C },
  995. {{"tls_peer_subject_state", sizeof("tls_peer_subject_state")-1},
  996. PVT_OTHER, pv_comp, 0,
  997. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT | PV_COMP_ST },
  998. {{"tls_peer_issuer_state", sizeof("tls_peer_issuer_state")-1},
  999. PVT_OTHER, pv_comp, 0,
  1000. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER | PV_COMP_ST },
  1001. {{"tls_my_subject_state", sizeof("tls_my_subject_state")-1},
  1002. PVT_OTHER, pv_comp, 0,
  1003. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_ST },
  1004. {{"tls_my_issuer_state", sizeof("tls_my_issuer_state")-1},
  1005. PVT_OTHER, pv_comp, 0,
  1006. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER | PV_COMP_ST },
  1007. {{"tls_peer_subject_organization", sizeof("tls_peer_subject_organization")-1},
  1008. PVT_OTHER, pv_comp, 0,
  1009. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT | PV_COMP_O },
  1010. {{"tls_peer_issuer_organization", sizeof("tls_peer_issuer_organization")-1},
  1011. PVT_OTHER, pv_comp, 0,
  1012. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER | PV_COMP_O },
  1013. {{"tls_my_subject_organization", sizeof("tls_my_subject_organization")-1},
  1014. PVT_OTHER, pv_comp, 0,
  1015. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_O },
  1016. {{"tls_my_issuer_organization", sizeof("tls_my_issuer_organization")-1},
  1017. PVT_OTHER, pv_comp, 0,
  1018. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER | PV_COMP_O },
  1019. {{"tls_peer_subject_unit", sizeof("tls_peer_subject_unit")-1},
  1020. PVT_OTHER, pv_comp, 0,
  1021. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_SUBJECT | PV_COMP_OU },
  1022. {{"tls_peer_issuer_unit", sizeof("tls_peer_issuer_unit")-1},
  1023. PVT_OTHER, pv_comp, 0,
  1024. 0, 0, pv_init_iname, PV_CERT_PEER | PV_CERT_ISSUER | PV_COMP_OU },
  1025. {{"tls_my_subject_unit", sizeof("tls_my_subject_unit")-1},
  1026. PVT_OTHER, pv_comp, 0,
  1027. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_SUBJECT | PV_COMP_OU },
  1028. {{"tls_my_issuer_unit", sizeof("tls_my_issuer_unit")-1},
  1029. PVT_OTHER, pv_comp, 0,
  1030. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_CERT_ISSUER | PV_COMP_OU },
  1031. /* subject alternative name parameters for peer and local */
  1032. {{"tls_peer_san_email", sizeof("tls_peer_san_email")-1},
  1033. PVT_OTHER, pv_alt, 0,
  1034. 0, 0, pv_init_iname, PV_CERT_PEER | PV_COMP_E },
  1035. {{"tls_my_san_email", sizeof("tls_my_san_email")-1},
  1036. PVT_OTHER, pv_alt, 0,
  1037. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_COMP_E },
  1038. {{"tls_peer_san_hostname", sizeof("tls_peer_san_hostname")-1},
  1039. PVT_OTHER, pv_alt, 0,
  1040. 0, 0, pv_init_iname, PV_CERT_PEER | PV_COMP_HOST },
  1041. {{"tls_my_san_hostname", sizeof("tls_my_san_hostname")-1},
  1042. PVT_OTHER, pv_alt, 0,
  1043. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_COMP_HOST },
  1044. {{"tls_peer_san_uri", sizeof("tls_peer_san_uri")-1},
  1045. PVT_OTHER, pv_alt, 0,
  1046. 0, 0, pv_init_iname, PV_CERT_PEER | PV_COMP_URI },
  1047. {{"tls_my_san_uri", sizeof("tls_my_san_uri")-1},
  1048. PVT_OTHER, pv_alt, 0,
  1049. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_COMP_URI },
  1050. {{"tls_peer_san_ip", sizeof("tls_peer_san_ip")-1},
  1051. PVT_OTHER, pv_alt, 0,
  1052. 0, 0, pv_init_iname, PV_CERT_PEER | PV_COMP_IP },
  1053. {{"tls_my_san_ip", sizeof("tls_my_san_ip")-1},
  1054. PVT_OTHER, pv_alt, 0,
  1055. 0, 0, pv_init_iname, PV_CERT_LOCAL | PV_COMP_IP },
  1056. /* peer certificate validation parameters */
  1057. {{"tls_peer_verified", sizeof("tls_peer_verified")-1},
  1058. PVT_OTHER, pv_check_cert, 0,
  1059. 0, 0, pv_init_iname, PV_CERT_VERIFIED },
  1060. {{"tls_peer_revoked", sizeof("tls_peer_revoked")-1},
  1061. PVT_OTHER, pv_check_cert, 0,
  1062. 0, 0, pv_init_iname, PV_CERT_REVOKED },
  1063. {{"tls_peer_expired", sizeof("tls_peer_expired")-1},
  1064. PVT_OTHER, pv_check_cert, 0,
  1065. 0, 0, pv_init_iname, PV_CERT_EXPIRED },
  1066. {{"tls_peer_selfsigned", sizeof("tls_peer_selfsigned")-1},
  1067. PVT_OTHER, pv_check_cert, 0,
  1068. 0, 0, pv_init_iname, PV_CERT_SELFSIGNED },
  1069. {{"tls_peer_notBefore", sizeof("tls_peer_notBefore")-1},
  1070. PVT_OTHER, pv_validity, 0,
  1071. 0, 0, pv_init_iname, PV_CERT_NOTBEFORE },
  1072. {{"tls_peer_notAfter", sizeof("tls_peer_notAfter")-1},
  1073. PVT_OTHER, pv_validity, 0,
  1074. 0, 0, pv_init_iname, PV_CERT_NOTAFTER },
  1075. /* peer certificate validation parameters */
  1076. {{"tls_peer_server_name", sizeof("tls_peer_server_name")-1},
  1077. PVT_OTHER, pv_tlsext_sn, 0,
  1078. 0, 0, pv_init_iname, PV_TLSEXT_SNI },
  1079. { {0, 0}, 0, 0, 0, 0, 0, 0, 0 }
  1080. };