xLib/ssl_tool.h File Reference

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>
Include dependency graph for ssl_tool.h:
This graph shows which files directly or indirectly include this file:

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)
tListssl_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)

Detailed Description

Author:
Fumi.Iseki (C)
コンパイルオプション
--I/usr/local/ssl/include -L/usr/local/ssl/lib -lcrypto
Attention:
このプログラムは OpenSSL を使用しています.
This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)

Definition in file ssl_tool.h.


Define Documentation

#define get_crypt_sBuffer_str ( m,
k,
 )     get_crypt_message((m), (k), (c));

Definition at line 102 of file ssl_tool.h.

#define get_plain_sBuffer_str ( m,
k,
 )     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,
 )     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経由でメッセージ(文字列)を送信する.

Parameters:
ssl SSL用ストリーム
mesg 送信用メッセージ
Return values:
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経由でメッセージ(文字列)を送信する.

Parameters:
sock ソケット記述子.sslがNULLの場合,このソケットし使用する.
ssl SSL用ストリーム
mesg 送信用メッセージ
Return values:
0以上 送信バイト数(改行を含む).
-1 失敗した(send()の戻り値).

Definition at line 156 of file ssl_tool.h.


Function Documentation

int check_server_spki ( Buffer  ipaddr,
Buffer  spki,
char *  filename 
)

int check_server_spki(char* filename, Buffer ipaddr, Buffer spki)

サーバから得た SPKIを,以前保存しておいた SPKIと比較して,サーバの正当性を検査する.

ファイル中にSPKIが無い場合は,新規のサーバとして,IPアドレスとSPKIを保存する. クライアント側でサーバの認識に使用する.

Parameters:
filename 鍵が保存されているファイル
ipaddr サーバのIPアドレス(文字列型)例:192.168.1.1
spki サーバのSPKI(DER).
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

Buffer decode_EVPAPI_Buffer ( Buffer  buf,
Buffer  shdkey,
EVP_CIPHER *  cipher 
)

Buffer decode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER* cipher)

init_EVPAPI_Buffer() によって指定された方法により 暗号文bufを復号する.

Parameters:
buf 復号する暗号データ
shdkey 共有キー
cipher 暗号方式
Returns:
復号文(平文)

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

Buffer encode_EVPAPI_Buffer ( Buffer  buf,
Buffer  shdkey,
EVP_CIPHER *  cipher 
)

Buffer encode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER* cipher)

init_EVPAPI_Buffer() によって指定された方法により buf を暗号化する.

鍵は CRYPT_SharedKey を使う. 暗号化は SSL_ENC_BLCKSZ Byte毎に,暗号化される(ブロック暗号)

Parameters:
buf 暗号化するデータ
shdkey 共有キー
cipher 暗号方式
Returns:
暗号文

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the caller graph for this function:

int gen_CRYPT_SharedKey ( int  keyex,
Buffer  spki,
Buffer shdkey,
void *  ptr 
)

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の場合は............

Parameters:
keyex 鍵交換アルゴリズム.現在サポートしているのは SSL_DH のみ.
spki 相手の SPKI
shdkey 生成された共有鍵
ptr 付加情報(SSL_DHの場合は DH* ptr)
Return values:
TRUE 成功
FALSE 失敗
See also:
DH_generate_key()

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

Buffer get_crypt_Buffer ( Buffer  data,
Buffer key,
EVP_CIPHER *  cipher 
)

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 }

Here is the call graph for this function:

Buffer get_crypt_message ( char *  mesg,
Buffer key,
EVP_CIPHER *  cipher 
)

Buffer get_crypt_message(char* mesg, Buffer* key, EVP_CIPHER* cipher)

暗号化関数.暗号化に加えて Base64符号化も行なう.

CRYPT_Algorism が 0 の場合は変換を行なわない.

Parameters:
mesg 変換するメッセージ
key 暗号鍵へのポインタ.
cipher 暗号方式
Returns:
変換されたメッセージ

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 }

Here is the call graph for this function:

Buffer get_crypt_sBuffer ( Buffer  mesg,
Buffer key,
EVP_CIPHER *  cipher 
)

Buffer get_crypt_sBuffer(Buffer mesg, Buffer* key, EVP_CIPHER* cipher)

復号化関数.暗号化に加えて Base64符号化も行なう.

CRYPT_Algorism が 0 の場合は変換を行なわない.

Parameters:
mesg 変換するメッセージ
key 暗号鍵へのポインタ.
cipher 暗号方式
Returns:
変換されたメッセージ

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 }

Here is the call graph for this function:

Buffer get_plain_Buffer ( Buffer  data,
Buffer key,
EVP_CIPHER *  cipher 
)

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 }

Here is the call graph for this function:

Buffer get_plain_message ( char *  mesg,
Buffer key,
EVP_CIPHER *  cipher 
)

Buffer get_plain_message(char* mesg, Buffer* key, EVP_CIPHER* cipher)

復号化関数.復号の前に Base64のコードを行なう.

CRYPT_Algorism が 0 の場合は変換を行なわない.

Parameters:
mesg 変換するメッセージ
key 暗号鍵へのポインタ.
cipher 暗号方式
Returns:
変換されたメッセージ

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 }

Here is the call graph for this function:

Buffer get_plain_sBuffer ( Buffer  mesg,
Buffer key,
EVP_CIPHER *  cipher 
)

Buffer get_plain_sBuffer(Buffer mesg, Buffer* key, EVP_CIPHER* cipher)

復号化関数.復号の前に Base64のコードを行なう.

CRYPT_Algorism が 0 の場合は変換を行なわない.

Parameters:
mesg 変換するメッセージ
key 暗号鍵へのポインタ.
cipher 暗号方式
Returns:
変換されたメッセージ

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

EVP_CIPHER* init_EVPAPI_Buffer ( int  type  ) 

EVP_CIPHER* init_EVPAPI_Buffer(int type)

共通鍵暗号のアルゴリズムを指定する.

Parameters:
type 暗号化オブジェクト(暗号化手法) 現在サポートしているのは SSL_AES128CBC, SSL_3DES3CBC のみ
Returns:
暗号化方式.要 free()

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 }

Here is the caller graph for this function:

Buffer read_spki_with_ipaddr ( Buffer  ipa,
FILE *  fp 
)

Buffer read_spki_with_ipaddr(Buffer ipa, FILE* fp)

IPアドレス ipaを持つサーバの公開鍵情報(X.509の SubjectPublicKeyInfo)をファイルから読み込む.

Parameters:
ipa 検索するIPアドレス
fp 読み込むファイル記述子
Returns:
IPアドレスipa の鍵情報(DER).

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int save_spki_with_ipaddr ( Buffer  ipa,
Buffer  pki,
FILE *  fp 
)

int save_spki_with_ipaddr(Buffer ipa, Buffer pki, FILE* fp)

サーバの公開鍵情報(X.509の SubjectPublicKeyInfo)を識別子ipa と共にファイルに保存する.

識別子には通常は IPアドレスが使用される.
識別子,鍵情報の順で保存される.既にファイルが存在する場合はデータはファイルの最後に追加される.
識別子にIPアドレスを使用することにより,クライアント側でのサーバ認証に使用する.

Parameters:
ipa 識別子.通常はサーバのIPアドレス.
pki 保存する鍵情報(DER).
fp 保存先のファイル記述子
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int ssl_add_chain_file ( SSL_CTX *  ssl_ctx,
char *  file 
)

int ssl_add_chain_file(SSL_CTX* ssl_ctx, char* file)

証明書チェーンのファイルからすべての中間証明書を読み込んで証明書ストアに追加する.

Parameters:
ssl_ctx SSL_CTX へのポインタ
file 証明書チェーンのファイル名(PEM形式)
Returns:
1: 正常終了

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 }

Here is the caller graph for this function:

SSL_CTX* ssl_client_setup ( char *  ca  ) 

SSL_CTX* ssl_client_setup(char* ca)

SSL/TLS のクライントソケット作成の前処理.
認証局証明書等を設定し,SSLコンテキストを返す.
SSL/TLSのクライントソケットを作成する前に,必ず実行しなければならない.

Parameters:
ca 認証局の自己証明書 PEM形式.クライアント認証用.NULL可.
Return values:
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通信が可能になる.

Parameters:
sock SSL通信を行うソケット.
ssl_ctx SSLコンテキストへのポインタ.
mode サーバ証明書のチェックを行うか?
mode ON: 行う.認証エラーの場合は NULL を返す.
mode OFF: ここでは行わない.ca が NULLの場合は強制的に OFFになる.
Return values:
NULL以外 SSL用ストリームへのポインタ.
NULL エラー.
Attention:
この関数によって取得した SSL* 変数は,必ず ssl_close() でクローズすること.

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 }

Here is the call graph for this function:

void ssl_close ( SSL *  ssl  ) 

void ssl_close(SSL* ssl)

SSLストリームをクローズし,使用した変数を開放する.

Parameters:
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 }

Here is the caller graph for this function:

tList* ssl_get_cert_info ( SSL *  ssl  ) 

tList* ssl_get_cert_info(SSL* ssl)

SSLストリームから証明書の情報を得る.これに先立って 接続が connect していないといけない.

Parameters:
ssl SSL用ストリーム
Returns:
SSLの情報を格納したリストへのポインタ. 獲得できる情報は,cipher, version, subject, issuer, before, after

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 関数

Attention:
注:この関数群では,SSL_CTX* と SSL* の変数は一対一に対応している 効率は悪いが,ソースが見易くなる. CTX: 証明書の取り扱い void ssl_init()

SSL/TLS の初期化を行う.これに先立って,乱数の初期化も行っておいた方が良い.

Definition at line 824 of file ssl_tool.c.

00825 {
00826     SSL_library_init();
00827     SSL_load_error_strings();
00828 }

int ssl_read_fullchain_cert_file ( SSL_CTX *  ssl_ctx,
char *  file 
)

int ssl_read_fullchain_cert_file(SSL_CTX* ssl_ctx, char* file)

フルチェーンのファイル(サーバ証明書と中間証明書を内包)から全ての証明書を読み込んで証明書ストアに保存する.

Parameters:
ssl_ctx SSL_CTX へのポインタ
file フルチェーンの証明書のファイル名(PEM形式)
Returns:
1: 正常終了

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 }

Here is the caller graph for this function:

int ssl_recv ( SSL *  ssl,
char *  rmsg,
int  size 
)

int ssl_recv(SSL* ssl, char* rmsg, int size)

SSL_read()をラッピングした関数.SSL経由でデータを受信する.

Parameters:
ssl SSL用ストリーム
rmsg 受信用データバッファ
size データバッファのサイズ
Return values:
1以上 受信したバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR 受信エラー.
See also:
tcp_recv()

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 }

Here is the caller graph for this function:

int ssl_recv_Buffer ( SSL *  ssl,
Buffer str 
)

int ssl_recv_Buffer(SSL* ssl, Buffer* str)

SSL経由でデータを受信する.バッファリングなし.

Parameters:
ssl SSL用ストリーム
str 受信用データバッファ.予めメモリを確保しておく.
Return values:
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が返る).

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 受信用データバッファ.予めメモリを確保しておく.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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() を使うほうが良い.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
*mesg 受信用データバッファ.予めメモリを確保しておく.
tm タイムアウト時間.秒単位.
Return values:
1以上 受信されたバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR 受信エラー.
JBXL_ARGS_ERROR buf がNULL
JBXL_NET_RECV_TIMEOUT タイムアウト.
Bug:
受信データが必ずLFで終わることが保障されている場合にしか使用できない.つまり汎用的には「使えない」
See also:
tcp_recv_mstream_Buffer()

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 }

Here is the call graph for this function:

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 が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.

一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばけ ればならない.そうで無い場合は受信データの整合性は保証されない.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 受信用データバッファ.予め十分なメモリ領域を確保しておく.
sz データバッファのサイズ
sb リングバッファ型のストリームバッファ.バッファ部が確保さえていなければ,自動的に確保される.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

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 が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で 確保される.

一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばければならない. そうで無い場合は受信データの整合性は保証されない.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 受信用データバッファ.バッファ部を確保する必要はない.
sb メッセージバッファ(リング型のストリームバッファ).バッファ部が確保さえていなければ,自動的に確保される.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

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が返る).

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 受信用データバッファ
sz データバッファのサイズ
tm タイムアウト時間.秒単位.
Return values:
1以上 受信したバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR 受信エラー.
JBXL_NET_RECV_TIMEOUT タイムアウト.
See also:
tcp_recv_wait()

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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は文字列であると見なして,サイズを自動的に計算する.

Parameters:
ssl SSL用ストリーム
smsg 送信するデータ
size 送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす.
Return values:
0以上 送信バイト数.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR 送信エラー.
See also:
also tcp_send()

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 }

Here is the caller graph for this function:

int ssl_send_Buffer ( SSL *  ssl,
Buffer str 
)

int ssl_send_Buffer(SSL* ssl, Buffer* str)

SSL経由でデータを送信する.

Parameters:
ssl SSL用ストリーム
str 送信用データバッファ.
Return values:
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)を付け加えて送信する.

Parameters:
ssl SSL用ストリーム
mesg 送信用メッセージ
Return values:
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 }

Here is the call graph for this function:

int ssl_send_sBuffer ( SSL *  ssl,
Buffer str 
)

int ssl_send_sBuffer(SSL* ssl, Buffer* str)

SSL経由で文字列データを送信する.

Parameters:
ssl SSL用ストリーム
str 送信用メッセージバッファ.
Return values:
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)を付け加えて送信する.

Parameters:
ssl SSL用ストリーム
str 送信用メッセージバッファ.
Return values:
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 }

Here is the call graph for this function:

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 を指定する.

Parameters:
crt_fn サーバ証明書のファイル名(PEM形式)
key_fn サーバの秘密鍵のファイル名(PEM形式)
chn_fn 証明書チェーンのファイル名(PEM形式)
Returns:
SSLコンテキストへのポインタ.エラーの場合は NULLが返る.

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 }

Here is the call graph for this function:

SSL* ssl_server_socket ( int  sock,
SSL_CTX *  ssl_ctx 
)

SSL* ssl_server_socket(int sock, SSL_CTX* ssl_ctx)

SSL/TLS のサーバ用TCPストリームを作成し,ソケットと関連付ける.
これに先立って TCPの接続を確立とサーバ証明書を設定して置かなければならない.

Parameters:
sock SSL通信を行うソケット.sock は accept() の戻り値を使用する.
ssl_ctx SSLコンテキストへのポインタ.
Returns:
SSL用ストリームへのポインタ.エラーの場合は NULLが返る.
Attention:
この関数によって取得した SSL* 変数は,ssl_close() でクローズすること.

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 }

Here is the call graph for this function:

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ならば通常のソケットで受信を行う.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
rmsg 受信用データバッファ
size データバッファのサイズ
Return values:
1以上 受信したバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR 受信エラー.
JBXL_NET_RECV_TIMEOUT タイムアウト.
See also:
tcp_recv()

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 }

Here is the caller graph for this function:

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経由でデータを受信する.バッファリングなし.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 受信用データバッファ.予めメモリを確保しておく.
Return values:
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 }

Here is the caller graph for this function:

int ssl_tcp_recv_Buffer_tosize ( int  sock,
SSL *  ssl,
Buffer str,
Buffer mod,
int  size 
)

int ssl_tcp_recv_Buffer_tosize(int sock, SSL* ssl, Buffer* str, Buffer* mod, int size)

SSL or TCP経由でデータを 現データと合わせて size バイトまで受信する.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 受信用データバッファ.予めメモリを確保しておく.
mod size 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK
size 目標バイト数.
Return values:
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 }

Here is the call graph for this function:

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が返る).

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 受信用データバッファ.予めメモリを確保しておく.
mod size 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK
size 目標バイト数.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

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が返る).

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 受信用データバッファ.予めメモリを確保しておく.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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() を使うほうが良い.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
*mesg 受信用データバッファ.予めメモリを確保しておく.
tm タイムアウト時間.秒単位.
Return values:
1以上 受信されたバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_SSL_RECV_ERROR 受信エラー.
JBXL_ARGS_ERROR buf がNULL
JBXL_NET_RECV_TIMEOUT タイムアウト.
Bug:
受信データが必ずLFで終わることが保障されている場合にしか使用できない.つまり汎用的には「使えない」
See also:
tcp_recv_mstream_Buffer()

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 }

Here is the call graph for this function:

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 が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.

一旦この関数を使用して,受信データをバッファリングしたら,ソケットをクローズするまで, 読み取りには必ず同じストリームを使用してこの関数を呼び出さばければならない. そうで無い場合は受信データの整合性は保証されない.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 受信用データバッファ.予め十分なメモリ領域を確保しておく.
sz データバッファのサイズ
sb リングバッファ型のストリームバッファ.バッファ部が確保さえていなければ,自動的に確保される.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

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 が返る). メッセージストリームのバッファ部が確保されていない場合は,最初に呼び出された時点で確保される.

一旦この関数を使用して,受信データをバッファリングしたら,ソケットを クローズするまで,読み取りには必ず同じストリームを使用してこの関数を呼び出さばけ ればならない.そうで無い場合は受信データの整合性は保証されない.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 受信用データバッファ.バッファ部を確保する必要はない.
sb メッセージバッファ(リング型のストリームバッファ).バッファ部が確保さえていなければ,自動的に確保される.
tm タイムアウト時間.秒単位.
Return values:
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 }

Here is the call graph for this function:

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が返る).

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 受信用データバッファ
sz データバッファのサイズ
tm タイムアウト時間.秒単位.
Return values:
1以上 受信したバイト数.
0 おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR 受信エラー.
JBXL_NET_RECV_TIMEOUT タイムアウト.
See also:
tcp_recv_wait()

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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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は文字列であると見なして,サイズを自動的に計算する.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
smsg 送信するデータ
size 送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす.
Return values:
0以上 送信バイト数.
JBXL_ARGS_ERROR 引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR 失敗した.
See also:
tcp_send()

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 }

Here is the caller graph for this function:

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経由でデータを送信する.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 送信用データバッファ.
Return values:
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 }

Here is the caller graph for this function:

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)を付け加えて送信する.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
mesg 送信用メッセージ
Return values:
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 }

Here is the call graph for this function:

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経由で文字列データを送信する.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 送信用データバッファ.
Return values:
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)を付け加えて送信する.

Parameters:
sock ソケット記述子
ssl SSL用ストリーム
str 送信用メッセージバッファ.
Return values:
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 }

Here is the call graph for this function:

int tcp_recv_crypt_Buffer ( int  sock,
Buffer data,
Buffer key,
EVP_CIPHER *  cipher 
)

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 }

Here is the call graph for this function:

int tcp_send_crypt_Buffer ( int  sock,
Buffer data,
Buffer key,
EVP_CIPHER *  cipher 
)

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 }

Here is the call graph for this function:

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()とは使い方が異なることになるので注意が必要.

Parameters:
sock ソケット
mesg 転送するデータ.
key 暗号鍵へのポインタ.
cipher 暗号方式
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

int tcp_send_crypt_sBuffer ( int  sock,
Buffer mesg,
Buffer key,
EVP_CIPHER *  cipher 
)

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()とは使い方が異なることになるので注意が必要.

Parameters:
sock ソケット
mesg 転送するデータ.
key 暗号鍵へのポインタ.
cipher 暗号方式
Return values:
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 }

Here is the call graph for this function:

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:

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 }

Here is the call graph for this function:


Generated on 15 Nov 2023 for JunkBox_Lib by  doxygen 1.6.1