SSL暗号用ライブラリヘッダ. More...
#include "xtools.h"
#include "asn1_tool.h"
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
Go to the source code of this file.
Defines | |
#define | OPENSSL_NO_KRB5 |
#define | SSL_DH 1 |
#define | SSL_RSA 2 |
#define | SSL_ENC_BLCKSZ 128 |
#define | SSL_AES128CBC 1 |
#define | SSL_3DES3CBC 10 |
#define | SSL_IV_SIZE 16 |
#define | get_plain_sBuffer_str(m, k, c) get_plain_message((m), (k), (c)); |
#define | get_crypt_sBuffer_str(m, k, c) get_crypt_message((m), (k), (c)); |
#define | ssl_client_connect(s, c, m) ssl_client_socket((s), (c), (m)) |
#define | ssl_tcp_send_mesg(sock, ssl, mesg) ssl_tcp_send((sock), (ssl), (mesg), 0) |
#define | ssl_send_mesg(ssl, mesg) ssl_send((ssl), (mesg), 0) |
Functions | |
int | gen_CRYPT_SharedKey (int keyex, Buffer spki, Buffer *shdkey, void *ptr) |
int | udp_send_crypt_Buffer_sockaddr_in (int sock, Buffer *data, struct sockaddr_in *sv, Buffer *key, EVP_CIPHER *cipher) |
int | udp_recv_crypt_Buffer_sockaddr_in (int sock, Buffer *data, struct sockaddr_in *sv, Buffer *key, EVP_CIPHER *cipher) |
int | udp_send_crypt_Buffer (int sock, Buffer *data, struct addrinfo *sv, Buffer *key, EVP_CIPHER *cipher) |
int | udp_recv_crypt_Buffer (int sock, Buffer *data, struct addrinfo *sv, Buffer *key, EVP_CIPHER *cipher) |
int | tcp_send_crypt_Buffer (int sock, Buffer *data, Buffer *key, EVP_CIPHER *cipher) |
int | tcp_recv_crypt_Buffer (int sock, Buffer *data, Buffer *key, EVP_CIPHER *cipher) |
Buffer | get_plain_Buffer (Buffer data, Buffer *key, EVP_CIPHER *cipher) |
Buffer | get_crypt_Buffer (Buffer data, Buffer *key, EVP_CIPHER *cipher) |
int | tcp_send_crypt_mesg (int sock, char *mesg, Buffer *key, EVP_CIPHER *cipher) |
int | tcp_send_crypt_sBuffer (int sock, Buffer *mesg, Buffer *key, EVP_CIPHER *cipher) |
Buffer | get_plain_message (char *mesg, Buffer *key, EVP_CIPHER *cipher) |
Buffer | get_plain_sBuffer (Buffer mesg, Buffer *key, EVP_CIPHER *cipher) |
Buffer | get_crypt_message (char *mesg, Buffer *key, EVP_CIPHER *cipher) |
Buffer | get_crypt_sBuffer (Buffer mesg, Buffer *key, EVP_CIPHER *cipher) |
int | check_server_spki (Buffer ip, Buffer spki, char *fn) |
int | save_spki_with_ipaddr (Buffer ipa, Buffer pki, FILE *fp) |
Buffer | read_spki_with_ipaddr (Buffer ipa, FILE *fp) |
EVP_CIPHER * | init_EVPAPI_Buffer (int type) |
Buffer | decode_EVPAPI_Buffer (Buffer buf, Buffer shkey, EVP_CIPHER *cipher) |
Buffer | encode_EVPAPI_Buffer (Buffer buf, Buffer shkey, EVP_CIPHER *cipher) |
void | free_EVP_CIPHER (EVP_CIPHER **p_cipher) |
SSL_CTX * | ssl_client_setup (char *ca) |
SSL * | ssl_client_socket (int sock, SSL_CTX *ssl_ctx, int mode) |
SSL_CTX * | ssl_server_setup (char *crt_fn, char *key_fn, char *chn_fn) |
SSL * | ssl_server_socket (int sock, SSL_CTX *ssl_ctx) |
int | ssl_read_fullchain_cert_file (SSL_CTX *ssl_ctx, char *file) |
int | ssl_add_chain_file (SSL_CTX *ssl_ctx, char *file) |
void | ssl_init (void) |
void | ssl_close (SSL *ssl) |
tList * | ssl_get_cert_info (SSL *ssl) |
int | ssl_recv (SSL *ssl, char *rmsg, int size) |
int | ssl_send (SSL *ssl, char *smsg, int size) |
int | ssl_recv_wait (int sock, SSL *ssl, char *mesg, int sz, int tm) |
int | ssl_send_mesgln (SSL *ssl, char *mesg) |
int | ssl_recv_mstream (int sock, SSL *ssl, char *mesg, int sz, mstream *sb, int tm) |
int | ssl_tcp_recv (int sock, SSL *ssl, char *rmsg, int size) |
int | ssl_tcp_send (int sock, SSL *ssl, char *smsg, int size) |
int | ssl_tcp_recv_wait (int sock, SSL *ssl, char *mesg, int sz, int tm) |
int | ssl_tcp_send_mesgln (int sock, SSL *ssl, char *mesg) |
int | ssl_tcp_recv_mstream (int sock, SSL *ssl, char *mesg, int sz, mstream *sb, int tm) |
int | ssl_recv_Buffer (SSL *ssl, Buffer *str) |
int | ssl_send_Buffer (SSL *ssl, Buffer *str) |
int | ssl_recv_Buffer_wait (int sock, SSL *ssl, Buffer *str, int tm) |
int | ssl_send_sBuffer (SSL *ssl, Buffer *str) |
int | ssl_send_sBufferln (SSL *ssl, Buffer *str) |
int | ssl_recv_mstream_Buffer (int sock, SSL *ssl, Buffer *mesg, mstream *sb, int tm) |
int | ssl_recv_lines_Buffer (int sock, SSL *ssl, Buffer *mesg, int tm) |
int | ssl_tcp_recv_Buffer (int sock, SSL *ssl, Buffer *str) |
int | ssl_tcp_send_Buffer (int sock, SSL *ssl, Buffer *str) |
int | ssl_tcp_recv_Buffer_wait (int sock, SSL *ssl, Buffer *str, int tm) |
int | ssl_tcp_send_sBuffer (int sock, SSL *ssl, Buffer *str) |
int | ssl_tcp_send_sBufferln (int sock, SSL *ssl, Buffer *str) |
int | ssl_tcp_recv_mstream_Buffer (int sock, SSL *ssl, Buffer *mesg, mstream *sb, int tm) |
int | ssl_tcp_recv_lines_Buffer (int sock, SSL *ssl, Buffer *mesg, int tm) |
int | ssl_tcp_recv_Buffer_tosize (int sock, SSL *ssl, Buffer *str, Buffer *mod, int size) |
int | ssl_tcp_recv_Buffer_tosize_wait (int sock, SSL *ssl, Buffer *str, Buffer *mod, int size, int tm) |
Definition in file ssl_tool.h.
#define get_crypt_sBuffer_str | ( | m, | |||
k, | |||||
c | ) | get_crypt_message((m), (k), (c)); |
Definition at line 102 of file ssl_tool.h.
#define get_plain_sBuffer_str | ( | m, | |||
k, | |||||
c | ) | get_plain_message((m), (k), (c)); |
Definition at line 101 of file ssl_tool.h.
#define OPENSSL_NO_KRB5 |
Definition at line 40 of file ssl_tool.h.
#define SSL_3DES3CBC 10 |
Definition at line 67 of file ssl_tool.h.
Referenced by command_CRYPT(), init_EVPAPI_Buffer(), and start_CRYPT_transfer().
#define SSL_AES128CBC 1 |
Definition at line 66 of file ssl_tool.h.
Referenced by command_CRYPT(), init_EVPAPI_Buffer(), and start_CRYPT_transfer().
#define ssl_client_connect | ( | s, | |||
c, | |||||
m | ) | ssl_client_socket((s), (c), (m)) |
Definition at line 121 of file ssl_tool.h.
#define SSL_DH 1 |
Definition at line 58 of file ssl_tool.h.
Referenced by command_KEYEX(), gen_CRYPT_SharedKey(), and start_CRYPT_transfer().
#define SSL_ENC_BLCKSZ 128 |
Definition at line 63 of file ssl_tool.h.
Referenced by encode_EVPAPI_Buffer().
#define SSL_IV_SIZE 16 |
Definition at line 70 of file ssl_tool.h.
Referenced by decode_EVPAPI_Buffer(), and encode_EVPAPI_Buffer().
#define SSL_RSA 2 |
Definition at line 59 of file ssl_tool.h.
Referenced by command_KEYEX(), and gen_CRYPT_SharedKey().
#define ssl_send_mesg | ( | ssl, | |||
mesg | ) | ssl_send((ssl), (mesg), 0) |
int ssl_send_mesg(SSL* ssl, char* mesg)
SSL経由でメッセージ(文字列)を送信する.
ssl | SSL用ストリーム | |
mesg | 送信用メッセージ |
0以上 | 送信バイト数. | |
-1 | 失敗した(send()の戻り値). |
Definition at line 168 of file ssl_tool.h.
#define ssl_tcp_send_mesg | ( | sock, | |||
ssl, | |||||
mesg | ) | ssl_tcp_send((sock), (ssl), (mesg), 0) |
int ssl_tcp_send_mesg(int sock, SSL* ssl, char* mesg)
SSL経由でメッセージ(文字列)を送信する.
sock | ソケット記述子.sslがNULLの場合,このソケットし使用する. | |
ssl | SSL用ストリーム | |
mesg | 送信用メッセージ |
0以上 | 送信バイト数(改行を含む). | |
-1 | 失敗した(send()の戻り値). |
Definition at line 156 of file ssl_tool.h.
int check_server_spki(char* filename, Buffer ipaddr, Buffer spki)
サーバから得た SPKIを,以前保存しておいた SPKIと比較して,サーバの正当性を検査する.
ファイル中にSPKIが無い場合は,新規のサーバとして,IPアドレスとSPKIを保存する. クライアント側でサーバの認識に使用する.
filename | 鍵が保存されているファイル | |
ipaddr | サーバのIPアドレス(文字列型)例:192.168.1.1 | |
spki | サーバのSPKI(DER). |
TRUE | サーバのSPKIは以前保存したSPKIに一致した.または新規のサーバ. | |
FALSE | サーバのSPKIは以前保存したSPKIに一致しない. |
Definition at line 538 of file ssl_tool.c.
References bincmp_Buffer, Buffer::buf, FALSE, file_chmod_open(), free_Buffer(), init_Buffer(), read_spki_with_ipaddr(), save_spki_with_ipaddr(), and TRUE.
Referenced by start_CRYPT_transfer().
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 }
Buffer decode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER* cipher)
init_EVPAPI_Buffer() によって指定された方法により 暗号文bufを復号する.
buf | 復号する暗号データ | |
shdkey | 共有キー | |
cipher | 暗号方式 |
Definition at line 688 of file ssl_tool.c.
References Buffer::buf, init_Buffer(), make_Buffer(), SSL_IV_SIZE, and Buffer::vldsz.
Referenced by get_plain_Buffer(), get_plain_message(), get_plain_sBuffer(), tcp_recv_crypt_Buffer(), udp_recv_crypt_Buffer(), and udp_recv_crypt_Buffer_sockaddr_in().
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)); // v1.1.0 00702 EVP_CIPHER_CTX_init(ctx); 00703 #else 00704 ctx = EVP_CIPHER_CTX_new(); // v1.1.1 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 }
Buffer encode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER* cipher)
init_EVPAPI_Buffer() によって指定された方法により buf を暗号化する.
鍵は CRYPT_SharedKey を使う. 暗号化は SSL_ENC_BLCKSZ Byte毎に,暗号化される(ブロック暗号)
buf | 暗号化するデータ | |
shdkey | 共有キー | |
cipher | 暗号方式 |
Definition at line 740 of file ssl_tool.c.
References Buffer::buf, init_Buffer(), make_Buffer(), SSL_ENC_BLCKSZ, SSL_IV_SIZE, and Buffer::vldsz.
Referenced by get_crypt_Buffer(), get_crypt_message(), get_crypt_sBuffer(), tcp_send_crypt_Buffer(), tcp_send_crypt_mesg(), tcp_send_crypt_sBuffer(), udp_send_crypt_Buffer(), and udp_send_crypt_Buffer_sockaddr_in().
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 //if (CRYPT_SharedKey==NULL || CRYPT_Type==NULL) return enc; 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)); // v1.1.0 00755 EVP_CIPHER_CTX_init(ctx); 00756 #else 00757 ctx = EVP_CIPHER_CTX_new(); // v1.1.1 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 //EVP_CIPHER_CTX_free(ctx); 00783 return enc; 00784 }
void free_EVP_CIPHER | ( | EVP_CIPHER ** | p_cipher | ) |
void free_EVP_CIPHER(EVP_CIPHER** p_cipher)
Definition at line 791 of file ssl_tool.c.
Referenced by check_auth().
00792 { 00793 if (p_cipher==NULL || *p_cipher==NULL) return; 00794 00795 //free(*p_cipher); // EVP_CIPHER* は解放する必要がない? 00796 *p_cipher = NULL; 00797 00798 return; 00799 }
int gen_CRYPT_SharedKey(int keyex, Buffer spki, Buffer* shdkey, void* ptr)
鍵交換アルゴリズム keyex 下で,共有鍵を計算する.
自分のSPKIと秘密鍵は計算済みでなければならない.
keyex
SSL_SH: Diffie-Hellman の場合は,DHの秘密鍵が,DH_generate_key()(または gen_DHspki(), gnen_DHspki_fs(), get_DHspki_ff()でも良い)により計算(またはロード)され,void* ptr に格納されていなければならない.
ptr = (void*)dhkey
RSA: RSAの場合は............
keyex | 鍵交換アルゴリズム.現在サポートしているのは SSL_DH のみ. | |
spki | 相手の SPKI | |
shdkey | 生成された共有鍵 | |
ptr | 付加情報(SSL_DHの場合は DH* ptr) |
TRUE | 成功 | |
FALSE | 失敗 |
Definition at line 92 of file ssl_tool.c.
References Buffer::buf, dup_Buffer(), FALSE, get_DHsharedkey(), SSL_DH, SSL_RSA, and TRUE.
Referenced by command_KEYEX(), and start_CRYPT_transfer().
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 }
Definition at line 271 of file ssl_tool.c.
References encode_EVPAPI_Buffer(), and init_Buffer().
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 }
Buffer get_crypt_message(char* mesg, Buffer* key, EVP_CIPHER* cipher)
暗号化関数.暗号化に加えて Base64符号化も行なう.
CRYPT_Algorism が 0 の場合は変換を行なわない.
mesg | 変換するメッセージ | |
key | 暗号鍵へのポインタ. | |
cipher | 暗号方式 |
Definition at line 467 of file ssl_tool.c.
References encode_base64_Buffer(), encode_EVPAPI_Buffer(), free_Buffer(), make_Buffer_bystr, and Buffer::vldsz.
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 }
Buffer get_crypt_sBuffer(Buffer mesg, Buffer* key, EVP_CIPHER* cipher)
復号化関数.暗号化に加えて Base64符号化も行なう.
CRYPT_Algorism が 0 の場合は変換を行なわない.
mesg | 変換するメッセージ | |
key | 暗号鍵へのポインタ. | |
cipher | 暗号方式 |
Definition at line 499 of file ssl_tool.c.
References dup_Buffer(), encode_base64_Buffer(), encode_EVPAPI_Buffer(), free_Buffer(), and Buffer::vldsz.
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 }
Definition at line 260 of file ssl_tool.c.
References decode_EVPAPI_Buffer(), and init_Buffer().
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 }
Buffer get_plain_message(char* mesg, Buffer* key, EVP_CIPHER* cipher)
復号化関数.復号の前に Base64のコードを行なう.
CRYPT_Algorism が 0 の場合は変換を行なわない.
mesg | 変換するメッセージ | |
key | 暗号鍵へのポインタ. | |
cipher | 暗号方式 |
Definition at line 401 of file ssl_tool.c.
References decode_base64_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer_bystr, and Buffer::vldsz.
00402 { 00403 Buffer buf, dec; 00404 00405 buf = make_Buffer_bystr(mesg); 00406 //DEBUG_MODE PRINT_ESC(" MESG -> [%s]\n", mesg); 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 //DEBUG_MODE PRINT_ESC("DMESG -> [%s]\n", (char*)buf.buf); 00415 } 00416 return buf; 00417 }
Buffer get_plain_sBuffer(Buffer mesg, Buffer* key, EVP_CIPHER* cipher)
復号化関数.復号の前に Base64のコードを行なう.
CRYPT_Algorism が 0 の場合は変換を行なわない.
mesg | 変換するメッセージ | |
key | 暗号鍵へのポインタ. | |
cipher | 暗号方式 |
Definition at line 434 of file ssl_tool.c.
References decode_base64_Buffer(), decode_EVPAPI_Buffer(), dup_Buffer(), free_Buffer(), and Buffer::vldsz.
Referenced by command_KEYEX(), recv_mesg_until_end(), and send_command_recv_ans().
00435 { 00436 Buffer buf, dec; 00437 00438 buf = dup_Buffer(mesg); 00439 //DEBUG_MODE PRINT_ESC(" MESG -> [%s]\n", (char*)mesg.buf); 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 //DEBUG_MODE PRINT_ESC("DMESG -> [%s]\n", (char*)buf.buf); 00448 } 00449 return buf; 00450 }
EVP_CIPHER* init_EVPAPI_Buffer | ( | int | type | ) |
EVP_CIPHER* init_EVPAPI_Buffer(int type)
共通鍵暗号のアルゴリズムを指定する.
type | 暗号化オブジェクト(暗号化手法) 現在サポートしているのは SSL_AES128CBC, SSL_3DES3CBC のみ |
OpenSSLの暗号化オブジェクトの種類(一部).
- AES: EVP_aes_#_X() #は 128, 192, 256 Xは ecb, cbc, cfb, ofb 例:EVP_aes_128_cbc()
- Blowfish: EVP_bf_X() Xは ecb, cbc, cfb, ofb
- DES: EVP_des_X() Xは ecb, cbc, cfb, ofb
- 3DES: EVP_des_ede(), EVP_des_ede_X() Xは cbc, cfb, ofb
EVP_des_ede3(), EVP_des_ede3_X() Xは cbc, cfb, ofb
- RC4: EVP_rc4(), EVP_rc4_40()
Definition at line 662 of file ssl_tool.c.
References SSL_3DES3CBC, and SSL_AES128CBC.
Referenced by command_CRYPT(), and start_CRYPT_transfer().
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 }
Buffer read_spki_with_ipaddr(Buffer ipa, FILE* fp)
IPアドレス ipaを持つサーバの公開鍵情報(X.509の SubjectPublicKeyInfo)をファイルから読み込む.
ipa | 検索するIPアドレス | |
fp | 読み込むファイル記述子 |
Definition at line 611 of file ssl_tool.c.
References Buffer::buf, free_Buffer(), init_Buffer(), JBXL_FIO_IPADDRESS, JBXL_FIO_ORIGINAL, JBXL_FIO_SPKI, JBXL_FIO_STRING, read_tagged_Buffer(), and strcmp_Buffer.
Referenced by check_server_spki().
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 }
int save_spki_with_ipaddr(Buffer ipa, Buffer pki, FILE* fp)
サーバの公開鍵情報(X.509の SubjectPublicKeyInfo)を識別子ipa と共にファイルに保存する.
識別子には通常は IPアドレスが使用される.
識別子,鍵情報の順で保存される.既にファイルが存在する場合はデータはファイルの最後に追加される.
識別子にIPアドレスを使用することにより,クライアント側でのサーバ認証に使用する.
ipa | 識別子.通常はサーバのIPアドレス. | |
pki | 保存する鍵情報(DER). | |
fp | 保存先のファイル記述子 |
TRUE | 成功. | |
FALSE | 失敗. |
Definition at line 584 of file ssl_tool.c.
References FALSE, JBXL_FIO_IPADDRESS, JBXL_FIO_ORIGINAL, JBXL_FIO_SPKI, JBXL_FIO_STRING, save_tagged_Buffer(), and TRUE.
Referenced by check_server_spki().
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 }
int ssl_add_chain_file | ( | SSL_CTX * | ssl_ctx, | |
char * | file | |||
) |
int ssl_add_chain_file(SSL_CTX* ssl_ctx, char* file)
証明書チェーンのファイルからすべての中間証明書を読み込んで証明書ストアに追加する.
ssl_ctx | SSL_CTX へのポインタ | |
file | 証明書チェーンのファイル名(PEM形式) |
Definition at line 986 of file ssl_tool.c.
Referenced by ssl_server_setup().
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 }
SSL_CTX* ssl_client_setup | ( | char * | ca | ) |
SSL_CTX* ssl_client_setup(char* ca)
SSL/TLS のクライントソケット作成の前処理.
認証局証明書等を設定し,SSLコンテキストを返す.
SSL/TLSのクライントソケットを作成する前に,必ず実行しなければならない.
ca | 認証局の自己証明書 PEM形式.クライアント認証用.NULL可. |
NULL以外 | SSLコンテキストへのポインタ. | |
NULL | エラー. |
Definition at line 844 of file ssl_tool.c.
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 // 認証局データを読み込む(PEMデータ) 00856 if (ca!=NULL) SSL_CTX_load_verify_locations(ssl_ctx, ca, NULL); 00857 00858 return ssl_ctx; 00859 }
SSL* ssl_client_socket | ( | int | sock, | |
SSL_CTX * | ssl_ctx, | |||
int | mode | |||
) |
SSL* ssl_client_socket(int sock, SSL_CTX* ssl_ctx, int mode)
SSL/TLS のストリームを作成し,ソケットと関連付ける.
これにより相手(SSLをしゃべるサーバ)とSSL/TLS通信が可能になる.
sock | SSL通信を行うソケット. | |
ssl_ctx | SSLコンテキストへのポインタ. | |
mode | サーバ証明書のチェックを行うか? | |
mode | ON: 行う.認証エラーの場合は NULL を返す. | |
mode | OFF: ここでは行わない.ca が NULLの場合は強制的に OFFになる. |
NULL以外 | SSL用ストリームへのポインタ. | |
NULL | エラー. |
Definition at line 880 of file ssl_tool.c.
References ON, and ssl_close().
00881 { 00882 if (ssl_ctx==NULL) return NULL; 00883 // 00884 SSL* ssl = SSL_new(ssl_ctx); 00885 if (ssl==NULL) { 00886 //SSL_CTX_free(ssl_ctx); 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 }
void ssl_close | ( | SSL * | ssl | ) |
void ssl_close(SSL* ssl)
SSLストリームをクローズし,使用した変数を開放する.
ssl | クローズする SSL用ストリーム |
Definition at line 1108 of file ssl_tool.c.
Referenced by ssl_client_socket(), and ssl_server_socket().
01109 { 01110 if (ssl!=NULL) { 01111 //SSL_CTX* p = ssl->ctx; 01112 SSL_shutdown(ssl); 01113 SSL_free(ssl); 01114 //if (p!=NULL) SSL_CTX_free(p); 01115 } 01116 }
tList* ssl_get_cert_info | ( | SSL * | ssl | ) |
tList* ssl_get_cert_info(SSL* ssl)
SSLストリームから証明書の情報を得る.これに先立って 接続が connect していないといけない.
ssl | SSL用ストリーム |
Definition at line 1130 of file ssl_tool.c.
References add_tList_node_str, and LBUF.
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 }
void ssl_init | ( | void | ) |
SSL/TLS 関数
SSL/TLS の初期化を行う.これに先立って,乱数の初期化も行っておいた方が良い.
Definition at line 824 of file ssl_tool.c.
int ssl_read_fullchain_cert_file | ( | SSL_CTX * | ssl_ctx, | |
char * | file | |||
) |
int ssl_read_fullchain_cert_file(SSL_CTX* ssl_ctx, char* file)
フルチェーンのファイル(サーバ証明書と中間証明書を内包)から全ての証明書を読み込んで証明書ストアに保存する.
ssl_ctx | SSL_CTX へのポインタ | |
file | フルチェーンの証明書のファイル名(PEM形式) |
Definition at line 1017 of file ssl_tool.c.
Referenced by ssl_server_setup().
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 // cert 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 // chain 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 }
int ssl_recv | ( | SSL * | ssl, | |
char * | rmsg, | |||
int | size | |||
) |
int ssl_recv(SSL* ssl, char* rmsg, int size)
SSL_read()をラッピングした関数.SSL経由でデータを受信する.
ssl | SSL用ストリーム | |
rmsg | 受信用データバッファ | |
size | データバッファのサイズ |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. |
Definition at line 1198 of file ssl_tool.c.
References JBXL_ARGS_ERROR, and JBXL_SSL_RECV_ERROR.
Referenced by ssl_recv_wait().
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 }
int ssl_recv_Buffer | ( | SSL * | ssl, | |
Buffer * | str | |||
) |
int ssl_recv_Buffer(SSL* ssl, Buffer* str)
SSL経由でデータを受信する.バッファリングなし.
ssl | SSL用ストリーム | |
str | 受信用データバッファ.予めメモリを確保しておく. |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした.正常切断 | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. |
Definition at line 1408 of file ssl_tool.c.
References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, JBXL_NORMAL, JBXL_SSL_RECV_ERROR, Buffer::state, and Buffer::vldsz.
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 }
int ssl_recv_Buffer_wait | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str, | |||
int | tm | |||
) |
int ssl_recv_Buffer_wait(int sock, SSL* ssl, Buffer* str, int tm)
SSL経由でデータを受信する.
タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウト となる (JBXL_NET_RECV_TIMEOUTが返る).
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 受信用データバッファ.予めメモリを確保しておく. | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1474 of file ssl_tool.c.
References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, ssl_recv_wait(), and Buffer::vldsz.
Referenced by ssl_recv_lines_Buffer(), and ssl_recv_mstream_Buffer().
01475 { 01476 int cc; 01477 01478 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR; 01479 01480 //memset(str->buf, 0, str->bufsz); 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 }
int ssl_recv_lines_Buffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | mesg, | |||
int | tm | |||
) |
int ssl_recv_lines_Buffer(int sock, SSL* ssl, Buffer* mesg, int tm)
SSL経由でメッセージを受信する.複数行分(
で終わることが保証される)のデータを 取り出さすことのできる簡易バッファ機能付き.ここからさらに一行分のデータを取り出すには,get_line() などを使用する.
ネットワークより直接一行づつ取り出すには,tcp_recv_mstream_Buffer() を使うほうが良い.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
*mesg | 受信用データバッファ.予めメモリを確保しておく. | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信されたバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_ARGS_ERROR | buf がNULL | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1633 of file ssl_tool.c.
References Buffer::buf, cat_Buffer(), CHAR_LF, clear_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, LBUF, make_Buffer(), ssl_recv_Buffer_wait(), and Buffer::vldsz.
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 }
int ssl_recv_mstream | ( | int | sock, | |
SSL * | ssl, | |||
char * | mesg, | |||
int | sz, | |||
mstream * | sb, | |||
int | tm | |||
) |
int ssl_recv_mstream(int sock, SSL* ssl, char* mesg, int sz, mstream* sb, int tm)
SSL/TSL経由でメッセージを受信する.
受信メッセージはメッセージストリーム バッファに一旦バッファリングされ,この関数により一行ずつ読み出される. mesgには最大 sz-1文字が格納される.もし,バッファ中の一行のデータが sz-1より大きい場合は,はみ出した部分は捨てられる.
mesgに格納される時,行中の改行コードは削除され,行末には必ず '\0' が入る. タイムアウトの設定が可能でタイムアウトに 0を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.
一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばけ ればならない.そうで無い場合は受信データの整合性は保証されない.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 受信用データバッファ.予め十分なメモリ領域を確保しておく. | |
sz | データバッファのサイズ | |
sb | リングバッファ型のストリームバッファ.バッファ部が確保さえていなければ,自動的に確保される. | |
tm | タイムアウト時間.秒単位. |
1以上 | mesgに格納したメッセージのバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_MALLOC_ERROR | メッセージバッファ部が無いので確保しようとしたが,確保に失敗した. | |
JBXL_NET_BUF_ERROR | メッセージバッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した. | |
JBXL_NET_BUFSZ_ERROR | メッセージバッファ中のデータの長さが,mesgの長さより大きい.はみ出した部分は捨てられた. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1355 of file ssl_tool.c.
References get_mstream(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_NET_BUF_ERROR, JBXL_NET_BUFSZ_ERROR, make_mstream, put_mstream(), RECVBUFSZ, and ssl_recv_wait().
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 //memset(mesg, 0, sz); 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 //memset(mesg, 0, sz); 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 }
int ssl_recv_mstream_Buffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | mesg, | |||
mstream * | sb, | |||
int | tm | |||
) |
int ssl_recv_mstream_Buffer(int sock, SSL* ssl, Buffer* mesg, mstream* sb, int tm)
SSL経由でメッセージを受信する.
受信メッセージはメッセージストリームに一旦バッファリングされ,この関数により一行ずつ読み出される.
mesgに格納される時,行中の改行コードは削除され,行末には必ず '\0' が入る. タイムアウトの設定が可能でタイムアウトに 0を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で 確保される.
一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばければならない. そうで無い場合は受信データの整合性は保証されない.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 受信用データバッファ.バッファ部を確保する必要はない. | |
sb | メッセージバッファ(リング型のストリームバッファ).バッファ部が確保さえていなければ,自動的に確保される. | |
tm | タイムアウト時間.秒単位. |
1以上 | mesgに格納したメッセージのバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_MALLOC_ERROR | メッセージバッファ部が無いので確保しようとしたが,確保に失敗した. | |
JBXL_NET_BUF_ERROR | メッセージバッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1576 of file ssl_tool.c.
References Buffer::buf, clear_Buffer(), copy_s2Buffer, free_Buffer(), get_mstream(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_NET_BUF_ERROR, LBUF, make_Buffer(), make_mstream, put_mstream(), RECVBUFSZ, ssl_recv_Buffer_wait(), and Buffer::vldsz.
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 }
int ssl_recv_wait | ( | int | sock, | |
SSL * | ssl, | |||
char * | mesg, | |||
int | sz, | |||
int | tm | |||
) |
int ssl_recv_wait(int sock, SSL* ssl, char* mesg, int sz, int tm)
SSL経由でデータを受信する.
タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウト となる (JBXL_NET_RECV_TIMEOUTが返る).
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 受信用データバッファ | |
sz | データバッファのサイズ | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1268 of file ssl_tool.c.
References JBXL_ARGS_ERROR, JBXL_NET_RECV_TIMEOUT, recv_wait(), and ssl_recv().
Referenced by ssl_recv_Buffer_wait(), and ssl_recv_mstream().
01269 { 01270 int cc; 01271 01272 if (ssl==NULL || mesg==NULL) return JBXL_ARGS_ERROR; 01273 01274 //memset(mesg, 0, sz); 01275 if (recv_wait(sock, tm)) { 01276 cc = ssl_recv(ssl, mesg, sz); 01277 //if (cc<=0) DEBUG_MODE PRINT_MESG("SSL_RECV_WAIT: Session Closed.\n"); 01278 } 01279 else { 01280 //DEBUG_MODE PRINT_MESG("SSL_RECV_WAIT: Time Out. (%ds)\n", tm); 01281 return JBXL_NET_RECV_TIMEOUT; 01282 } 01283 01284 return cc; 01285 }
int ssl_send | ( | SSL * | ssl, | |
char * | smsg, | |||
int | size | |||
) |
int ssl_send(SSL* ssl, char* smsg, int size)
SSL_write()をラッピングした関数.SSL経由でデータを送る.
データ(smsg)のサイズ sizeに0以下を指定した場合は、smsgは文字列であると見なして,サイズを自動的に計算する.
ssl | SSL用ストリーム | |
smsg | 送信するデータ | |
size | 送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす. |
0以上 | 送信バイト数. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信エラー. |
Definition at line 1230 of file ssl_tool.c.
References JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.
Referenced by ssl_send_mesgln().
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 }
int ssl_send_Buffer | ( | SSL * | ssl, | |
Buffer * | str | |||
) |
int ssl_send_Buffer(SSL* ssl, Buffer* str)
SSL経由でデータを送信する.
ssl | SSL用ストリーム | |
str | 送信用データバッファ. |
0以上 | 送信バイト数. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 1439 of file ssl_tool.c.
References Buffer::buf, JBXL_ARGS_ERROR, JBXL_SSL_SEND_ERROR, and Buffer::vldsz.
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 }
int ssl_send_mesgln | ( | SSL * | ssl, | |
char * | mesg | |||
) |
int ssl_send_mesgln(SSL* ssl, char* mesg)
SSLメッセージ(文字列)に改行(\r\n)を付け加えて送信する.
ssl | SSL用ストリーム | |
mesg | 送信用メッセージ |
0以上 | 送信バイト数(改行を含む). | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 1301 of file ssl_tool.c.
References JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, and ssl_send().
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; // for CR+LF+0x00 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 }
int ssl_send_sBuffer | ( | SSL * | ssl, | |
Buffer * | str | |||
) |
int ssl_send_sBuffer(SSL* ssl, Buffer* str)
SSL経由で文字列データを送信する.
ssl | SSL用ストリーム | |
str | 送信用メッセージバッファ. |
0以上 | 送信バイト数. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 1502 of file ssl_tool.c.
References Buffer::buf, JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.
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 }
int ssl_send_sBufferln | ( | SSL * | ssl, | |
Buffer * | str | |||
) |
int ssl_send_sBufferln(SSL* ssl, Buffer* str)
SSLメッセージ(文字列)に改行(\r\n)を付け加えて送信する.
ssl | SSL用ストリーム | |
str | 送信用メッセージバッファ. |
0以上 | 送信バイト数(改行を含む). | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 1528 of file ssl_tool.c.
References Buffer::buf, cat_s2Buffer, dup_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.
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 }
SSL_CTX* ssl_server_setup | ( | char * | crt_fn, | |
char * | key_fn, | |||
char * | chn_fn | |||
) |
SSL_CTX* ssl_server_setup(char* crt_fn, char* key_fn, char* chn_fn)
SSL/TLS のサーバソケット作成の前処理.
サーバ証明書等を設定し,SSLコンテキストを返す.
SSL/TLS のサーバソケットを作成する前に,必ず実行しなければならない.
中間証明書が必要な場合,crt_fn にフルチェーンのファイルを指定しても良い. その場合は,chn_fn に NULL を指定する.
crt_fn | サーバ証明書のファイル名(PEM形式) | |
key_fn | サーバの秘密鍵のファイル名(PEM形式) | |
chn_fn | 証明書チェーンのファイル名(PEM形式) |
Definition at line 932 of file ssl_tool.c.
References ssl_add_chain_file(), and ssl_read_fullchain_cert_file().
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 //SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL); // Client Certificate 00968 //SSL_CTX_set_verify_depth(ssl_ctx, 1); 00969 } 00970 00971 return ssl_ctx; 00972 }
SSL* ssl_server_socket | ( | int | sock, | |
SSL_CTX * | ssl_ctx | |||
) |
SSL* ssl_server_socket(int sock, SSL_CTX* ssl_ctx)
SSL/TLS のサーバ用TCPストリームを作成し,ソケットと関連付ける.
これに先立って TCPの接続を確立とサーバ証明書を設定して置かなければならない.
sock | SSL通信を行うソケット.sock は accept() の戻り値を使用する. | |
ssl_ctx | SSLコンテキストへのポインタ. |
Definition at line 1066 of file ssl_tool.c.
References SSL_ACCEPT_COUNT_MAX, and ssl_close().
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 //SSL_CTX_free(ssl_ctx); 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 }
int ssl_tcp_recv | ( | int | sock, | |
SSL * | ssl, | |||
char * | rmsg, | |||
int | size | |||
) |
int ssl_tcp_recv(int sock, SSL* ssl, char* rmsg, int size)
sslが NULLでなければSSLで受信を行い,NULLならば通常のソケットで受信を行う.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
rmsg | 受信用データバッファ | |
size | データバッファのサイズ |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1682 of file ssl_tool.c.
References JBXL_ARGS_ERROR, and JBXL_SSL_RECV_ERROR.
Referenced by ssl_tcp_recv_wait().
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 }
int ssl_tcp_recv_Buffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str | |||
) |
int ssl_tcp_recv_Buffer(int sock, SSL* ssl, Buffer* str)
SSL or TCP経由でデータを受信する.バッファリングなし.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 受信用データバッファ.予めメモリを確保しておく. |
1以上 | 受信バイト数. | |
0 | 正常切断 | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信失敗. |
Definition at line 1893 of file ssl_tool.c.
References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, JBXL_NORMAL, JBXL_SSL_RECV_ERROR, Buffer::state, and Buffer::vldsz.
Referenced by ssl_tcp_recv_Buffer_tosize().
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 }
int ssl_tcp_recv_Buffer_tosize(int sock, SSL* ssl, Buffer* str, Buffer* mod, int size)
SSL or TCP経由でデータを 現データと合わせて size バイトまで受信する.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 受信用データバッファ.予めメモリを確保しておく. | |
mod | size 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK | |
size | 目標バイト数. |
1以上 | 受信バイト数. | |
0 | 正常切断 | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信失敗. |
Definition at line 1998 of file ssl_tool.c.
References Buffer::buf, cat_Buffer(), copy_b2Buffer(), FALSE, free_Buffer(), JBXL_ARGS_ERROR, make_Buffer(), RECVBUFSZ, ssl_tcp_recv_Buffer(), TRUE, and Buffer::vldsz.
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 }
int ssl_tcp_recv_Buffer_tosize_wait | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str, | |||
Buffer * | mod, | |||
int | size, | |||
int | tm | |||
) |
int ssl_tcp_recv_Buffer_tosize_wait(int sock, SSL* ssl, Buffer* str, Buffer* mod, int size, int tm)
SSL or TCP経由でデータを 現データと合わせて size バイトまで受信する.
タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウト となる (JBXL_NET_RECV_TIMEOUTが返る).
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 受信用データバッファ.予めメモリを確保しておく. | |
mod | size 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK | |
size | 目標バイト数. | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 2054 of file ssl_tool.c.
References Buffer::buf, cat_Buffer(), copy_b2Buffer(), FALSE, free_Buffer(), JBXL_ARGS_ERROR, make_Buffer(), RECVBUFSZ, ssl_tcp_recv_Buffer_wait(), TRUE, and Buffer::vldsz.
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 }
int ssl_tcp_recv_Buffer_wait | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str, | |||
int | tm | |||
) |
int ssl_tcp_recv_Buffer_wait(int sock, SSL* ssl, Buffer* str, int tm)
SSL or TCP経由でデータを受信する.
タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait() 関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウト となる (JBXL_NET_RECV_TIMEOUTが返る).
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 受信用データバッファ.予めメモリを確保しておく. | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1966 of file ssl_tool.c.
References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, ssl_tcp_recv_wait(), and Buffer::vldsz.
Referenced by recv_https_chunked(), recv_https_chunked_remain(), recv_https_closed(), recv_https_content(), recv_https_header(), ssl_tcp_recv_Buffer_tosize_wait(), ssl_tcp_recv_lines_Buffer(), and ssl_tcp_recv_mstream_Buffer().
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 //print_message("ssl_tcp_recv_Buffer_wait : %s\n", (char*)str->buf); 01977 return cc; 01978 }
int ssl_tcp_recv_lines_Buffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | mesg, | |||
int | tm | |||
) |
int ssl_tcp_recv_lines_Buffer(int sock, SSL* ssl, Buffer* mesg, int tm)
SSL or TCP経由でメッセージを受信する.複数行分(
で終わることが保証される)のデータを 取り出さすことのできる簡易バッファ機能付き.ここからさらに一行分のデータを取り出すには, get_line() などを使用する.
また,ネットワークより直接一行づつ取り出すには,tcp_recv_mstream_Buffer() を使うほうが良い.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
*mesg | 受信用データバッファ.予めメモリを確保しておく. | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信されたバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_ARGS_ERROR | buf がNULL | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 2234 of file ssl_tool.c.
References Buffer::buf, cat_Buffer(), CHAR_LF, clear_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, LBUF, make_Buffer(), ssl_tcp_recv_Buffer_wait(), and Buffer::vldsz.
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 }
int ssl_tcp_recv_mstream | ( | int | sock, | |
SSL * | ssl, | |||
char * | mesg, | |||
int | sz, | |||
mstream * | sb, | |||
int | tm | |||
) |
int ssl_tcp_recv_mstream(int sock, SSL* ssl, char* mesg, int sz, mstream* sb, int tm)
SSL/TSL/TCP経由でメッセージを受信する.
受信メッセージはメッセージストリーム バッファに一旦バッファリングされ,この関数により一行ずつ読み出される. mesgには最大 sz-1文字が格納される.もし,バッファ中の一行のデータが sz-1より大きい場合は, はみ出した部分は捨てられる.
mesgに格納される時,行中の改行コードは削除され,行末には必ず '\0' が入る. タイムアウトの設定が可能でタイムアウトに 0を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.
一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばければならない. そうで無い場合は受信データの整合性は保証されない.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 受信用データバッファ.予め十分なメモリ領域を確保しておく. | |
sz | データバッファのサイズ | |
sb | リングバッファ型のストリームバッファ.バッファ部が確保さえていなければ,自動的に確保される. | |
tm | タイムアウト時間.秒単位. |
1以上 | mesgに格納したメッセージのバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_MALLOC_ERROR | メッセージバッファ部が無いので確保しようとしたが,確保に失敗した. | |
JBXL_NET_BUF_ERROR | メッセージバッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した. | |
JBXL_NET_BUFSZ_ERROR | メッセージバッファ中のデータの長さが,mesgの長さより大きい.はみ出した部分は捨てられた. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1844 of file ssl_tool.c.
References get_mstream(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_NET_BUF_ERROR, JBXL_NET_BUFSZ_ERROR, make_mstream, put_mstream(), RECVBUFSZ, and ssl_tcp_recv_wait().
01845 { 01846 int cc; 01847 unsigned char* pp; 01848 01849 if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR; 01850 //memset(mesg, 0, sz); 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 //memset(mesg, 0, sz); 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 }
int ssl_tcp_recv_mstream_Buffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | mesg, | |||
mstream * | sb, | |||
int | tm | |||
) |
int ssl_tcp_recv_mstream_Buffer(int sock, SSL* ssl, Buffer* mesg, mstream* sb, int tm)
SSL or TCP経由でメッセージを受信する.受信メッセージはメッセージストリーム に一旦バッファリングされ,この関数により一行ずつ読み出される.
mesgに格納される時,行中の改行コードは削除され,行末には必ず '\0' が入る. タイムアウトの設定が可能でタイムアウトに 0を指定した場合, 呼び出した時点で 読み込み可能データがなければすぐにタイムアウトとなる (JBXL_NET_RECV_TIMEOUT が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.
一旦この関数を使用して,受信データをバッファリングしたら,ソケットを クローズするまで,読み取りには必ず同じストリームを使用してこの関数を呼び出さばけ ればならない.そうで無い場合は受信データの整合性は保証されない.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 受信用データバッファ.バッファ部を確保する必要はない. | |
sb | メッセージバッファ(リング型のストリームバッファ).バッファ部が確保さえていなければ,自動的に確保される. | |
tm | タイムアウト時間.秒単位. |
1以上 | mesgに格納したメッセージのバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_MALLOC_ERROR | メッセージバッファ部が無いので確保しようとしたが,確保に失敗した. | |
JBXL_NET_BUF_ERROR | メッセージバッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 2179 of file ssl_tool.c.
References Buffer::buf, clear_Buffer(), copy_s2Buffer, free_Buffer(), get_mstream(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_NET_BUF_ERROR, LBUF, make_Buffer(), make_mstream, put_mstream(), RECVBUFSZ, ssl_tcp_recv_Buffer_wait(), and Buffer::vldsz.
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 }
int ssl_tcp_recv_wait | ( | int | sock, | |
SSL * | ssl, | |||
char * | mesg, | |||
int | sz, | |||
int | tm | |||
) |
int ssl_tcp_recv_wait(int sock, SSL* ssl, char* mesg, int sz, int tm)
sslが NULLでなければ,SSL経由でデータを受信する.sslがNULLなら通常のソケットで受信する.
バイナリ受信も可.タイムアウトの設定が可能.タイムアウトに 0を指定した場合, recv_wait()関数を呼び出した時点で読み込み可能データがなければすぐにタイムアウト となる (JBXL_NET_RECV_TIMEOUTが返る).
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 受信用データバッファ | |
sz | データバッファのサイズ | |
tm | タイムアウト時間.秒単位. |
1以上 | 受信したバイト数. | |
0 | おそらくは相手側がセッションをクローズした. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_RECV_ERROR | 受信エラー. | |
JBXL_NET_RECV_TIMEOUT | タイムアウト. |
Definition at line 1755 of file ssl_tool.c.
References JBXL_ARGS_ERROR, JBXL_NET_RECV_TIMEOUT, recv_wait(), and ssl_tcp_recv().
Referenced by ssl_tcp_recv_Buffer_wait(), and ssl_tcp_recv_mstream().
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 //if (cc<=0) DEBUG_MODE PRINT_MESG("SSL_TCP_RECV_WAIT: Session Closed. ret = %d. (%ds)\n", cc, tm); 01764 } 01765 else { 01766 //DEBUG_MODE PRINT_MESG("SSL_TCP_RECV_WAIT: Time Out. (%ds)\n", tm); 01767 return JBXL_NET_RECV_TIMEOUT; 01768 } 01769 01770 return cc; 01771 }
int ssl_tcp_send | ( | int | sock, | |
SSL * | ssl, | |||
char * | smsg, | |||
int | size | |||
) |
int ssl_tcp_send(int sock, SSL* ssl, char* smsg, int size)
sslが NULLでなければSSLで送信を行い,NULLならば通常のソケットで送信を行う.
データ(smsg)のサイズ sizeに0以下を指定した場合は、smsgは文字列であると見なして,サイズを自動的に計算する.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
smsg | 送信するデータ | |
size | 送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす. |
0以上 | 送信バイト数. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 失敗した. |
Definition at line 1716 of file ssl_tool.c.
References JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.
Referenced by ssl_tcp_send_mesgln().
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 }
int ssl_tcp_send_Buffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str | |||
) |
int ssl_tcp_send_Buffer(int sock, SSL* ssl, Buffer* str)
SSL or TCP経由でデータを送信する.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 送信用データバッファ. |
0以上 | 送信バイト数. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 1926 of file ssl_tool.c.
References Buffer::buf, JBXL_ARGS_ERROR, JBXL_SSL_SEND_ERROR, and Buffer::vldsz.
Referenced by send_https_Buffer(), send_https_file(), and send_https_header().
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 }
int ssl_tcp_send_mesgln | ( | int | sock, | |
SSL * | ssl, | |||
char * | mesg | |||
) |
int ssl_tcp_send_mesgln(int sock, SSL* ssl, char* mesg)
SSL or TCPメッセージ(文字列)に改行(\r\n)を付け加えて送信する.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
mesg | 送信用メッセージ |
0以上 | 送信バイト数(改行を含む). | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. | |
JBXL_MALLOC_ERROR | メモリエラー. |
Definition at line 1789 of file ssl_tool.c.
References JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, and ssl_tcp_send().
01790 { 01791 int cc, sz; 01792 char* buf; 01793 01794 if (mesg==NULL) return JBXL_ARGS_ERROR; 01795 01796 sz = strlen(mesg) + 3; // for CR+LF+0x00 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 }
int ssl_tcp_send_sBuffer | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str | |||
) |
int ssl_tcp_send_sBuffer(int sock, SSL* ssl, Buffer* str)
SSL or TCP経由で文字列データを送信する.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 送信用データバッファ. |
0以上 | 送信バイト数. | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 2101 of file ssl_tool.c.
References Buffer::buf, JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.
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 }
int ssl_tcp_send_sBufferln | ( | int | sock, | |
SSL * | ssl, | |||
Buffer * | str | |||
) |
int ssl_tcp_send_sBufferln(int sock, SSL* ssl, Buffer* str)
SSL or TCPメッセージ(文字列)に改行(\r\n)を付け加えて送信する.
sock | ソケット記述子 | |
ssl | SSL用ストリーム | |
str | 送信用メッセージバッファ. |
0以上 | 送信バイト数(含む改行). | |
JBXL_ARGS_ERROR | 引数に NULLのデータがある. | |
JBXL_SSL_SEND_ERROR | 送信失敗. |
Definition at line 2129 of file ssl_tool.c.
References Buffer::buf, cat_s2Buffer, dup_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.
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 }
Definition at line 233 of file ssl_tool.c.
References copy_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer(), RECVBUFSZ, tcp_recv_Buffer(), and Buffer::vldsz.
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 }
Definition at line 212 of file ssl_tool.c.
References encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and tcp_send_Buffer().
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 }
int tcp_send_crypt_mesg | ( | int | sock, | |
char * | mesg, | |||
Buffer * | key, | |||
EVP_CIPHER * | cipher | |||
) |
int tcp_send_crypt_mesg(int sock, char* mesg, Buffer* key, EVP_CIPHER* cipher)
暗号化対応の転送関数.
暗号化データの最後には必ず \r\n がつく.生データの最後の \r\n はユーザの責任で付加する(通常はつける). CRYPT_Algorism が 0 でない場合には暗号化(+\r\n)して送られる.
tcp_send_crypt_mesgln(), tcp_send_crypt_sBufferln() は最後の改行コードの 取り扱いが混乱するので定義しない方が良い(と思う).定義する場合は tcp_send_mesgln(), tcp_send_sBufferln()とは使い方が異なることになるので注意が必要.
sock | ソケット | |
mesg | 転送するデータ. | |
key | 暗号鍵へのポインタ. | |
cipher | 暗号方式 |
0以上 | 転送データ数 | |
0未満 | 通信エラー |
tcp_send_crypt_mesg(sock, "OK\r\n");
Definition at line 306 of file ssl_tool.c.
References encode_base64_Buffer(), encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, make_Buffer_bystr, tcp_send_mesg, tcp_send_sBufferln(), and Buffer::vldsz.
Referenced by command_BYE(), command_CRYPT(), command_HELLO(), command_KEYEX(), command_PASSWD(), and command_USERID().
00307 { 00308 int cc = 0; 00309 Buffer buf, enc; 00310 00311 if (mesg==NULL) return JBXL_ARGS_ERROR; 00312 //DEBUG_MODE PRINT_ESC(" SEND -> [%s]\n", mesg); 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 //DEBUG_MODE PRINT_ESC("CSEND -> [%s]\n", (char*)buf.buf); 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 }
int tcp_send_crypt_sBuffer(int sock, Buffer* mesg, Buffer* key, EVP_CIPHER* cipher)
暗号化対応の転送関数.
暗号化データの最後には必ず \r\n がつく.生データの最後の \r\n はユーザの責任で付加する(通常はつける). CRYPT_Algorism が 0 でない場合には暗号化(+\r\n)して送られる.
tcp_send_crypt_mesgln(), tcp_send_crypt_sBufferln() は最後の改行コードの 取り扱いが混乱するので定義しない方が良い(と思う).定義する場合は tcp_send_mesgln(), tcp_send_sBufferln()とは使い方が異なることになるので注意が必要.
sock | ソケット | |
mesg | 転送するデータ. | |
key | 暗号鍵へのポインタ. | |
cipher | 暗号方式 |
0以上 | 転送データ数 | |
0未満 | 通信エラー |
tcp_send_crypt_mesg(sock, "OK\r\n");
Definition at line 360 of file ssl_tool.c.
References encode_base64_Buffer(), encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, tcp_send_sBuffer(), tcp_send_sBufferln(), and Buffer::vldsz.
Referenced by command_KEYEX(), command_USERID(), and send_command_recv_ans().
00361 { 00362 int cc = 0; 00363 Buffer buf, enc; 00364 00365 if (mesg==NULL) return JBXL_ARGS_ERROR; 00366 //DEBUG_MODE PRINT_ESC(" SEND -> [%s]\n", (char*)mesg->buf); 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 //DEBUG_MODE PRINT_ESC("CSEND -> [%s]\n", (char*)buf.buf); 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 }
int udp_recv_crypt_Buffer | ( | int | sock, | |
Buffer * | data, | |||
struct addrinfo * | sv, | |||
Buffer * | key, | |||
EVP_CIPHER * | cipher | |||
) |
Definition at line 185 of file ssl_tool.c.
References copy_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer(), RECVBUFSZ, udp_recv_Buffer(), and Buffer::vldsz.
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 }
int udp_recv_crypt_Buffer_sockaddr_in | ( | int | sock, | |
Buffer * | data, | |||
struct sockaddr_in * | sv, | |||
Buffer * | key, | |||
EVP_CIPHER * | cipher | |||
) |
Definition at line 134 of file ssl_tool.c.
References copy_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer(), RECVBUFSZ, udp_recv_Buffer_sockaddr_in(), and Buffer::vldsz.
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 }
int udp_send_crypt_Buffer | ( | int | sock, | |
Buffer * | data, | |||
struct addrinfo * | sv, | |||
Buffer * | key, | |||
EVP_CIPHER * | cipher | |||
) |
Definition at line 164 of file ssl_tool.c.
References encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and udp_send_Buffer().
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 }
int udp_send_crypt_Buffer_sockaddr_in | ( | int | sock, | |
Buffer * | data, | |||
struct sockaddr_in * | sv, | |||
Buffer * | key, | |||
EVP_CIPHER * | cipher | |||
) |
Definition at line 113 of file ssl_tool.c.
References encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and udp_send_Buffer_sockaddr_in().
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 }