00001
00026 #include "ssl_tool.h"
00027 #include "dh_tool.h"
00028
00029
00030 #ifdef ENABLE_SSL
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00065
00066
00090
00091
00092 int gen_CRYPT_SharedKey(int keyex, Buffer spki, Buffer* shdkey, void* ptr)
00093 {
00094 if (spki.buf==NULL || shdkey==NULL) return FALSE;
00095
00096 if (keyex==SSL_DH) {
00097 DH* dhkey = (DH*)ptr;
00098 *shdkey = get_DHsharedkey(spki, dhkey);
00099 }
00100 else if (keyex==SSL_RSA) {
00101 *shdkey = dup_Buffer(spki);
00102 }
00103 else return FALSE;
00104
00105 return TRUE;
00106 }
00107
00108
00109
00111
00112
00113 int udp_send_crypt_Buffer_sockaddr_in(int sock, Buffer* data, struct sockaddr_in* sv, Buffer* key, EVP_CIPHER* cipher)
00114 {
00115 int cc = 0;
00116 Buffer buf;
00117
00118 if (data==NULL) return JBXL_ARGS_ERROR;
00119
00120 if (key!=NULL && cipher!=NULL) {
00121 buf = encode_EVPAPI_Buffer(*data, *key, cipher);
00122 cc = udp_send_Buffer_sockaddr_in(sock, &buf, sv);
00123 free_Buffer(&buf);
00124 }
00125 else {
00126 cc = udp_send_Buffer_sockaddr_in(sock, data, sv);
00127 }
00128
00129 return cc;
00130 }
00131
00132
00133
00134 int udp_recv_crypt_Buffer_sockaddr_in(int sock, Buffer* data, struct sockaddr_in* sv, Buffer* key, EVP_CIPHER* cipher)
00135 {
00136 Buffer buf;
00137
00138 buf = make_Buffer(RECVBUFSZ);
00139 int cc = udp_recv_Buffer_sockaddr_in(sock, &buf, sv);
00140 if (cc<=0) {
00141 free_Buffer(&buf);
00142 return cc;
00143 }
00144
00145 if (key!=NULL && cipher!=NULL) {
00146 Buffer dec = decode_EVPAPI_Buffer(buf, *key, cipher);
00147 copy_Buffer(&dec, data);
00148 free_Buffer(&dec);
00149 }
00150 else {
00151 copy_Buffer(&buf, data);
00152 }
00153
00154 cc = data->vldsz;
00155 free_Buffer(&buf);
00156 return cc;
00157 }
00158
00159
00160
00162
00163
00164 int udp_send_crypt_Buffer(int sock, Buffer* data, struct addrinfo* sv, Buffer* key, EVP_CIPHER* cipher)
00165 {
00166 int cc = 0;
00167 Buffer buf;
00168
00169 if (data==NULL) return JBXL_ARGS_ERROR;
00170
00171 if (key!=NULL && cipher!=NULL) {
00172 buf = encode_EVPAPI_Buffer(*data, *key, cipher);
00173 cc = udp_send_Buffer(sock, &buf, sv);
00174 free_Buffer(&buf);
00175 }
00176 else {
00177 cc = udp_send_Buffer(sock, data, sv);
00178 }
00179
00180 return cc;
00181 }
00182
00183
00184
00185 int udp_recv_crypt_Buffer(int sock, Buffer* data, struct addrinfo* sv, Buffer* key, EVP_CIPHER* cipher)
00186 {
00187 Buffer buf;
00188
00189 buf = make_Buffer(RECVBUFSZ);
00190 int cc = udp_recv_Buffer(sock, &buf, sv);
00191 if (cc<=0) {
00192 free_Buffer(&buf);
00193 return cc;
00194 }
00195
00196 if (key!=NULL && cipher!=NULL) {
00197 Buffer dec = decode_EVPAPI_Buffer(buf, *key, cipher);
00198 copy_Buffer(&dec, data);
00199 free_Buffer(&dec);
00200 }
00201 else {
00202 copy_Buffer(&buf, data);
00203 }
00204
00205 cc = data->vldsz;
00206 free_Buffer(&buf);
00207 return cc;
00208 }
00209
00210
00211
00212 int tcp_send_crypt_Buffer(int sock, Buffer* data, Buffer* key, EVP_CIPHER* cipher)
00213 {
00214 int cc = 0;
00215 Buffer buf;
00216
00217 if (data==NULL) return JBXL_ARGS_ERROR;
00218
00219 if (key!=NULL && cipher!=NULL) {
00220 buf = encode_EVPAPI_Buffer(*data, *key, cipher);
00221 cc = tcp_send_Buffer(sock, &buf);
00222 free_Buffer(&buf);
00223 }
00224 else {
00225 cc = tcp_send_Buffer(sock, data);
00226 }
00227
00228 return cc;
00229 }
00230
00231
00232
00233 int tcp_recv_crypt_Buffer(int sock, Buffer* data, Buffer* key, EVP_CIPHER* cipher)
00234 {
00235 Buffer buf;
00236
00237 buf = make_Buffer(RECVBUFSZ);
00238 int cc = tcp_recv_Buffer(sock, &buf);
00239 if (cc<=0) {
00240 free_Buffer(&buf);
00241 return cc;
00242 }
00243
00244 if (key!=NULL && cipher!=NULL) {
00245 Buffer dec = decode_EVPAPI_Buffer(buf, *key, cipher);
00246 copy_Buffer(&dec, data);
00247 free_Buffer(&dec);
00248 }
00249 else {
00250 copy_Buffer(&buf, data);
00251 }
00252
00253 cc = data->vldsz;
00254 free_Buffer(&buf);
00255 return cc;
00256 }
00257
00258
00259
00260 Buffer get_plain_Buffer(Buffer data, Buffer* key, EVP_CIPHER* cipher)
00261 {
00262 Buffer buf = init_Buffer();
00263 if (key==NULL || cipher==NULL) return buf;
00264
00265 buf = decode_EVPAPI_Buffer(data, *key, cipher);
00266 return buf;
00267 }
00268
00269
00270
00271 Buffer get_crypt_Buffer(Buffer data, Buffer* key, EVP_CIPHER* cipher)
00272 {
00273 Buffer buf = init_Buffer();
00274 if (key==NULL || cipher==NULL) return buf;
00275
00276 buf = encode_EVPAPI_Buffer(data, *key, cipher);
00277 return buf;
00278 }
00279
00280
00281
00306 int tcp_send_crypt_mesg(int sock, char* mesg, Buffer* key, EVP_CIPHER* cipher)
00307 {
00308 int cc = 0;
00309 Buffer buf, enc;
00310
00311 if (mesg==NULL) return JBXL_ARGS_ERROR;
00312
00313
00314 if (key!=NULL && cipher!=NULL) {
00315 buf = make_Buffer_bystr(mesg);
00316 enc = encode_EVPAPI_Buffer(buf, *key, cipher);
00317 free_Buffer(&buf);
00318 if (enc.vldsz>0) {
00319 buf = encode_base64_Buffer(enc);
00320 free_Buffer(&enc);
00321
00322
00323 cc = tcp_send_sBufferln(sock, &buf);
00324 free_Buffer(&buf);
00325 }
00326 }
00327 else {
00328 cc = tcp_send_mesg(sock, mesg);
00329 }
00330
00331 return cc;
00332 }
00333
00334
00335
00360 int tcp_send_crypt_sBuffer(int sock, Buffer* mesg, Buffer* key, EVP_CIPHER* cipher)
00361 {
00362 int cc = 0;
00363 Buffer buf, enc;
00364
00365 if (mesg==NULL) return JBXL_ARGS_ERROR;
00366
00367
00368 if (key!=NULL && cipher!=NULL) {
00369 enc = encode_EVPAPI_Buffer(*mesg, *key, cipher);
00370 if (enc.vldsz>0) {
00371 buf = encode_base64_Buffer(enc);
00372 free_Buffer(&enc);
00373
00374
00375 cc = tcp_send_sBufferln(sock, &buf);
00376 free_Buffer(&buf);
00377 }
00378 }
00379 else {
00380 cc = tcp_send_sBuffer(sock, mesg);
00381 }
00382
00383 return cc;
00384 }
00385
00386
00387
00401 Buffer get_plain_message(char* mesg, Buffer* key, EVP_CIPHER* cipher)
00402 {
00403 Buffer buf, dec;
00404
00405 buf = make_Buffer_bystr(mesg);
00406
00407 if (key==NULL || cipher==NULL) return buf;
00408
00409 dec = decode_base64_Buffer(buf);
00410 if (dec.vldsz>0) {
00411 free_Buffer(&buf);
00412 buf = decode_EVPAPI_Buffer(dec, *key, cipher);
00413 free_Buffer(&dec);
00414
00415 }
00416 return buf;
00417 }
00418
00419
00420
00434 Buffer get_plain_sBuffer(Buffer mesg, Buffer* key, EVP_CIPHER* cipher)
00435 {
00436 Buffer buf, dec;
00437
00438 buf = dup_Buffer(mesg);
00439
00440 if (key==NULL || cipher==NULL) return buf;
00441
00442 dec = decode_base64_Buffer(buf);
00443 if (dec.vldsz>0) {
00444 free_Buffer(&buf);
00445 buf = decode_EVPAPI_Buffer(dec, *key, cipher);
00446 free_Buffer(&dec);
00447
00448 }
00449 return buf;
00450 }
00451
00452
00453
00467 Buffer get_crypt_message(char* mesg, Buffer* key, EVP_CIPHER* cipher)
00468 {
00469 Buffer buf, enc;
00470
00471 buf = make_Buffer_bystr(mesg);
00472 if (key==NULL || cipher==NULL) return buf;
00473
00474 enc = encode_EVPAPI_Buffer(buf, *key, cipher);
00475 if (enc.vldsz>0) {
00476 free_Buffer(&buf);
00477 buf = encode_base64_Buffer(enc);
00478 free_Buffer(&enc);
00479 }
00480
00481 return buf;
00482 }
00483
00484
00485
00499 Buffer get_crypt_sBuffer(Buffer mesg, Buffer* key, EVP_CIPHER* cipher)
00500 {
00501 Buffer buf, enc;
00502
00503 buf = dup_Buffer(mesg);
00504 if (key==NULL || cipher==NULL) return buf;
00505
00506 enc = encode_EVPAPI_Buffer(buf, *key, cipher);
00507 if (enc.vldsz>0) {
00508 free_Buffer(&buf);
00509 buf = encode_base64_Buffer(enc);
00510 free_Buffer(&enc);
00511 }
00512
00513 return buf;
00514 }
00515
00516
00517
00518
00520
00521
00522
00538 int check_server_spki(Buffer ipaddr, Buffer spki, char* filename)
00539 {
00540 Buffer buf;
00541 FILE* fp;
00542
00543 buf = init_Buffer();
00544
00545 fp = fopen(filename, "rb");
00546 if (fp!=NULL) {
00547 buf = read_spki_with_ipaddr(ipaddr, fp);
00548 fclose(fp);
00549 if (buf.buf!=NULL) {
00550 if (bincmp_Buffer(buf, spki)) {
00551 free_Buffer(&buf);
00552 return FALSE;
00553 }
00554 }
00555 }
00556
00557 if (buf.buf==NULL) {
00558 fp = file_chmod_open(filename, (char*)"a", S_IRUSR | S_IWUSR);
00559 save_spki_with_ipaddr(ipaddr, spki, fp);
00560 fclose(fp);
00561 }
00562
00563 return TRUE;
00564 }
00565
00566
00567
00584 int save_spki_with_ipaddr(Buffer ipa, Buffer pki, FILE* fp)
00585 {
00586 unsigned int md;
00587
00588 if (fp==NULL) return FALSE;
00589
00590 md = JBXL_FIO_IPADDRESS | JBXL_FIO_STRING;
00591 if (!save_tagged_Buffer(ipa, fp, md, FALSE)) return FALSE;
00592
00593 md = JBXL_FIO_SPKI | JBXL_FIO_ORIGINAL;
00594 if (!save_tagged_Buffer(pki, fp, md, FALSE)) return FALSE;
00595
00596 return TRUE;
00597 }
00598
00599
00600
00611 Buffer read_spki_with_ipaddr(Buffer ipa, FILE* fp)
00612 {
00613 unsigned int md;
00614 Buffer ips, pki;
00615
00616 pki = init_Buffer();
00617 if (ipa.buf==NULL) return pki;
00618
00619 md = JBXL_FIO_IPADDRESS | JBXL_FIO_STRING;
00620
00621 ips = read_tagged_Buffer(fp, &md);
00622 while (!feof(fp) && strcmp_Buffer(ipa, ips)) {
00623 ips = read_tagged_Buffer(fp, &md);
00624 }
00625
00626 if (!strcmp_Buffer(ipa, ips)) {
00627 md = JBXL_FIO_SPKI | JBXL_FIO_ORIGINAL;
00628 pki = read_tagged_Buffer(fp, &md);
00629 }
00630 free_Buffer(&ips);
00631
00632 return pki;
00633 }
00634
00635
00636
00637
00639
00640
00641
00662 EVP_CIPHER* init_EVPAPI_Buffer(int type)
00663 {
00664 EVP_CIPHER* cipher = NULL;
00665
00666 if (type==SSL_AES128CBC) {
00667 cipher = (EVP_CIPHER*)EVP_aes_128_cbc();
00668 }
00669 else if (type==SSL_3DES3CBC) {
00670 cipher = (EVP_CIPHER*)EVP_des_ede3_cbc();
00671 }
00672
00673 return cipher;
00674 }
00675
00676
00677
00688 Buffer decode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER* cipher)
00689 {
00690 int sz, ss;
00691 Buffer dec;
00692 EVP_CIPHER_CTX* ctx;
00693 unsigned char* iv;
00694
00695 dec = init_Buffer();
00696 if (shdkey.buf==NULL || cipher==NULL) return dec;
00697
00698 iv = (unsigned char*)&(shdkey.buf[shdkey.vldsz - SSL_IV_SIZE]);
00699
00700 #if OPENSSL_VERSION_NUMBER < 0x10101000L
00701 ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
00702 EVP_CIPHER_CTX_init(ctx);
00703 #else
00704 ctx = EVP_CIPHER_CTX_new();
00705 EVP_CIPHER_CTX_reset(ctx);
00706 #endif
00707
00708 EVP_DecryptInit_ex(ctx, cipher, NULL, shdkey.buf, iv);
00709
00710 dec = make_Buffer(buf.vldsz + EVP_CIPHER_CTX_block_size(ctx) + 1);
00711 if (dec.buf==NULL) return dec;
00712
00713 EVP_DecryptUpdate(ctx, dec.buf, &sz, buf.buf, buf.vldsz);
00714 EVP_DecryptFinal_ex(ctx, &(dec.buf[sz]), &ss);
00715 dec.vldsz = sz + ss;
00716 dec.buf[dec.vldsz] = '\0';
00717
00718 #if OPENSSL_VERSION_NUMBER < 0x10101000L
00719 EVP_CIPHER_CTX_cleanup(ctx);
00720 #endif
00721 free(ctx);
00722 return dec;
00723 }
00724
00725
00726
00740 Buffer encode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER* cipher)
00741 {
00742 int i, len, ss=0, sz;
00743 Buffer enc;
00744 EVP_CIPHER_CTX* ctx;
00745 unsigned char* iv;
00746
00747 enc = init_Buffer();
00748
00749 if (shdkey.buf==NULL || cipher==NULL) return enc;
00750
00751 iv = (unsigned char*)&(shdkey.buf[shdkey.vldsz - SSL_IV_SIZE]);
00752
00753 #if OPENSSL_VERSION_NUMBER < 0x10101000L
00754 ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX));
00755 EVP_CIPHER_CTX_init(ctx);
00756 #else
00757 ctx = EVP_CIPHER_CTX_new();
00758 EVP_CIPHER_CTX_reset(ctx);
00759 #endif
00760
00761 EVP_EncryptInit_ex(ctx, cipher, NULL, shdkey.buf, iv);
00762
00763 len = buf.vldsz;
00764 enc = make_Buffer(len + EVP_CIPHER_CTX_block_size(ctx));
00765 if (enc.buf==NULL) return enc;
00766
00767 for (i=0; i<len/SSL_ENC_BLCKSZ; i++) {
00768 EVP_EncryptUpdate(ctx, &(enc.buf[ss]), &sz, &(buf.buf[i*SSL_ENC_BLCKSZ]), SSL_ENC_BLCKSZ);
00769 ss += sz;
00770 }
00771 if (len%SSL_ENC_BLCKSZ!=0) {
00772 EVP_EncryptUpdate(ctx, &(enc.buf[ss]), &sz, &(buf.buf[i*SSL_ENC_BLCKSZ]), len%SSL_ENC_BLCKSZ);
00773 ss += sz;
00774 }
00775 EVP_EncryptFinal_ex(ctx, &(enc.buf[ss]), &sz);
00776 enc.vldsz = ss + sz;
00777
00778 #if OPENSSL_VERSION_NUMBER < 0x10101000L
00779 EVP_CIPHER_CTX_cleanup(ctx);
00780 #endif
00781 free(ctx);
00782
00783 return enc;
00784 }
00785
00786
00787
00791 void free_EVP_CIPHER(EVP_CIPHER** p_cipher)
00792 {
00793 if (p_cipher==NULL || *p_cipher==NULL) return;
00794
00795
00796 *p_cipher = NULL;
00797
00798 return;
00799 }
00800
00801
00802
00804
00805
00806
00807
00808
00824 void ssl_init()
00825 {
00826 SSL_library_init();
00827 SSL_load_error_strings();
00828 }
00829
00830
00831
00844 SSL_CTX* ssl_client_setup(char* ca)
00845 {
00846 SSL_CTX* ssl_ctx;
00847
00848 #if OPENSSL_VERSION_NUMBER < 0x10101000L
00849 ssl_ctx = SSL_CTX_new(SSLv23_client_method());
00850 #else
00851 ssl_ctx = SSL_CTX_new(TLS_client_method());
00852 #endif
00853 if (ssl_ctx==NULL) return NULL;
00854
00855
00856 if (ca!=NULL) SSL_CTX_load_verify_locations(ssl_ctx, ca, NULL);
00857
00858 return ssl_ctx;
00859 }
00860
00861
00862
00880 SSL* ssl_client_socket(int sock, SSL_CTX* ssl_ctx, int mode)
00881 {
00882 if (ssl_ctx==NULL) return NULL;
00883
00884 SSL* ssl = SSL_new(ssl_ctx);
00885 if (ssl==NULL) {
00886
00887 return NULL;
00888 }
00889
00890 int ret = SSL_set_fd(ssl, sock);
00891 if (ret!=1) {
00892 ssl_close(ssl);
00893 return NULL;
00894 }
00895
00896
00897 ret = SSL_connect(ssl);
00898 if (ret!=1) {
00899 ssl_close(ssl);
00900 return NULL;
00901 }
00902
00903
00904 if (mode==ON) {
00905 long lrt = SSL_get_verify_result(ssl);
00906 if (lrt!=X509_V_OK) {
00907 ssl_close(ssl);
00908 return NULL;
00909 }
00910 }
00911
00912 return ssl;
00913 }
00914
00915
00916
00932 SSL_CTX* ssl_server_setup(char* crt_fn, char* key_fn, char* chn_fn)
00933 {
00934 int ret;
00935 SSL_CTX* ssl_ctx;
00936
00937
00938 #if OPENSSL_VERSION_NUMBER < 0x10101000L
00939 ssl_ctx = SSL_CTX_new(SSLv23_server_method());
00940 #else
00941 ssl_ctx = SSL_CTX_new(TLS_server_method());
00942 #endif
00943 if (ssl_ctx==NULL) return NULL;
00944
00945
00946 if (crt_fn!=NULL && key_fn!=NULL) {
00947 if (chn_fn!=NULL) {
00948 ret = SSL_CTX_use_certificate_file(ssl_ctx, crt_fn, SSL_FILETYPE_PEM);
00949 }
00950 else {
00951 ret = ssl_read_fullchain_cert_file(ssl_ctx, crt_fn);
00952 }
00953
00954 if (ret==1) {
00955 ret = SSL_CTX_use_PrivateKey_file(ssl_ctx, key_fn, SSL_FILETYPE_PEM);
00956 }
00957
00958 if (ret==1 && chn_fn!=NULL) {
00959 ret = ssl_add_chain_file(ssl_ctx, chn_fn);
00960 }
00961
00962 if (ret!=1) {
00963 SSL_CTX_free(ssl_ctx);
00964 return NULL;
00965 }
00966
00967
00968
00969 }
00970
00971 return ssl_ctx;
00972 }
00973
00974
00975
00986 int ssl_add_chain_file(SSL_CTX* ssl_ctx, char* file)
00987 {
00988 int ret = 0;
00989 if (file==NULL) return ret;
00990
00991 BIO* bio = BIO_new(BIO_s_file());
00992 if (bio==NULL) return ret;
00993
00994 BIO_read_filename(bio, file);
00995 X509* x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
00996 while(x509!=NULL) {
00997 ret = SSL_CTX_add_extra_chain_cert(ssl_ctx, x509);
00998 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
00999 }
01000 BIO_free(bio);
01001
01002 return ret;
01003 }
01004
01005
01006
01017 int ssl_read_fullchain_cert_file(SSL_CTX* ssl_ctx, char* file)
01018 {
01019 int ret = 0;
01020 if (file==NULL) return ret;
01021
01022 BIO* bio = NULL;
01023 X509* x509 = NULL;
01024
01025 bio = BIO_new(BIO_s_file());
01026 if (bio==NULL) return ret;
01027 BIO_read_filename(bio, file);
01028
01029
01030 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
01031 if (x509!=NULL) {
01032 ret = SSL_CTX_use_certificate(ssl_ctx, x509);
01033 }
01034
01035 if (ret==1) {
01036 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
01037 while(x509!=NULL) {
01038 ret = SSL_CTX_add_extra_chain_cert(ssl_ctx, x509);
01039 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
01040 }
01041 }
01042
01043 BIO_free(bio);
01044
01045 return ret;
01046 }
01047
01048
01049
01050
01051 #define SSL_ACCEPT_COUNT_MAX 10
01052
01066 SSL* ssl_server_socket(int sock, SSL_CTX* ssl_ctx)
01067 {
01068 if (ssl_ctx==NULL) return NULL;
01069 int cnt_max = SSL_ACCEPT_COUNT_MAX;
01070
01071 SSL* ssl = SSL_new(ssl_ctx);
01072 if (ssl==NULL) {
01073
01074 return NULL;
01075 }
01076
01077 int ret = SSL_set_fd(ssl, sock);
01078 if (ret!=1) {
01079 ssl_close(ssl);
01080 return NULL;
01081 }
01082
01083 int cnt = 0;
01084 SSL_set_accept_state(ssl);
01085 do {
01086 ret = SSL_accept(ssl);
01087 ret = SSL_get_error(ssl, ret);
01088 cnt++;
01089 } while (cnt<=cnt_max && (ret==SSL_ERROR_WANT_READ || ret==SSL_ERROR_WANT_WRITE || ret==SSL_ERROR_SYSCALL));
01090
01091 if (ret==SSL_ERROR_SSL || cnt>cnt_max) {
01092 if (ret!=SSL_ERROR_SSL) ssl_close(ssl);
01093 return NULL;
01094 }
01095
01096 return ssl;
01097 }
01098
01099
01100
01108 void ssl_close(SSL* ssl)
01109 {
01110 if (ssl!=NULL) {
01111
01112 SSL_shutdown(ssl);
01113 SSL_free(ssl);
01114
01115 }
01116 }
01117
01118
01119
01130 tList* ssl_get_cert_info(SSL* ssl)
01131 {
01132 tList* lt;
01133 tList* lp;
01134 char* pp;
01135 char buf[LBUF];
01136 X509* x509;
01137 BIO* bio;
01138
01139 pp = (char*)SSL_get_cipher(ssl);
01140 lt = lp = add_tList_node_str(NULL, "cipher", pp);
01141
01142 pp = (char*)SSL_get_cipher_version(ssl);
01143 lp = add_tList_node_str(lp, "version", pp);
01144
01145 x509 = SSL_get_peer_certificate(ssl);
01146 if (x509==NULL) return lt;
01147
01148 bio = BIO_new(BIO_s_mem());
01149 if (bio==NULL) {
01150 X509_free(x509);
01151 return lt;
01152 }
01153
01154 X509_NAME_print_ex(bio, X509_get_subject_name(x509), 0, XN_FLAG_RFC2253);
01155 BIO_gets(bio, buf, LBUF);
01156 lp = add_tList_node_str(lp, "subject", buf);
01157
01158 X509_NAME_print_ex(bio, X509_get_issuer_name(x509), 0, XN_FLAG_RFC2253);
01159 BIO_gets(bio, buf, LBUF);
01160 lp = add_tList_node_str(lp, "issuer", buf);
01161
01162 ASN1_TIME_print(bio, X509_get_notBefore(x509));
01163 BIO_gets(bio, buf, LBUF);
01164 lp = add_tList_node_str(lp, "before", buf);
01165
01166 ASN1_TIME_print(bio, X509_get_notAfter(x509));
01167 BIO_gets(bio, buf, LBUF);
01168 lp = add_tList_node_str(lp, "after", buf);
01169
01170 BIO_free(bio);
01171 X509_free(x509);
01172
01173 return lt;
01174 }
01175
01176
01177
01178
01180
01181
01198 int ssl_recv(SSL* ssl, char* rmsg, int size)
01199 {
01200 int cc;
01201
01202 if (ssl==NULL || rmsg==NULL) return JBXL_ARGS_ERROR;
01203
01204 memset(rmsg, 0, size);
01205 cc = SSL_read(ssl, rmsg, size-1);
01206
01207 if (cc<0) cc = JBXL_SSL_RECV_ERROR;
01208 return cc;
01209 }
01210
01211
01212
01230 int ssl_send(SSL* ssl, char* smsg, int size)
01231 {
01232 int cc;
01233
01234 if (ssl==NULL || smsg==NULL) return JBXL_ARGS_ERROR;
01235
01236 if (size<=0) size = strlen(smsg);
01237 cc = SSL_write(ssl, smsg, size);
01238
01239 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
01240 return cc;
01241 }
01242
01243
01244
01268 int ssl_recv_wait(int sock, SSL* ssl, char* mesg, int sz, int tm)
01269 {
01270 int cc;
01271
01272 if (ssl==NULL || mesg==NULL) return JBXL_ARGS_ERROR;
01273
01274
01275 if (recv_wait(sock, tm)) {
01276 cc = ssl_recv(ssl, mesg, sz);
01277
01278 }
01279 else {
01280
01281 return JBXL_NET_RECV_TIMEOUT;
01282 }
01283
01284 return cc;
01285 }
01286
01287
01288
01301 int ssl_send_mesgln(SSL* ssl, char* mesg)
01302 {
01303 int cc, sz;
01304 char* buf;
01305
01306 if (ssl==NULL || mesg==NULL) return JBXL_ARGS_ERROR;
01307
01308 sz = strlen(mesg) + 3;
01309 buf = (char*)malloc(sz);
01310 if (buf==NULL) return JBXL_MALLOC_ERROR;
01311
01312 strncpy(buf, mesg, sz);
01313 strncat(buf, "\r\n", 2);
01314 cc = ssl_send(ssl, buf, strlen(buf));
01315
01316 free(buf);
01317 return cc;
01318 }
01319
01320
01321
01355 int ssl_recv_mstream(int sock, SSL* ssl, char* mesg, int sz, mstream* sb, int tm)
01356 {
01357 int cc;
01358 unsigned char* pp;
01359
01360 if (ssl==NULL) return JBXL_ARGS_ERROR;
01361 if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
01362
01363
01364 if (sb->buf==NULL) {
01365 *sb = make_mstream(RECVBUFSZ);
01366 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
01367 }
01368
01369 while (sb->datano==0) {
01370 cc = ssl_recv_wait(sock, ssl, mesg, sz, tm);
01371 if (cc<=0) return cc;
01372 put_mstream(sb, (unsigned char*)mesg);
01373
01374 }
01375
01376 pp = get_mstream(sb);
01377 if (pp==NULL) return JBXL_NET_BUF_ERROR;
01378 if (strlen((const char*)pp)>=(unsigned int)sz) {
01379 memcpy(mesg, pp, sz-1);
01380 free(pp);
01381 return JBXL_NET_BUFSZ_ERROR;
01382 }
01383 memcpy(mesg, pp, strlen((const char*)pp));
01384
01385 free(pp);
01386 return strlen(mesg);
01387 }
01388
01389
01390
01391
01393
01394
01408 int ssl_recv_Buffer(SSL* ssl, Buffer* str)
01409 {
01410 int cc;
01411
01412 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01413
01414 memset(str->buf, 0, str->bufsz);
01415 str->vldsz = 0;
01416 str->state = JBXL_NORMAL;
01417
01418 cc = SSL_read(ssl, str->buf, str->bufsz-1);
01419 if (cc>=0) str->vldsz = cc;
01420 else cc = JBXL_SSL_RECV_ERROR;
01421
01422 return cc;
01423 }
01424
01425
01426
01439 int ssl_send_Buffer(SSL* ssl, Buffer* str)
01440 {
01441 int cc;
01442
01443 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01444
01445 if (str->vldsz<0) str->vldsz = strlen((const char*)str->buf);
01446 cc = SSL_write(ssl, str->buf, str->vldsz);
01447
01448 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
01449 return cc;
01450 }
01451
01452
01453
01474 int ssl_recv_Buffer_wait(int sock, SSL* ssl, Buffer* str, int tm)
01475 {
01476 int cc;
01477
01478 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01479
01480
01481 str->vldsz = 0;
01482 cc = ssl_recv_wait(sock, ssl, (char*)str->buf, str->bufsz, tm);
01483 if (cc>=0) str->vldsz = cc;
01484
01485 return cc;
01486 }
01487
01488
01489
01502 int ssl_send_sBuffer(SSL* ssl, Buffer* str)
01503 {
01504 int cc;
01505
01506 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01507
01508 cc = SSL_write(ssl, str->buf, strlen((const char*)str->buf));
01509
01510 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
01511 return cc;
01512 }
01513
01514
01515
01528 int ssl_send_sBufferln(SSL* ssl, Buffer* str)
01529 {
01530 int cc;
01531 Buffer buf;
01532
01533 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01534
01535 buf = dup_Buffer(*str);
01536 cat_s2Buffer("\r\n", &buf);
01537 cc = SSL_write(ssl, buf.buf, strlen((const char*)buf.buf));
01538 free_Buffer(&buf);
01539
01540 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
01541 return cc;
01542 }
01543
01544
01545
01576 int ssl_recv_mstream_Buffer(int sock, SSL* ssl, Buffer* mesg, mstream* sb, int tm)
01577 {
01578 int cc;
01579 unsigned char* pp;
01580
01581 if (ssl==NULL) return JBXL_ARGS_ERROR;
01582 if (mesg==NULL || mesg->buf==NULL || sb==NULL) return JBXL_ARGS_ERROR;
01583 *mesg = make_Buffer(LBUF);
01584
01585 if (sb->buf==NULL) {
01586 *sb = make_mstream(RECVBUFSZ);
01587 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
01588 }
01589
01590 while (sb->datano==0) {
01591 cc = ssl_recv_Buffer_wait(sock, ssl, mesg, tm);
01592 if (cc<=0) {
01593 free_Buffer(mesg);
01594 return cc;
01595 }
01596 put_mstream(sb, mesg->buf);
01597 clear_Buffer(mesg);
01598 }
01599
01600 pp = get_mstream(sb);
01601 if (pp==NULL) return JBXL_NET_BUF_ERROR;
01602 copy_s2Buffer((char*)pp, mesg);
01603 free(pp);
01604
01605 return mesg->vldsz;
01606 }
01607
01608
01609
01633 int ssl_recv_lines_Buffer(int sock, SSL* ssl, Buffer* mesg, int tm)
01634 {
01635 int cc;
01636 Buffer msg, buf;
01637
01638 if (ssl==NULL || mesg==NULL || mesg->buf==NULL) return JBXL_ARGS_ERROR;
01639 buf = make_Buffer(LBUF);
01640
01641 cc = ssl_recv_Buffer_wait(sock, ssl, &buf, tm);
01642 while (cc>0) {
01643 cat_Buffer(&buf, &msg);
01644 if (buf.buf[cc-1]==CHAR_LF) break;
01645 clear_Buffer(&buf);
01646 cc = ssl_recv_Buffer_wait(sock, ssl, &buf, tm);
01647 }
01648 free_Buffer(&buf);
01649
01650 if (cc<=0) {
01651 free_Buffer(mesg);
01652 return cc;
01653 }
01654
01655 return mesg->vldsz;
01656 }
01657
01658
01659
01660
01662
01663
01682 int ssl_tcp_recv(int sock, SSL* ssl, char* rmsg, int size)
01683 {
01684 int cc;
01685
01686 if (rmsg==NULL) return JBXL_ARGS_ERROR;
01687 memset(rmsg, 0, size);
01688
01689 if (ssl!=NULL) cc = SSL_read(ssl, rmsg, size-1);
01690 else cc = recv(sock, rmsg, size-1, 0);
01691
01692 if (cc<0) cc = JBXL_SSL_RECV_ERROR;
01693 return cc;
01694 }
01695
01696
01697
01716 int ssl_tcp_send(int sock, SSL* ssl, char* smsg, int size)
01717 {
01718 int cc;
01719
01720 if (smsg==NULL) return JBXL_ARGS_ERROR;
01721
01722 if (size<=0) size = strlen(smsg);
01723 if (ssl!=NULL) cc = SSL_write(ssl, smsg, size);
01724 else cc = send(sock, smsg, size, 0);
01725
01726 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
01727 return cc;
01728 }
01729
01730
01731
01755 int ssl_tcp_recv_wait(int sock, SSL* ssl, char* mesg, int sz, int tm)
01756 {
01757 int cc;
01758
01759 if (mesg==NULL) return JBXL_ARGS_ERROR;
01760
01761 if (recv_wait(sock, tm)) {
01762 cc = ssl_tcp_recv(sock, ssl, mesg, sz);
01763
01764 }
01765 else {
01766
01767 return JBXL_NET_RECV_TIMEOUT;
01768 }
01769
01770 return cc;
01771 }
01772
01773
01774
01789 int ssl_tcp_send_mesgln(int sock, SSL* ssl, char* mesg)
01790 {
01791 int cc, sz;
01792 char* buf;
01793
01794 if (mesg==NULL) return JBXL_ARGS_ERROR;
01795
01796 sz = strlen(mesg) + 3;
01797 buf = (char*)malloc(sz);
01798 if (buf==NULL) return JBXL_MALLOC_ERROR;
01799
01800 strncpy(buf, mesg, sz);
01801 strncat(buf, "\r\n", 2);
01802 cc = ssl_tcp_send(sock, ssl, buf, strlen(buf));
01803
01804 free(buf);
01805 return cc;
01806 }
01807
01808
01809
01844 int ssl_tcp_recv_mstream(int sock, SSL* ssl, char* mesg, int sz, mstream* sb, int tm)
01845 {
01846 int cc;
01847 unsigned char* pp;
01848
01849 if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
01850
01851
01852 if (sb->buf==NULL) {
01853 *sb = make_mstream(RECVBUFSZ);
01854 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
01855 }
01856
01857 while (sb->datano==0) {
01858 cc = ssl_tcp_recv_wait(sock, ssl, mesg, sz, tm);
01859 if (cc<=0) return cc;
01860 put_mstream(sb, (unsigned char*)mesg);
01861
01862 }
01863
01864 pp = get_mstream(sb);
01865 if (pp==NULL) return JBXL_NET_BUF_ERROR;
01866 if (strlen((const char*)pp)>=(unsigned int)sz) {
01867 memcpy(mesg, pp, sz-1);
01868 free(pp);
01869 return JBXL_NET_BUFSZ_ERROR;
01870 }
01871 memcpy(mesg, pp, strlen((const char*)pp));
01872
01873 free(pp);
01874 return strlen(mesg);
01875 }
01876
01877
01878
01893 int ssl_tcp_recv_Buffer(int sock, SSL* ssl, Buffer* str)
01894 {
01895 int cc;
01896
01897 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01898
01899 memset(str->buf, 0, str->bufsz);
01900 str->vldsz = 0;
01901 str->state = JBXL_NORMAL;
01902
01903 if (ssl!=NULL) cc = SSL_read(ssl, str->buf, str->bufsz-1);
01904 else cc = recv(sock, str->buf, str->bufsz-1, 0);
01905
01906 if (cc>=0) str->vldsz = cc;
01907 else cc = JBXL_SSL_RECV_ERROR;
01908 return cc;
01909 }
01910
01911
01912
01926 int ssl_tcp_send_Buffer(int sock, SSL* ssl, Buffer* str)
01927 {
01928 int cc;
01929
01930 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01931
01932 if (str->vldsz<0) str->vldsz = strlen((const char*)str->buf);
01933 if (ssl!=NULL) {
01934 cc = SSL_write(ssl, str->buf, str->vldsz);
01935 }
01936 else {
01937 cc = send(sock, str->buf, str->vldsz, 0);
01938 }
01939
01940 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
01941 return cc;
01942 }
01943
01944
01945
01966 int ssl_tcp_recv_Buffer_wait(int sock, SSL* ssl, Buffer* str, int tm)
01967 {
01968 int cc;
01969
01970 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
01971
01972 str->vldsz = 0;
01973 cc = ssl_tcp_recv_wait(sock, ssl, (char*)str->buf, str->bufsz, tm);
01974 if (cc>=0) str->vldsz = cc;
01975
01976
01977 return cc;
01978 }
01979
01980
01981
01998 int ssl_tcp_recv_Buffer_tosize(int sock, SSL* ssl, Buffer* str, Buffer* mod, int size)
01999 {
02000 int cc, sz;
02001 int modon = FALSE;
02002
02003 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
02004 if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
02005
02006 if (modon) memset(mod->buf, 0, mod->vldsz);
02007 Buffer buf = make_Buffer(RECVBUFSZ);
02008
02009 sz = str->vldsz;
02010 while (sz<size) {
02011 cc = ssl_tcp_recv_Buffer(sock, ssl, &buf);
02012 if (cc>0) {
02013 cat_Buffer(&buf, str);
02014 sz += cc;
02015 }
02016 else {
02017 if (cc<0) sz = cc;
02018 break;
02019 }
02020 }
02021 free_Buffer(&buf);
02022
02023 if (sz>size && modon) {
02024 copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
02025 str->vldsz = size;
02026 }
02027 return sz;
02028 }
02029
02030
02031
02054 int ssl_tcp_recv_Buffer_tosize_wait(int sock, SSL* ssl, Buffer* str, Buffer* mod, int size, int tm)
02055 {
02056 int cc, sz;
02057 int modon = FALSE;
02058
02059 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
02060 if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
02061
02062 if (modon) memset(mod->buf, 0, mod->vldsz);
02063 Buffer buf = make_Buffer(RECVBUFSZ);
02064
02065 sz = str->vldsz;
02066 while (sz<size) {
02067 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, &buf, tm);
02068 if (cc>0) {
02069 cat_Buffer(&buf, str);
02070 sz += cc;
02071 }
02072 else {
02073 if (cc<0) sz = cc;
02074 break;
02075 }
02076 }
02077 free_Buffer(&buf);
02078
02079 if (sz>size && modon) {
02080 copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
02081 str->vldsz = size;
02082 }
02083 return sz;
02084 }
02085
02086
02087
02101 int ssl_tcp_send_sBuffer(int sock, SSL* ssl, Buffer* str)
02102 {
02103 int cc;
02104
02105 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
02106
02107 if (ssl!=NULL) cc = SSL_write(ssl, str->buf, strlen((const char*)str->buf));
02108 else cc = send(sock, str->buf, strlen((const char*)str->buf), 0);
02109
02110 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
02111 return cc;
02112 }
02113
02114
02115
02129 int ssl_tcp_send_sBufferln(int sock, SSL* ssl, Buffer* str)
02130 {
02131 int cc;
02132 Buffer buf;
02133
02134 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
02135
02136 buf = dup_Buffer(*str);
02137 cat_s2Buffer("\r\n", &buf);
02138
02139 if (ssl!=NULL) cc = SSL_write(ssl, buf.buf, strlen((const char*)buf.buf));
02140 else cc = send(sock, buf.buf, strlen((const char*)buf.buf), 0);
02141
02142 free_Buffer(&buf);
02143
02144 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
02145 return cc;
02146 }
02147
02148
02149
02179 int ssl_tcp_recv_mstream_Buffer(int sock, SSL* ssl, Buffer* mesg, mstream* sb, int tm)
02180 {
02181 int cc;
02182 unsigned char* pp;
02183
02184 if (mesg==NULL || mesg->buf==NULL || sb==NULL) return JBXL_ARGS_ERROR;
02185 *mesg = make_Buffer(LBUF);
02186
02187 if (sb->buf==NULL) {
02188 *sb = make_mstream(RECVBUFSZ);
02189 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
02190 }
02191
02192 while (sb->datano==0) {
02193 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, mesg, tm);
02194 if (cc<=0) {
02195 free_Buffer(mesg);
02196 return cc;
02197 }
02198 put_mstream(sb, mesg->buf);
02199 clear_Buffer(mesg);
02200 }
02201
02202 pp = get_mstream(sb);
02203 if (pp==NULL) return JBXL_NET_BUF_ERROR;
02204 copy_s2Buffer((char*)pp, mesg);
02205 free(pp);
02206
02207 return mesg->vldsz;
02208 }
02209
02210
02211
02234 int ssl_tcp_recv_lines_Buffer(int sock, SSL* ssl, Buffer* mesg, int tm)
02235 {
02236 int cc;
02237 Buffer msg, buf;
02238
02239 if (mesg==NULL || mesg->buf==NULL) return JBXL_ARGS_ERROR;
02240 buf = make_Buffer(LBUF);
02241
02242 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, &buf, tm);
02243 while (cc>0) {
02244 cat_Buffer(&buf, &msg);
02245 if (buf.buf[cc-1]==CHAR_LF) break;
02246 clear_Buffer(&buf);
02247 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, &buf, tm);
02248 }
02249 free_Buffer(&buf);
02250
02251 if (cc<=0) {
02252 free_Buffer(mesg);
02253 return cc;
02254 }
02255
02256 return mesg->vldsz;
02257 }
02258
02259
02260
02261 #endif