sq_axtls.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. #ifdef USE_AXTLS
  5. #include "squirrel.h"
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <stdlib.h> /* for malloc */
  9. #include <assert.h> /* for a few sanity tests */
  10. #include "os_port.h"
  11. #include "ssl.h"
  12. #include "crypto.h"
  13. static const SQChar SQ_LIBNAME[] = _SC("axtls");
  14. static const SQChar ssl_ctx_NAME[] = _SC("ssl_ctx");
  15. static const SQChar ssl_NAME[] = _SC("ssl");
  16. SQ_OPT_STRING_STRLEN();
  17. static const SQChar SSL_CTX_Tag[] = _SC("sq_axtls_ssl_ctx");
  18. #define GET_ssl_ctx_INSTANCE() SQ_GET_INSTANCE(v, 1, SSL_CTX, SSL_CTX_Tag) \
  19. if(self == NULL) return sq_throwerror(v, _SC("ssl_ctx object already closed"));
  20. static const SQChar SSL_Tag[] = _SC("sq_axtls_ssl");
  21. #define GET_ssl_INSTANCE() SQ_GET_INSTANCE(v, 1, SSL, SSL_Tag) \
  22. if(self == NULL) return sq_throwerror(v, _SC("ssl object already closed"));
  23. static SQRESULT ssl_release_hook(SQUserPointer p, SQInteger size, void *ep)
  24. {
  25. SSL *self = (SSL*)p;
  26. if(self) ssl_free(self);
  27. return 0;
  28. }
  29. static SQRESULT sq_ssl_free(HSQUIRRELVM v)
  30. {
  31. SQ_FUNC_VARS_NO_TOP(v);
  32. GET_ssl_INSTANCE();
  33. ssl_release_hook(self, 0, v);
  34. sq_setinstanceup(v, 1, 0);
  35. return 0;
  36. }
  37. static SQRESULT ssl_constructor(HSQUIRRELVM v, SSL *ssl, int free_on_gc)
  38. {
  39. if(!ssl)
  40. return sq_throwerror(v, _SC("Could'nt create an ssl object."));
  41. sq_pushstring(v, SQ_LIBNAME, -1);
  42. if(sq_getonroottable(v) == SQ_OK){
  43. sq_pushstring(v, ssl_NAME, -1);
  44. if(sq_get(v, -2) == SQ_OK){
  45. if(sq_createinstance(v, -1) == SQ_OK){
  46. sq_setinstanceup(v, -1, ssl);
  47. if(free_on_gc) sq_setreleasehook(v,-1, ssl_release_hook);
  48. return 1;
  49. }
  50. }
  51. }
  52. return SQ_ERROR;
  53. }
  54. static SQRESULT sq_ssl_read(HSQUIRRELVM v){
  55. SQ_FUNC_VARS(v);
  56. GET_ssl_INSTANCE();
  57. SQ_OPT_INTEGER(v, 2, count, 0);
  58. uint8_t *in_data = NULL;
  59. int result = ssl_read(self, &in_data, count);
  60. if (result > SSL_OK) sq_pushstring(v, (const SQChar*)in_data, result);
  61. else sq_pushinteger(v, result);
  62. return 1;
  63. }
  64. static SQRESULT sq_ssl_write(HSQUIRRELVM v){
  65. SQ_FUNC_VARS(v);
  66. GET_ssl_INSTANCE();
  67. SQ_GET_STRING(v, 2, out_data);
  68. if(_top_ > 2) {
  69. SQ_GET_INTEGER(v, 3, size);
  70. if(size > out_data_size) return sq_throwerror(v, _SC("parameter 2 size bigger than data size"));
  71. out_data_size = size;
  72. }
  73. sq_pushinteger(v, ssl_write(self, (const uint8_t *)out_data, out_data_size));
  74. return 1;
  75. }
  76. static SQRESULT sq_ssl_get_session_id(HSQUIRRELVM v){
  77. SQ_FUNC_VARS_NO_TOP(v);
  78. GET_ssl_INSTANCE();
  79. const uint8_t * result = ssl_get_session_id(self);
  80. sq_pushstring(v, (char *)result, ssl_get_session_id_size(self));
  81. return 1;
  82. }
  83. static SQRESULT sq_ssl_get_session_id_size(HSQUIRRELVM v){
  84. SQ_FUNC_VARS_NO_TOP(v);
  85. GET_ssl_INSTANCE();
  86. uint8_t result = ssl_get_session_id_size(self);
  87. sq_pushinteger(v, result);
  88. return 1;
  89. }
  90. static SQRESULT sq_ssl_get_cipher_id(HSQUIRRELVM v){
  91. SQ_FUNC_VARS_NO_TOP(v);
  92. GET_ssl_INSTANCE();
  93. uint8_t result = ssl_get_cipher_id(self);
  94. sq_pushinteger(v, result);
  95. return 1;
  96. }
  97. static SQRESULT sq_ssl_handshake_status(HSQUIRRELVM v){
  98. SQ_FUNC_VARS_NO_TOP(v);
  99. GET_ssl_INSTANCE();
  100. int result = ssl_handshake_status(self);
  101. sq_pushinteger(v, result);
  102. return 1;
  103. }
  104. static SQRESULT sq_ssl_verify_cert(HSQUIRRELVM v){
  105. SQ_FUNC_VARS_NO_TOP(v);
  106. GET_ssl_INSTANCE();
  107. int result = ssl_verify_cert(self);
  108. sq_pushinteger(v, result);
  109. return 1;
  110. }
  111. static SQRESULT sq_ssl_get_cert_dn(HSQUIRRELVM v){
  112. SQ_FUNC_VARS_NO_TOP(v);
  113. GET_ssl_INSTANCE();
  114. SQ_GET_INTEGER(v, 2, component);
  115. const char* result = ssl_get_cert_dn(self, component);
  116. sq_pushstring(v, result, -1);
  117. return 1;
  118. }
  119. static SQRESULT sq_ssl_get_cert_subject_alt_dnsname(HSQUIRRELVM v){
  120. SQ_FUNC_VARS_NO_TOP(v);
  121. GET_ssl_INSTANCE();
  122. SQ_GET_INTEGER(v, 2, dnsindex);
  123. const char* result = ssl_get_cert_subject_alt_dnsname(self, dnsindex);
  124. sq_pushstring(v, result, -1);
  125. return 1;
  126. }
  127. static SQRESULT sq_ssl_renegotiate(HSQUIRRELVM v){
  128. SQ_FUNC_VARS_NO_TOP(v);
  129. GET_ssl_INSTANCE();
  130. int result = ssl_renegotiate(self);
  131. sq_pushinteger(v, result);
  132. return 1;
  133. }
  134. static SQRESULT sq_ssl_ctx_server_new(HSQUIRRELVM v){
  135. SQ_FUNC_VARS_NO_TOP(v);
  136. GET_ssl_ctx_INSTANCE();
  137. SQ_GET_INTEGER(v, 2, client_fd);
  138. SSL *ssl = ssl_server_new(self, client_fd);
  139. SQRESULT rc = ssl_constructor(v, ssl, 1);
  140. if(rc == SQ_ERROR && ssl){
  141. ssl_free(ssl);
  142. }
  143. return rc;
  144. }
  145. static SQRESULT sq_ssl_ctx_client_new(HSQUIRRELVM v){
  146. SQ_FUNC_VARS(v);
  147. GET_ssl_ctx_INSTANCE();
  148. SQ_GET_INTEGER(v, 2, client_fd);
  149. SQ_OPT_STRING(v, 3, session_id, NULL);
  150. SQ_OPT_INTEGER(v, 4, size, -1);
  151. SSL *ssl = ssl_client_new(self, client_fd, (const uint8_t *)session_id,
  152. size >= 0 ? size : session_id_size, NULL);
  153. SQRESULT rc = ssl_constructor(v, ssl, 1);
  154. if(rc == SQ_ERROR && ssl){
  155. ssl_free(ssl);
  156. }
  157. return rc;
  158. }
  159. static SQRESULT sq_ssl_ctx_find(HSQUIRRELVM v){
  160. SQ_FUNC_VARS_NO_TOP(v);
  161. GET_ssl_ctx_INSTANCE();
  162. SQ_GET_INTEGER(v, 2, client_fd);
  163. SSL *ssl = ssl_find(self, client_fd);
  164. if(ssl) return ssl_constructor(v, ssl, 0);
  165. else sq_pushnull(v);
  166. return 1;
  167. }
  168. static SQRESULT sq_ssl_ctx_obj_load(HSQUIRRELVM v){
  169. SQ_FUNC_VARS_NO_TOP(v);
  170. GET_ssl_ctx_INSTANCE();
  171. SQ_GET_INTEGER(v, 2, obj_type);
  172. SQ_GET_STRING(v, 3, filename);
  173. SQ_GET_STRING(v, 4, password);
  174. int result = ssl_obj_load(self, obj_type, filename, password);
  175. sq_pushinteger(v, result);
  176. return 1;
  177. }
  178. static SQRESULT sq_ssl_ctx_obj_memory_load(HSQUIRRELVM v){
  179. SQ_FUNC_VARS_NO_TOP(v);
  180. GET_ssl_ctx_INSTANCE();
  181. SQ_GET_INTEGER(v, 2, obj_type);
  182. SQ_GET_STRING(v, 3, data);
  183. SQ_GET_STRING(v, 4, password);
  184. int result = ssl_obj_memory_load(self, obj_type, (const uint8_t *)data, data_size, password);
  185. sq_pushinteger(v, result);
  186. return 1;
  187. }
  188. static SQRESULT sq_axtls_version(HSQUIRRELVM v){
  189. sq_pushstring(v,(const char*)ssl_version(), -1);
  190. return 1;
  191. }
  192. static SQRESULT sq_axtls_get_config(HSQUIRRELVM v){
  193. SQ_FUNC_VARS_NO_TOP(v);
  194. SQ_GET_INTEGER(v, 2, info);
  195. sq_pushinteger(v, ssl_get_config(info));
  196. return 1;
  197. }
  198. static SQRESULT sq_axtls_display_error(HSQUIRRELVM v){
  199. SQ_FUNC_VARS_NO_TOP(v);
  200. SQ_GET_INTEGER(v, 2, error);
  201. ssl_display_error(error);
  202. return 0;
  203. }
  204. static SQRESULT sq_axtls_get_error(HSQUIRRELVM v){
  205. SQ_FUNC_VARS_NO_TOP(v);
  206. SQ_GET_INTEGER(v, 2, error);
  207. SQInteger buff_size = 250;
  208. SQChar *buff = sq_getscratchpad(v, buff_size);
  209. sq_pushstring(v, ssl_get_error(error, buff, buff_size), -1);
  210. return 1;
  211. }
  212. static SQRESULT ssl_ctx_release_hook(SQUserPointer p, SQInteger size, void *ep)
  213. {
  214. SSL_CTX *self = (SSL_CTX*)p;
  215. if(self) ssl_ctx_free(self);
  216. return 0;
  217. }
  218. static SQRESULT sq_ssl_ctx_free(HSQUIRRELVM v)
  219. {
  220. SQ_FUNC_VARS_NO_TOP(v);
  221. GET_ssl_ctx_INSTANCE();
  222. ssl_ctx_release_hook(self, 0, v);
  223. sq_setinstanceup(v, 1, 0);
  224. return 0;
  225. }
  226. static SQRESULT sq_ssl_ctx_constructor(HSQUIRRELVM v)
  227. {
  228. SQInteger options, num_sessions;
  229. sq_getinteger(v, 2, &options);
  230. sq_getinteger(v, 3, &num_sessions);
  231. SSL_CTX *ssl_ctx = ssl_ctx_new(options, num_sessions);
  232. if(!ssl_ctx)
  233. return sq_throwerror(v, _SC("Could'nt create an ssl context."));
  234. sq_setinstanceup(v, 1, ssl_ctx);
  235. sq_setreleasehook(v,1, ssl_ctx_release_hook);
  236. return 1;
  237. }
  238. // Stringify binary data. Output buffer must be twice as big as input,
  239. // because each byte takes 2 bytes in string representation
  240. void sq_axtls_bin2str(char *to, const unsigned char *p, size_t len) {
  241. static const char *hex = "0123456789abcdef";
  242. for (; len--; p++) {
  243. *to++ = hex[p[0] >> 4];
  244. *to++ = hex[p[0] & 0x0f];
  245. }
  246. *to = '\0';
  247. }
  248. static SQRESULT sq_axtls_md5(HSQUIRRELVM v)
  249. {
  250. SQ_FUNC_VARS(v);
  251. char buf[(MD5_SIZE*2)+1];
  252. unsigned char hash[MD5_SIZE];
  253. MD5_CTX ctx;
  254. MD5_Init(&ctx);
  255. for (int i = 2; i <= _top_; ++i) {
  256. SQ_GET_STRING(v, i, p);
  257. MD5_Update(&ctx, (const unsigned char *) p, p_size);
  258. }
  259. MD5_Final(hash, &ctx);
  260. sq_axtls_bin2str(buf, hash, sizeof(hash));
  261. sq_pushstring(v, buf, -1);
  262. return 1;
  263. }
  264. static SQRESULT sq_axtls_sha1(HSQUIRRELVM v)
  265. {
  266. SQ_FUNC_VARS(v);
  267. char buf[(SHA1_SIZE*2)+1];
  268. unsigned char hash[SHA1_SIZE];
  269. SHA1_CTX ctx;
  270. SHA1_Init(&ctx);
  271. for (int i = 2; i <= _top_; ++i) {
  272. SQ_GET_STRING(v, i, p);
  273. SHA1_Update(&ctx, (const unsigned char *) p, p_size);
  274. }
  275. SHA1_Final(hash, &ctx);
  276. sq_axtls_bin2str(buf, hash, sizeof(hash));
  277. sq_pushstring(v, buf, -1);
  278. return 1;
  279. }
  280. static SQRESULT sq_axtls_sha256(HSQUIRRELVM v)
  281. {
  282. SQ_FUNC_VARS(v);
  283. char buf[(SHA256_SIZE*2)+1];
  284. unsigned char hash[SHA256_SIZE];
  285. SHA256_CTX ctx;
  286. SHA256_Init(&ctx);
  287. for (int i = 2; i <= _top_; ++i) {
  288. SQ_GET_STRING(v, i, p);
  289. SHA256_Update(&ctx, (const unsigned char *) p, p_size);
  290. }
  291. SHA256_Final(hash, &ctx);
  292. sq_axtls_bin2str(buf, hash, sizeof(hash));
  293. sq_pushstring(v, buf, -1);
  294. return 1;
  295. }
  296. static SQRESULT sq_axtls_rng_initialize(HSQUIRRELVM v)
  297. {
  298. RNG_initialize();
  299. return 0;
  300. }
  301. static SQRESULT sq_axtls_rng_terminate(HSQUIRRELVM v)
  302. {
  303. RNG_terminate();
  304. return 0;
  305. }
  306. typedef int (*get_random_fptr_t)(int, uint8_t*);
  307. static SQRESULT sq_axtls_get_random0(HSQUIRRELVM v, get_random_fptr_t grf)
  308. {
  309. SQ_FUNC_VARS_NO_TOP(v);
  310. SQ_GET_INTEGER(v, 2, length);
  311. if(length < 1) return sq_throwerror(v, _SC("Minimun length error " _PRINT_INT_FMT), length);
  312. if(!RNG_is_initialized()) return sq_throwerror(v, _SC("Need to call rng_initialize first"));
  313. SQChar *buff = sq_getscratchpad(v, length);
  314. (*grf)(length, buff);
  315. sq_pushstring(v, buff, length);
  316. return 1;
  317. }
  318. static SQRESULT sq_axtls_get_random(HSQUIRRELVM v)
  319. {
  320. return sq_axtls_get_random0(v, get_random);
  321. }
  322. static SQRESULT sq_axtls_get_random_nz(HSQUIRRELVM v)
  323. {
  324. return sq_axtls_get_random0(v, get_random_NZ);
  325. }
  326. #define _DECL_AXTLS_FUNC(name,nparams,pmask) {_SC(#name),sq_axtls_##name,nparams,pmask}
  327. static SQRegFunction axtls_obj_funcs[]={
  328. _DECL_AXTLS_FUNC(get_config,2,_SC(".i")),
  329. _DECL_AXTLS_FUNC(display_error,2,_SC(".i")),
  330. _DECL_AXTLS_FUNC(get_error,2,_SC(".i")),
  331. _DECL_AXTLS_FUNC(version,1,_SC(".")),
  332. _DECL_AXTLS_FUNC(md5,-2,_SC(".s")),
  333. _DECL_AXTLS_FUNC(sha1,-2,_SC(".s")),
  334. _DECL_AXTLS_FUNC(sha256,-2,_SC(".s")),
  335. _DECL_AXTLS_FUNC(rng_initialize,1,_SC(".")),
  336. _DECL_AXTLS_FUNC(rng_terminate,1,_SC(".")),
  337. _DECL_AXTLS_FUNC(get_random,2,_SC(".i")),
  338. _DECL_AXTLS_FUNC(get_random_nz,2,_SC(".i")),
  339. {0,0}
  340. };
  341. #undef _DECL_AXTLS_FUNC
  342. #define _DECL_SSL_CTX_FUNC(name,nparams,pmask) {_SC(#name),sq_ssl_ctx_##name,nparams,pmask}
  343. static SQRegFunction ssl_ctx_obj_funcs[]={
  344. _DECL_SSL_CTX_FUNC(constructor,3,_SC("xii")),
  345. _DECL_SSL_CTX_FUNC(free,1,_SC("x")),
  346. _DECL_SSL_CTX_FUNC(server_new,2,_SC("xi")),
  347. _DECL_SSL_CTX_FUNC(client_new,-2,_SC("xisi")),
  348. _DECL_SSL_CTX_FUNC(find,2,_SC("xs")),
  349. _DECL_SSL_CTX_FUNC(obj_load,2,_SC("xs")),
  350. _DECL_SSL_CTX_FUNC(obj_memory_load,2,_SC("xs")),
  351. {0,0}
  352. };
  353. #undef _DECL_SSL_CTX_FUNC
  354. #define _DECL_SSL_FUNC(name,nparams,pmask) {_SC(#name),sq_ssl_##name,nparams,pmask}
  355. static SQRegFunction ssl_obj_funcs[]={
  356. _DECL_SSL_FUNC(free,1,_SC("x")),
  357. _DECL_SSL_FUNC(read,-1,_SC("xi")),
  358. _DECL_SSL_FUNC(write,-2,_SC("xsi")),
  359. _DECL_SSL_FUNC(get_session_id,1,_SC("x")),
  360. _DECL_SSL_FUNC(get_session_id_size,1,_SC("x")),
  361. _DECL_SSL_FUNC(get_cipher_id,1,_SC("x")),
  362. _DECL_SSL_FUNC(handshake_status,1,_SC("x")),
  363. _DECL_SSL_FUNC(verify_cert,1,_SC("x")),
  364. _DECL_SSL_FUNC(get_cert_dn,2,_SC("xi")),
  365. _DECL_SSL_FUNC(get_cert_subject_alt_dnsname,2,_SC("xi")),
  366. _DECL_SSL_FUNC(renegotiate,1,_SC("x")),
  367. {0,0}
  368. };
  369. #undef _DECL_SSL_FUNC
  370. typedef struct {
  371. const SQChar *Str;
  372. SQInteger Val;
  373. } KeyIntType, * KeyIntPtrType;
  374. static KeyIntType axtls_constants[] = {
  375. #define MK_CONST(c) {_SC(#c), c}
  376. MK_CONST(SSL_SESSION_ID_SIZE),
  377. MK_CONST(SSL_CLIENT_AUTHENTICATION),
  378. MK_CONST(SSL_SERVER_VERIFY_LATER),
  379. MK_CONST(SSL_NO_DEFAULT_KEY),
  380. MK_CONST(SSL_DISPLAY_STATES),
  381. MK_CONST(SSL_DISPLAY_BYTES),
  382. MK_CONST(SSL_DISPLAY_CERTS),
  383. MK_CONST(SSL_DISPLAY_RSA),
  384. MK_CONST(SSL_CONNECT_IN_PARTS),
  385. MK_CONST(SSL_OK),
  386. MK_CONST(SSL_NOT_OK),
  387. MK_CONST(SSL_ERROR_DEAD),
  388. MK_CONST(SSL_CLOSE_NOTIFY),
  389. MK_CONST(SSL_ERROR_CONN_LOST),
  390. MK_CONST(SSL_ERROR_SOCK_SETUP_FAILURE),
  391. MK_CONST(SSL_ERROR_INVALID_HANDSHAKE),
  392. MK_CONST(SSL_ERROR_INVALID_PROT_MSG),
  393. MK_CONST(SSL_ERROR_INVALID_HMAC),
  394. MK_CONST(SSL_ERROR_INVALID_VERSION),
  395. MK_CONST(SSL_ERROR_INVALID_SESSION),
  396. MK_CONST(SSL_ERROR_NO_CIPHER),
  397. MK_CONST(SSL_ERROR_BAD_CERTIFICATE),
  398. MK_CONST(SSL_ERROR_INVALID_KEY),
  399. MK_CONST(SSL_ERROR_FINISHED_INVALID),
  400. MK_CONST(SSL_ERROR_NO_CERT_DEFINED),
  401. MK_CONST(SSL_ERROR_NO_CLIENT_RENOG),
  402. MK_CONST(SSL_ERROR_NOT_SUPPORTED),
  403. MK_CONST(SSL_X509_OFFSET),
  404. MK_CONST(SSL_ALERT_TYPE_WARNING),
  405. MK_CONST(SLL_ALERT_TYPE_FATAL),
  406. MK_CONST(SSL_ALERT_CLOSE_NOTIFY),
  407. MK_CONST(SSL_ALERT_UNEXPECTED_MESSAGE),
  408. MK_CONST(SSL_ALERT_BAD_RECORD_MAC),
  409. MK_CONST(SSL_ALERT_HANDSHAKE_FAILURE),
  410. MK_CONST(SSL_ALERT_BAD_CERTIFICATE),
  411. MK_CONST(SSL_ALERT_ILLEGAL_PARAMETER),
  412. MK_CONST(SSL_ALERT_DECODE_ERROR),
  413. MK_CONST(SSL_ALERT_DECRYPT_ERROR),
  414. MK_CONST(SSL_ALERT_INVALID_VERSION),
  415. MK_CONST(SSL_ALERT_NO_RENEGOTIATION),
  416. MK_CONST(SSL_AES128_SHA),
  417. MK_CONST(SSL_AES256_SHA),
  418. MK_CONST(SSL_BUILD_SKELETON_MODE),
  419. MK_CONST(SSL_BUILD_SERVER_ONLY),
  420. MK_CONST(SSL_BUILD_ENABLE_VERIFICATION),
  421. MK_CONST(SSL_BUILD_ENABLE_CLIENT),
  422. MK_CONST(SSL_BUILD_FULL_MODE),
  423. MK_CONST(SSL_BUILD_MODE),
  424. MK_CONST(SSL_MAX_CERT_CFG_OFFSET),
  425. MK_CONST(SSL_MAX_CA_CERT_CFG_OFFSET),
  426. MK_CONST(SSL_HAS_PEM),
  427. MK_CONST(SSL_DEFAULT_SVR_SESS),
  428. MK_CONST(SSL_DEFAULT_CLNT_SESS),
  429. MK_CONST(SSL_X509_CERT_COMMON_NAME),
  430. MK_CONST(SSL_X509_CERT_ORGANIZATION),
  431. MK_CONST(SSL_X509_CERT_ORGANIZATIONAL_NAME),
  432. MK_CONST(SSL_X509_CA_CERT_COMMON_NAME),
  433. MK_CONST(SSL_X509_CA_CERT_ORGANIZATION),
  434. MK_CONST(SSL_X509_CA_CERT_ORGANIZATIONAL_NAME),
  435. MK_CONST(SSL_OBJ_X509_CERT),
  436. MK_CONST(SSL_OBJ_X509_CACERT),
  437. MK_CONST(SSL_OBJ_RSA_KEY),
  438. MK_CONST(SSL_OBJ_PKCS8),
  439. MK_CONST(SSL_OBJ_PKCS12),
  440. {0,0}
  441. };
  442. /* This defines a function that opens up your library. */
  443. SQRESULT sqext_register_axtls (HSQUIRRELVM v) {
  444. //add a namespace axtls
  445. sq_pushstring(v, SQ_LIBNAME, -1);
  446. sq_newtable(v);
  447. sq_insert_reg_funcs(v, axtls_obj_funcs);
  448. //add constants
  449. KeyIntPtrType KeyIntPtr;
  450. for (KeyIntPtr = axtls_constants; KeyIntPtr->Str; KeyIntPtr++) {
  451. sq_pushstring(v, KeyIntPtr->Str, -1); //first the key
  452. sq_pushinteger(v, KeyIntPtr->Val); //then the value
  453. sq_newslot(v, -3, SQFalse); //store then
  454. }
  455. //now create the SSL Context class
  456. sq_pushstring(v,ssl_ctx_NAME,-1);
  457. sq_newclass(v,SQFalse);
  458. sq_settypetag(v,-1,(void*)SSL_CTX_Tag);
  459. sq_insert_reg_funcs(v, ssl_ctx_obj_funcs);
  460. sq_newslot(v,-3,SQFalse);
  461. //now create the SSL class
  462. sq_pushstring(v,ssl_NAME,-1);
  463. sq_newclass(v,SQFalse);
  464. sq_settypetag(v,-1,(void*)SSL_Tag);
  465. sq_insert_reg_funcs(v, ssl_obj_funcs);
  466. sq_newslot(v,-3,SQFalse);
  467. sq_newslot(v,-3,SQFalse); //add axtls table to the root table
  468. return SQ_OK;
  469. }
  470. #ifdef __cplusplus
  471. }
  472. #endif //USE_AXTLS
  473. #endif