JunkBox_Lib 1.10.1
Loading...
Searching...
No Matches
ssl_tool.c File Reference

Diffie-Hellman用 ライブラリ More...

#include "ssl_tool.h"
#include "dh_tool.h"
Include dependency graph for ssl_tool.c:

Go to the source code of this file.

Macros

#define SSL_ACCEPT_COUNT_MAX   10
 

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 ipaddr, Buffer spki, char *filename)
 
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 shdkey, EVP_CIPHER *cipher)
 
Buffer encode_EVPAPI_Buffer (Buffer buf, Buffer shdkey, EVP_CIPHER *cipher)
 
void free_EVP_CIPHER (EVP_CIPHER **p_cipher)
 
void ssl_init ()
 
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)
 
int ssl_add_chain_file (SSL_CTX *ssl_ctx, char *file)
 
int ssl_read_fullchain_cert_file (SSL_CTX *ssl_ctx, char *file)
 
SSL * ssl_server_socket (int sock, SSL_CTX *ssl_ctx)
 
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_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 (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_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_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)
 
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)
 

Detailed Description

SSL暗号用ライブラリ

Author
Fumi.Iseki (C)
ライブラリ
–L/usr/local/ssl/lib -lssl -lcrypto –L/usr/lib64 -lssl -lcrypto -lcrypt
転送データ(テキスト)形式
通常転送データ: [データ][\r][\n]
通常転送データ(複数行): [データ][\r][\n][データ][\r][\n]...[\r][\n][END][\r][\n]
暗号化時の転送データ: [暗号化データ][\r][\n] (一行)
|→復号→ [データ][\r][\n]....[\r][\n][END][\r][\n]
注)データを転送するとき,\r\n が生のデータの最後につくのか,暗号化されたデータの最後につくのか,よく注意しないといけない.
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.c.

Macro Definition Documentation

◆ SSL_ACCEPT_COUNT_MAX

#define SSL_ACCEPT_COUNT_MAX   10

Definition at line 1027 of file ssl_tool.c.

Referenced by ssl_server_socket().

Function Documentation

◆ check_server_spki()

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 524 of file ssl_tool.c.

525{
526 Buffer buf;
527 FILE* fp;
528
529 buf = init_Buffer();
530
531 fp = fopen(filename, "rb");
532 if (fp!=NULL) {
533 buf = read_spki_with_ipaddr(ipaddr, fp);
534 fclose(fp);
535 if (buf.buf!=NULL) {
536 if (bincmp_Buffer(buf, spki)) {
538 return FALSE;
539 }
540 }
541 }
542
543 if (buf.buf==NULL) {
544 fp = file_chmod_open(filename, (char*)"a", S_IRUSR | S_IWUSR);
545 save_spki_with_ipaddr(ipaddr, spki, fp);
546 fclose(fp);
547 }
548
549 return TRUE;
550}
void free_Buffer(Buffer *buf)
Buffer型変数のバッファ部を解放する
Definition buffer.c:128
Buffer init_Buffer()
初期化したBuffer型変数を返す.
Definition buffer.c:47
#define bincmp_Buffer(a, b)
cmp_Buffer()
Definition buffer.h:152
#define TRUE
Definition common.h:226
#define FALSE
Definition common.h:223
unsigned char ** buf
Definition jpeg_tool.h:96
Buffer read_spki_with_ipaddr(Buffer ipa, FILE *fp)
Definition ssl_tool.c:595
int save_spki_with_ipaddr(Buffer ipa, Buffer pki, FILE *fp)
Definition ssl_tool.c:569
FILE * file_chmod_open(const char *fn, const char *fm, mode_t mode)
ファイルの許可属性をmode へ変更した後,ファイルを fmモードでオープン
Definition tools.c:2366

References bincmp_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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ decode_EVPAPI_Buffer()

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 670 of file ssl_tool.c.

671{
672 int sz, ss;
673 Buffer dec;
674 EVP_CIPHER_CTX* ctx;
675 unsigned char* iv;
676
677 dec = init_Buffer();
678 if (shdkey.buf==NULL || cipher==NULL) return dec;
679
680 iv = (unsigned char*)&(shdkey.buf[shdkey.vldsz - SSL_IV_SIZE]);
681
682#if OPENSSL_VERSION_NUMBER < 0x10101000L
683 ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); // v1.1.0
684 memset(ctx, 0, sizeof(EVP_CIPHER_CTX));
685 EVP_CIPHER_CTX_init(ctx);
686#else
687 ctx = EVP_CIPHER_CTX_new(); // v1.1.1
688 EVP_CIPHER_CTX_reset(ctx);
689#endif
690
691 EVP_DecryptInit_ex(ctx, cipher, NULL, shdkey.buf, iv);
692
693 dec = make_Buffer(buf.vldsz + EVP_CIPHER_CTX_block_size(ctx) + 1);
694 if (dec.buf==NULL) return dec;
695
696 EVP_DecryptUpdate(ctx, dec.buf, &sz, buf.buf, buf.vldsz);
697 EVP_DecryptFinal_ex(ctx, &(dec.buf[sz]), &ss);
698 dec.vldsz = sz + ss;
699 dec.buf[dec.vldsz] = '\0';
700
701#if OPENSSL_VERSION_NUMBER < 0x10101000L
702 EVP_CIPHER_CTX_cleanup(ctx);
703#endif
704 free(ctx);
705 return dec;
706}
Buffer make_Buffer(int sz)
Buffer型変数のバッファ部をつくり出す.
Definition buffer.c:71
int vldsz
データの長さ.バイナリデータの場合も使用可能.文字列の場合は 0x00 を含まない.
Definition buffer.h:37
unsigned char * buf
バッファの先頭へのポインタ.str[bufsz]は必ず 0x00となる.
Definition buffer.h:39

References buf, Buffer::buf, init_Buffer(), make_Buffer(), 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ encode_EVPAPI_Buffer()

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 722 of file ssl_tool.c.

723{
724 int i, len, ss=0, sz;
725 Buffer enc;
726 EVP_CIPHER_CTX* ctx;
727 unsigned char* iv;
728
729 enc = init_Buffer();
730 //if (CRYPT_SharedKey==NULL || CRYPT_Type==NULL) return enc;
731 if (shdkey.buf==NULL || cipher==NULL) return enc;
732
733 iv = (unsigned char*)&(shdkey.buf[shdkey.vldsz - SSL_IV_SIZE]);
734
735#if OPENSSL_VERSION_NUMBER < 0x10101000L
736 ctx = (EVP_CIPHER_CTX*)malloc(sizeof(EVP_CIPHER_CTX)); // v1.1.0
737 memset(ctx, 0, sizeof(EVP_CIPHER_CTX));
738 EVP_CIPHER_CTX_init(ctx);
739#else
740 ctx = EVP_CIPHER_CTX_new(); // v1.1.1
741 EVP_CIPHER_CTX_reset(ctx);
742#endif
743
744 EVP_EncryptInit_ex(ctx, cipher, NULL, shdkey.buf, iv);
745
746 len = buf.vldsz;
747 enc = make_Buffer(len + EVP_CIPHER_CTX_block_size(ctx));
748 if (enc.buf==NULL) return enc;
749
750 for (i=0; i<len/SSL_ENC_BLCKSZ; i++) {
751 EVP_EncryptUpdate(ctx, &(enc.buf[ss]), &sz, &(buf.buf[i*SSL_ENC_BLCKSZ]), SSL_ENC_BLCKSZ);
752 ss += sz;
753 }
754 if (len%SSL_ENC_BLCKSZ!=0) {
755 EVP_EncryptUpdate(ctx, &(enc.buf[ss]), &sz, &(buf.buf[i*SSL_ENC_BLCKSZ]), len%SSL_ENC_BLCKSZ);
756 ss += sz;
757 }
758 EVP_EncryptFinal_ex(ctx, &(enc.buf[ss]), &sz);
759 enc.vldsz = ss + sz;
760
761#if OPENSSL_VERSION_NUMBER < 0x10101000L
762 EVP_CIPHER_CTX_cleanup(ctx);
763#endif
764 free(ctx);
765 //EVP_CIPHER_CTX_free(ctx);
766 return enc;
767}
unsigned char unsigned long * len
Definition jpeg_tool.h:96

References buf, Buffer::buf, init_Buffer(), len, make_Buffer(), 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ free_EVP_CIPHER()

void free_EVP_CIPHER ( EVP_CIPHER ** p_cipher)

void free_EVP_CIPHER(EVP_CIPHER** p_cipher)

Definition at line 773 of file ssl_tool.c.

774{
775 if (p_cipher==NULL || *p_cipher==NULL) return;
776
777 //free(*p_cipher); // EVP_CIPHER* は解放する必要がない?
778 *p_cipher = NULL;
779
780 return;
781}

Referenced by check_auth().

Here is the caller graph for this function:

◆ gen_CRYPT_SharedKey()

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 91 of file ssl_tool.c.

92{
93 if (spki.buf==NULL || shdkey==NULL) return FALSE;
94
95 if (keyex==SSL_DH) {
96 DH* dhkey = (DH*)ptr;
97 *shdkey = get_DHsharedkey(spki, dhkey); // 共有鍵を得る
98 }
99 else if (keyex==SSL_RSA) { // 未実装
100 *shdkey = dup_Buffer(spki);
101 }
102 else return FALSE;
103
104 return TRUE;
105}
Buffer dup_Buffer(Buffer buf)
Buffer型変数のコピーをつくる.
Definition buffer.c:211

References Buffer::buf, dup_Buffer(), FALSE, and TRUE.

Referenced by command_KEYEX(), and start_CRYPT_transfer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_crypt_Buffer()

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

Definition at line 264 of file ssl_tool.c.

265{
267 if (key==NULL || cipher==NULL) return buf;
268
269 buf = encode_EVPAPI_Buffer(data, *key, cipher);
270 return buf;
271}
Buffer encode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER *cipher)
Definition ssl_tool.c:722

References buf, encode_EVPAPI_Buffer(), and init_Buffer().

Here is the call graph for this function:

◆ get_crypt_message()

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 455 of file ssl_tool.c.

456{
457 Buffer buf, enc;
458
459 buf = make_Buffer_bystr(mesg);
460 if (key==NULL || cipher==NULL) return buf;
461
462 enc = encode_EVPAPI_Buffer(buf, *key, cipher);
463 if (enc.vldsz>0) {
466 free_Buffer(&enc);
467 }
468
469 return buf;
470}
Buffer encode_base64_Buffer(Buffer buf)
バイナリデータ buf.bufの buf.vldszバイトを Base64にエンコード する
Definition buffer.c:804
#define make_Buffer_bystr(str)
set_Buffer()
Definition buffer.h:57

References buf, encode_base64_Buffer(), encode_EVPAPI_Buffer(), free_Buffer(), make_Buffer_bystr, and Buffer::vldsz.

Here is the call graph for this function:

◆ get_crypt_sBuffer()

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 486 of file ssl_tool.c.

487{
488 Buffer buf, enc;
489
490 buf = dup_Buffer(mesg);
491 if (key==NULL || cipher==NULL) return buf;
492
493 enc = encode_EVPAPI_Buffer(buf, *key, cipher);
494 if (enc.vldsz>0) {
497 free_Buffer(&enc);
498 }
499
500 return buf;
501}

References buf, dup_Buffer(), encode_base64_Buffer(), encode_EVPAPI_Buffer(), free_Buffer(), and Buffer::vldsz.

Here is the call graph for this function:

◆ get_plain_Buffer()

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

Definition at line 254 of file ssl_tool.c.

255{
257 if (key==NULL || cipher==NULL) return buf;
258
259 buf = decode_EVPAPI_Buffer(data, *key, cipher);
260 return buf;
261}
Buffer decode_EVPAPI_Buffer(Buffer buf, Buffer shdkey, EVP_CIPHER *cipher)
Definition ssl_tool.c:670

References buf, decode_EVPAPI_Buffer(), and init_Buffer().

Here is the call graph for this function:

◆ get_plain_message()

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 391 of file ssl_tool.c.

392{
393 Buffer buf, dec;
394
395 buf = make_Buffer_bystr(mesg);
396 //DEBUG_MODE PRINT_ESC(" MESG -> [%s]\n", mesg);
397 if (key==NULL || cipher==NULL) return buf;
398
400 if (dec.vldsz>0) {
402 buf = decode_EVPAPI_Buffer(dec, *key, cipher);
403 free_Buffer(&dec);
404 //DEBUG_MODE PRINT_ESC("DMESG -> [%s]\n", (char*)buf.buf);
405 }
406 return buf;
407}
Buffer decode_base64_Buffer(Buffer str)
strのバッファを Base64からデコードする
Definition buffer.c:850

References buf, decode_base64_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer_bystr, and Buffer::vldsz.

Here is the call graph for this function:

◆ get_plain_sBuffer()

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 423 of file ssl_tool.c.

424{
425 Buffer buf, dec;
426
427 buf = dup_Buffer(mesg);
428 //DEBUG_MODE PRINT_ESC(" MESG -> [%s]\n", (char*)mesg.buf);
429 if (key==NULL || cipher==NULL) return buf;
430
432 if (dec.vldsz>0) {
434 buf = decode_EVPAPI_Buffer(dec, *key, cipher);
435 free_Buffer(&dec);
436 //DEBUG_MODE PRINT_ESC("DMESG -> [%s]\n", (char*)buf.buf);
437 }
438 return buf;
439}

References buf, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_EVPAPI_Buffer()

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 645 of file ssl_tool.c.

646{
647 EVP_CIPHER* cipher = NULL;
648
649 if (type==SSL_AES128CBC) {
650 cipher = (EVP_CIPHER*)EVP_aes_128_cbc();
651 }
652 else if (type==SSL_3DES3CBC) {
653 cipher = (EVP_CIPHER*)EVP_des_ede3_cbc();
654 }
655
656 return cipher;
657}

Referenced by command_CRYPT(), and start_CRYPT_transfer().

Here is the caller graph for this function:

◆ read_spki_with_ipaddr()

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 595 of file ssl_tool.c.

596{
597 unsigned int md;
598 Buffer ips, pki;
599
600 pki = init_Buffer();
601 if (ipa.buf==NULL) return pki;
602
604
605 ips = read_tagged_Buffer(fp, &md);
606 while (!feof(fp) && strcmp_Buffer(ipa, ips)) {
607 ips = read_tagged_Buffer(fp, &md);
608 }
609
610 if (!strcmp_Buffer(ipa, ips)) {
612 pki = read_tagged_Buffer(fp, &md);
613 }
614 free_Buffer(&ips);
615
616 return pki;
617}
#define strcmp_Buffer(a, b)
cmp_Buffer()
Definition buffer.h:150
Buffer read_tagged_Buffer(FILE *fp, unsigned int *mode)
save_tagged_Buffer() で保存したファイルから,Buffer をタグに従って読み込む.
Definition xtools.c:1013
#define JBXL_FIO_STRING
Definition xtools.h:31
#define JBXL_FIO_ORIGINAL
Definition xtools.h:27
#define JBXL_FIO_IPADDRESS
Definition xtools.h:22
#define JBXL_FIO_SPKI
Definition xtools.h:25

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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ save_spki_with_ipaddr()

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 569 of file ssl_tool.c.

570{
571 unsigned int md;
572
573 if (fp==NULL) return FALSE;
574
576 if (!save_tagged_Buffer(ipa, fp, md, FALSE)) return FALSE;
577
579 if (!save_tagged_Buffer(pki, fp, md, FALSE)) return FALSE;
580
581 return TRUE;
582}
int save_tagged_Buffer(Buffer buf, FILE *fp, unsigned int mode, int prfm)
Bufferを指定された形式に従ってタグ付きでファイルに保存する.
Definition xtools.c:956

References FALSE, JBXL_FIO_IPADDRESS, JBXL_FIO_ORIGINAL, JBXL_FIO_SPKI, JBXL_FIO_STRING, save_tagged_Buffer(), and TRUE.

Referenced by check_server_spki().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ssl_add_chain_file()

int ssl_add_chain_file ( SSL_CTX * ssl_ctx,
char * file )

int ssl_add_chain_file(SSL_CTX* ssl_ctx, char* file)

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

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

Definition at line 965 of file ssl_tool.c.

966{
967 int ret = 0;
968 if (file==NULL) return ret;
969
970 BIO* bio = BIO_new(BIO_s_file());
971 if (bio==NULL) return ret;
972
973 BIO_read_filename(bio, file);
974 X509* x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
975 while(x509!=NULL) {
976 ret = SSL_CTX_add_extra_chain_cert(ssl_ctx, x509);
977 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
978 }
979 BIO_free(bio);
980
981 return ret;
982}

Referenced by ssl_server_setup().

Here is the caller graph for this function:

◆ ssl_client_setup()

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 826 of file ssl_tool.c.

827{
828 SSL_CTX* ssl_ctx;
829
830#if OPENSSL_VERSION_NUMBER < 0x10101000L
831 ssl_ctx = SSL_CTX_new(SSLv23_client_method());
832#else
833 ssl_ctx = SSL_CTX_new(TLS_client_method());
834#endif
835 if (ssl_ctx==NULL) return NULL;
836
837 // 認証局データを読み込む(PEMデータ)
838 if (ca!=NULL) SSL_CTX_load_verify_locations(ssl_ctx, ca, NULL);
839
840 return ssl_ctx;
841}

◆ ssl_client_socket()

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

Definition at line 861 of file ssl_tool.c.

862{
863 if (ssl_ctx==NULL) return NULL;
864 //
865 SSL* ssl = SSL_new(ssl_ctx);
866 if (ssl==NULL) {
867 //SSL_CTX_free(ssl_ctx);
868 return NULL;
869 }
870
871 int ret = SSL_set_fd(ssl, sock);
872 if (ret!=1) {
873 ssl_close(ssl);
874 return NULL;
875 }
876
877 // サーバへ接続
878 ret = SSL_connect(ssl);
879 if (ret!=1) {
880 ssl_close(ssl);
881 return NULL;
882 }
883
884 // サーバ証明書のチェック
885 if (mode==ON) {
886 long lrt = SSL_get_verify_result(ssl);
887 if (lrt!=X509_V_OK) {
888 ssl_close(ssl);
889 return NULL;
890 }
891 }
892
893 return ssl;
894}
#define ON
Definition common.h:230
void ssl_close(SSL *ssl)
Definition ssl_tool.c:1083

References ON, and ssl_close().

Here is the call graph for this function:

◆ ssl_close()

void ssl_close ( SSL * ssl)

void ssl_close(SSL* ssl)

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

Parameters
sslクローズする SSL用ストリーム

Definition at line 1083 of file ssl_tool.c.

1084{
1085 if (ssl!=NULL) {
1086 //SSL_CTX* p = ssl->ctx;
1087 SSL_shutdown(ssl);
1088 SSL_free(ssl);
1089 //if (p!=NULL) SSL_CTX_free(p);
1090 }
1091}

Referenced by ssl_client_socket(), and ssl_server_socket().

Here is the caller graph for this function:

◆ ssl_get_cert_info()

tList * ssl_get_cert_info ( SSL * ssl)

tList* ssl_get_cert_info(SSL* ssl)

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

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

Definition at line 1104 of file ssl_tool.c.

1105{
1106 tList* lt;
1107 tList* lp;
1108 char* pp;
1109 char buf[LBUF];
1110 X509* x509;
1111 BIO* bio;
1112
1113 pp = (char*)SSL_get_cipher(ssl);
1114 lt = lp = add_tList_node_str(NULL, "cipher", pp);
1115
1116 pp = (char*)SSL_get_cipher_version(ssl);
1117 lp = add_tList_node_str(lp, "version", pp);
1118
1119 x509 = SSL_get_peer_certificate(ssl);
1120 if (x509==NULL) return lt;
1121
1122 bio = BIO_new(BIO_s_mem());
1123 if (bio==NULL) {
1124 X509_free(x509);
1125 return lt;
1126 }
1127
1128 X509_NAME_print_ex(bio, X509_get_subject_name(x509), 0, XN_FLAG_RFC2253);
1129 BIO_gets(bio, buf, LBUF);
1130 lp = add_tList_node_str(lp, "subject", buf);
1131
1132 X509_NAME_print_ex(bio, X509_get_issuer_name(x509), 0, XN_FLAG_RFC2253);
1133 BIO_gets(bio, buf, LBUF);
1134 lp = add_tList_node_str(lp, "issuer", buf);
1135
1136 ASN1_TIME_print(bio, X509_get_notBefore(x509));
1137 BIO_gets(bio, buf, LBUF);
1138 lp = add_tList_node_str(lp, "before", buf);
1139
1140 ASN1_TIME_print(bio, X509_get_notAfter(x509));
1141 BIO_gets(bio, buf, LBUF);
1142 lp = add_tList_node_str(lp, "after", buf);
1143
1144 BIO_free(bio);
1145 X509_free(x509);
1146
1147 return lt;
1148}
#define LBUF
Definition common.h:146
#define add_tList_node_str(p, k, v)
add_tList_node_bystr()
Definition tlist.h:142

References add_tList_node_str, buf, and LBUF.

◆ ssl_init()

void ssl_init ( )

SSL/TLS 関数

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

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

Definition at line 806 of file ssl_tool.c.

807{
808 SSL_library_init();
809 SSL_load_error_strings();
810}

◆ ssl_read_fullchain_cert_file()

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_ctxSSL_CTX へのポインタ
fileフルチェーンの証明書のファイル名(PEM形式)
Returns
1: 正常終了

Definition at line 995 of file ssl_tool.c.

996{
997 int ret = 0;
998 if (file==NULL) return ret;
999
1000 BIO* bio = NULL;
1001 X509* x509 = NULL;
1002
1003 bio = BIO_new(BIO_s_file());
1004 if (bio==NULL) return ret;
1005 BIO_read_filename(bio, file);
1006
1007 // cert
1008 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
1009 if (x509!=NULL) {
1010 ret = SSL_CTX_use_certificate(ssl_ctx, x509);
1011 }
1012 // chain
1013 if (ret==1) {
1014 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
1015 while(x509!=NULL) {
1016 ret = SSL_CTX_add_extra_chain_cert(ssl_ctx, x509);
1017 x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
1018 }
1019 }
1020
1021 BIO_free(bio);
1022
1023 return ret;
1024}

Referenced by ssl_server_setup().

Here is the caller graph for this function:

◆ ssl_recv()

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

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

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

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

Definition at line 1171 of file ssl_tool.c.

1172{
1173 int cc;
1174
1175 if (ssl==NULL || rmsg==NULL) return JBXL_ARGS_ERROR;
1176
1177 memset(rmsg, 0, size);
1178 cc = SSL_read(ssl, rmsg, size-1);
1179
1180 if (cc<0) cc = JBXL_SSL_RECV_ERROR;
1181 return cc;
1182}
#define JBXL_ARGS_ERROR
不正な引数(NULLなど)
Definition jbxl_state.h:42
#define JBXL_SSL_RECV_ERROR
SSL 受信エラー
Definition jbxl_state.h:122

References JBXL_ARGS_ERROR, and JBXL_SSL_RECV_ERROR.

Referenced by ssl_recv_wait().

Here is the caller graph for this function:

◆ ssl_recv_Buffer()

int ssl_recv_Buffer ( SSL * ssl,
Buffer * str )

int ssl_recv_Buffer(SSL* ssl, Buffer* str)

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

Parameters
sslSSL用ストリーム
str受信用データバッファ.予めメモリを確保しておく.
Return values
1以上受信したバイト数.
0おそらくは相手側がセッションをクローズした.正常切断
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR受信エラー.

Definition at line 1376 of file ssl_tool.c.

1377{
1378 int cc;
1379
1380 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1381
1382 memset(str->buf, 0, str->bufsz);
1383 str->vldsz = 0;
1384 str->state = JBXL_NORMAL;
1385
1386 cc = SSL_read(ssl, str->buf, str->bufsz-1);
1387 if (cc>=0) str->vldsz = cc;
1388 else cc = JBXL_SSL_RECV_ERROR;
1389
1390 return cc;
1391}
#define JBXL_NORMAL
正常
Definition jbxl_state.h:32
int bufsz
確保してあるバッファの大きさ - 1.
Definition buffer.h:36
int state
変数の状態を表す.正常は JBXL_NORMAL
Definition buffer.h:38

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, JBXL_NORMAL, JBXL_SSL_RECV_ERROR, Buffer::state, and Buffer::vldsz.

◆ ssl_recv_Buffer_wait()

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ソケット記述子
sslSSL用ストリーム
str受信用データバッファ.予めメモリを確保しておく.
tmタイムアウト時間.秒単位.
Return values
1以上受信したバイト数.
0おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR受信エラー.
JBXL_NET_RECV_TIMEOUTタイムアウト.

Definition at line 1440 of file ssl_tool.c.

1441{
1442 int cc;
1443
1444 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1445
1446 //memset(str->buf, 0, str->bufsz);
1447 str->vldsz = 0;
1448 cc = ssl_recv_wait(sock, ssl, (char*)str->buf, str->bufsz, tm);
1449 if (cc>=0) str->vldsz = cc;
1450
1451 return cc;
1452}
int ssl_recv_wait(int sock, SSL *ssl, char *mesg, int sz, int tm)
Definition ssl_tool.c:1239

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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ssl_recv_lines_Buffer()

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

Definition at line 1595 of file ssl_tool.c.

1596{
1597 int cc;
1598 Buffer msg, buf;
1599
1600 if (ssl==NULL || mesg==NULL || mesg->buf==NULL) return JBXL_ARGS_ERROR;
1601 buf = make_Buffer(LBUF);
1602
1603 cc = ssl_recv_Buffer_wait(sock, ssl, &buf, tm);
1604 while (cc>0) {
1605 cat_Buffer(&buf, &msg);
1606 if (buf.buf[cc-1]==CHAR_LF) break;
1607 clear_Buffer(&buf);
1608 cc = ssl_recv_Buffer_wait(sock, ssl, &buf, tm);
1609 }
1610 free_Buffer(&buf);
1611
1612 if (cc<=0) {
1613 free_Buffer(mesg);
1614 return cc;
1615 }
1616
1617 return mesg->vldsz;
1618}
void clear_Buffer(Buffer *str)
Buffer型変数 のバッファ部を 0クリアする.
Definition buffer.c:272
int cat_Buffer(Buffer *src, Buffer *dst)
Buffer変数 srcから dstへバッファを catする.
Definition buffer.c:384
int ssl_recv_Buffer_wait(int sock, SSL *ssl, Buffer *str, int tm)
Definition ssl_tool.c:1440
#define CHAR_LF
ラインフィード
Definition tools.h:79

References buf, Buffer::buf, cat_Buffer(), CHAR_LF, clear_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, LBUF, make_Buffer(), ssl_recv_Buffer_wait(), and Buffer::vldsz.

Here is the call graph for this function:

◆ ssl_recv_mstream()

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ソケット記述子
sslSSL用ストリーム
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 1324 of file ssl_tool.c.

1325{
1326 int cc;
1327 unsigned char* pp;
1328
1329 if (ssl==NULL) return JBXL_ARGS_ERROR;
1330 if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
1331 //memset(mesg, 0, sz);
1332
1333 if (sb->buf==NULL) {
1334 *sb = make_mstream(RECVBUFSZ);
1335 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
1336 }
1337
1338 while (sb->datano==0) {
1339 cc = ssl_recv_wait(sock, ssl, mesg, sz, tm);
1340 if (cc<=0) return cc;
1341 put_mstream(sb, (unsigned char*)mesg);
1342 //memset(mesg, 0, sz);
1343 }
1344
1345 pp = get_mstream(sb);
1346 if (pp==NULL) return JBXL_NET_BUF_ERROR;
1347 if (strlen((const char*)pp)>=(unsigned int)sz) {
1348 memcpy(mesg, pp, sz-1);
1349 free(pp);
1350 return JBXL_NET_BUFSZ_ERROR;
1351 }
1352 memcpy(mesg, pp, strlen((const char*)pp));
1353
1354 free(pp);
1355 return strlen(mesg);
1356}
#define RECVBUFSZ
256K
Definition common.h:134
#define JBXL_NET_BUFSZ_ERROR
受信バッファの長さが足りない.はみ出したデータは捨てられた
Definition jbxl_state.h:73
#define JBXL_MALLOC_ERROR
メモリ確保エラー
Definition jbxl_state.h:41
#define JBXL_NET_BUF_ERROR
受信バッファにデータは存在するはずだが,原因不明の理由により獲得に失敗した
Definition jbxl_state.h:72
int put_mstream(mstream *sb, unsigned char *mesg)
メッセージ(文字列)ストリーム sb へメッセージ(の一部)を格納する
Definition tools.c:3490
unsigned char * get_mstream(mstream *sb)
メッセージ(文字列)ストリーム sb から次のメッセージを取り出す.改行コードは削除される.
Definition tools.c:3531
#define make_mstream(s)
make_ringBuffer()
Definition tools.h:385

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().

Here is the call graph for this function:

◆ ssl_recv_mstream_Buffer()

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ソケット記述子
sslSSL用ストリーム
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 1539 of file ssl_tool.c.

1540{
1541 int cc;
1542 unsigned char* pp;
1543
1544 if (ssl==NULL) return JBXL_ARGS_ERROR;
1545 if (mesg==NULL || mesg->buf==NULL || sb==NULL) return JBXL_ARGS_ERROR;
1546 *mesg = make_Buffer(LBUF);
1547
1548 if (sb->buf==NULL) {
1549 *sb = make_mstream(RECVBUFSZ);
1550 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
1551 }
1552
1553 while (sb->datano==0) {
1554 cc = ssl_recv_Buffer_wait(sock, ssl, mesg, tm);
1555 if (cc<=0) {
1556 free_Buffer(mesg);
1557 return cc;
1558 }
1559 put_mstream(sb, mesg->buf);
1560 clear_Buffer(mesg);
1561 }
1562
1563 pp = get_mstream(sb);
1564 if (pp==NULL) return JBXL_NET_BUF_ERROR;
1565 copy_s2Buffer((char*)pp, mesg);
1566 free(pp);
1567
1568 return mesg->vldsz;
1569}
#define copy_s2Buffer(src, dst)
copy_b2Buffer()
Definition buffer.h:108

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.

Here is the call graph for this function:

◆ ssl_recv_wait()

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ソケット記述子
sslSSL用ストリーム
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 1239 of file ssl_tool.c.

1240{
1241 int cc;
1242
1243 if (ssl==NULL || mesg==NULL) return JBXL_ARGS_ERROR;
1244
1245 //memset(mesg, 0, sz);
1246 if (recv_wait(sock, tm)) {
1247 cc = ssl_recv(ssl, mesg, sz);
1248 //if (cc<=0) DEBUG_MODE PRINT_MESG("SSL_RECV_WAIT: Session Closed.\n");
1249 }
1250 else {
1251 //DEBUG_MODE PRINT_MESG("SSL_RECV_WAIT: Time Out. (%ds)\n", tm);
1252 return JBXL_NET_RECV_TIMEOUT;
1253 }
1254
1255 return cc;
1256}
#define JBXL_NET_RECV_TIMEOUT
受信タイムアウト
Definition jbxl_state.h:76
int recv_wait(int sock, int tm)
Definition network.c:1443
int ssl_recv(SSL *ssl, char *rmsg, int size)
Definition ssl_tool.c:1171

References JBXL_ARGS_ERROR, JBXL_NET_RECV_TIMEOUT, recv_wait(), and ssl_recv().

Referenced by ssl_recv_Buffer_wait(), and ssl_recv_mstream().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ssl_send()

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
sslSSL用ストリーム
smsg送信するデータ
size送信するデータ(smsg)のサイズ.サイズが 0以下の場合は smsgは文字列であるとみなす.
Return values
0以上送信バイト数.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信エラー.
See also
also tcp_send()

Definition at line 1202 of file ssl_tool.c.

1203{
1204 int cc;
1205
1206 if (ssl==NULL || smsg==NULL) return JBXL_ARGS_ERROR;
1207
1208 if (size<=0) size = strlen(smsg);
1209 cc = SSL_write(ssl, smsg, size);
1210
1211 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
1212 return cc;
1213}
#define JBXL_SSL_SEND_ERROR
SSL 送信エラー
Definition jbxl_state.h:123

References JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.

Referenced by ssl_send_mesgln().

Here is the caller graph for this function:

◆ ssl_send_Buffer()

int ssl_send_Buffer ( SSL * ssl,
Buffer * str )

int ssl_send_Buffer(SSL* ssl, Buffer* str)

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

Parameters
sslSSL用ストリーム
str送信用データバッファ.
Return values
0以上送信バイト数.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 1406 of file ssl_tool.c.

1407{
1408 int cc;
1409
1410 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1411
1412 if (str->vldsz<0) str->vldsz = strlen((const char*)str->buf);
1413 cc = SSL_write(ssl, str->buf, str->vldsz);
1414
1415 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
1416 return cc;
1417}

References Buffer::buf, JBXL_ARGS_ERROR, JBXL_SSL_SEND_ERROR, and Buffer::vldsz.

◆ ssl_send_mesgln()

int ssl_send_mesgln ( SSL * ssl,
char * mesg )

int ssl_send_mesgln(SSL* ssl, char* mesg)

SSLメッセージ(文字列)に改行(\r\n)を付け加えて送信する.

Parameters
sslSSL用ストリーム
mesg送信用メッセージ
Return values
0以上送信バイト数(改行を含む).
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 1271 of file ssl_tool.c.

1272{
1273 int cc, sz;
1274 char* buf;
1275
1276 if (ssl==NULL || mesg==NULL) return JBXL_ARGS_ERROR;
1277
1278 sz = strlen(mesg) + 3; // for CR+LF+0x00
1279 buf = (char*)malloc(sz);
1280 if (buf==NULL) return JBXL_MALLOC_ERROR;
1281
1282 strncpy(buf, mesg, sz);
1283 strncat(buf, "\r\n", 2);
1284 cc = ssl_send(ssl, buf, strlen(buf));
1285
1286 free(buf);
1287 return cc;
1288}
int ssl_send(SSL *ssl, char *smsg, int size)
Definition ssl_tool.c:1202

References buf, JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, and ssl_send().

Here is the call graph for this function:

◆ ssl_send_sBuffer()

int ssl_send_sBuffer ( SSL * ssl,
Buffer * str )

int ssl_send_sBuffer(SSL* ssl, Buffer* str)

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

Parameters
sslSSL用ストリーム
str送信用メッセージバッファ.
Return values
0以上送信バイト数.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 1467 of file ssl_tool.c.

1468{
1469 int cc;
1470
1471 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1472
1473 cc = SSL_write(ssl, str->buf, strlen((const char*)str->buf));
1474
1475 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
1476 return cc;
1477}

References Buffer::buf, JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.

◆ ssl_send_sBufferln()

int ssl_send_sBufferln ( SSL * ssl,
Buffer * str )

int ssl_send_sBufferln(SSL* ssl, Buffer* str)

SSLメッセージ(文字列)に改行(\r\n)を付け加えて送信する.

Parameters
sslSSL用ストリーム
str送信用メッセージバッファ.
Return values
0以上送信バイト数(改行を含む).
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 1492 of file ssl_tool.c.

1493{
1494 int cc;
1495 Buffer buf;
1496
1497 if (ssl==NULL || str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1498
1499 buf = dup_Buffer(*str);
1500 cat_s2Buffer("\r\n", &buf);
1501 cc = SSL_write(ssl, buf.buf, strlen((const char*)buf.buf));
1502 free_Buffer(&buf);
1503
1504 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
1505 return cc;
1506}
#define cat_s2Buffer(src, dst)
cat_b2Buffer()
Definition buffer.h:122

References buf, Buffer::buf, cat_s2Buffer, dup_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.

Here is the call graph for this function:

◆ ssl_server_setup()

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 912 of file ssl_tool.c.

913{
914 int ret;
915 SSL_CTX* ssl_ctx;
916
917 //
918#if OPENSSL_VERSION_NUMBER < 0x10101000L
919 ssl_ctx = SSL_CTX_new(SSLv23_server_method());
920#else
921 ssl_ctx = SSL_CTX_new(TLS_server_method());
922#endif
923 if (ssl_ctx==NULL) return NULL;
924
925 // サーバ証明書と秘密鍵の読み込み
926 if (crt_fn!=NULL && key_fn!=NULL) {
927 if (chn_fn!=NULL) {
928 ret = SSL_CTX_use_certificate_file(ssl_ctx, crt_fn, SSL_FILETYPE_PEM);
929 }
930 else {
931 ret = ssl_read_fullchain_cert_file(ssl_ctx, crt_fn);
932 }
933
934 if (ret==1) {
935 ret = SSL_CTX_use_PrivateKey_file(ssl_ctx, key_fn, SSL_FILETYPE_PEM);
936 }
937
938 if (ret==1 && chn_fn!=NULL) {
939 ret = ssl_add_chain_file(ssl_ctx, chn_fn);
940 }
941
942 if (ret!=1) {
943 SSL_CTX_free(ssl_ctx);
944 return NULL;
945 }
946
947 //SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL); // Client Certificate
948 //SSL_CTX_set_verify_depth(ssl_ctx, 1);
949 }
950
951 return ssl_ctx;
952}
int ssl_add_chain_file(SSL_CTX *ssl_ctx, char *file)
Definition ssl_tool.c:965
int ssl_read_fullchain_cert_file(SSL_CTX *ssl_ctx, char *file)
Definition ssl_tool.c:995

References ssl_add_chain_file(), and ssl_read_fullchain_cert_file().

Here is the call graph for this function:

◆ ssl_server_socket()

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

Definition at line 1042 of file ssl_tool.c.

1043{
1044 if (ssl_ctx==NULL) return NULL;
1045 int cnt_max = SSL_ACCEPT_COUNT_MAX;
1046
1047 SSL* ssl = SSL_new(ssl_ctx);
1048 if (ssl==NULL) {
1049 //SSL_CTX_free(ssl_ctx);
1050 return NULL;
1051 }
1052
1053 int ret = SSL_set_fd(ssl, sock);
1054 if (ret!=1) {
1055 ssl_close(ssl);
1056 return NULL;
1057 }
1058
1059 int cnt = 0;
1060 SSL_set_accept_state(ssl);
1061 do {
1062 ret = SSL_accept(ssl);
1063 ret = SSL_get_error(ssl, ret);
1064 cnt++;
1065 } while (cnt<=cnt_max && (ret==SSL_ERROR_WANT_READ || ret==SSL_ERROR_WANT_WRITE || ret==SSL_ERROR_SYSCALL));
1066
1067 if (ret==SSL_ERROR_SSL || cnt>cnt_max) {
1068 if (ret!=SSL_ERROR_SSL) ssl_close(ssl);
1069 return NULL;
1070 }
1071
1072 return ssl;
1073}
#define SSL_ACCEPT_COUNT_MAX
Definition ssl_tool.c:1027

References SSL_ACCEPT_COUNT_MAX, and ssl_close().

Here is the call graph for this function:

◆ ssl_tcp_recv()

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ソケット記述子
sslSSL用ストリーム
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 1643 of file ssl_tool.c.

1644{
1645 int cc;
1646
1647 if (rmsg==NULL) return JBXL_ARGS_ERROR;
1648 memset(rmsg, 0, size);
1649
1650 if (ssl!=NULL) cc = SSL_read(ssl, rmsg, size-1);
1651 else cc = recv(sock, rmsg, size-1, 0);
1652
1653 if (cc<0) cc = JBXL_SSL_RECV_ERROR;
1654 return cc;
1655}

References JBXL_ARGS_ERROR, and JBXL_SSL_RECV_ERROR.

Referenced by ssl_tcp_recv_wait().

Here is the caller graph for this function:

◆ ssl_tcp_recv_Buffer()

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ソケット記述子
sslSSL用ストリーム
str受信用データバッファ.予めメモリを確保しておく.
Return values
1以上受信バイト数.
0正常切断
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR受信失敗.

Definition at line 1849 of file ssl_tool.c.

1850{
1851 int cc;
1852
1853 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1854
1855 memset(str->buf, 0, str->bufsz);
1856 str->vldsz = 0;
1857 str->state = JBXL_NORMAL;
1858
1859 if (ssl!=NULL) cc = SSL_read(ssl, str->buf, str->bufsz-1);
1860 else cc = recv(sock, str->buf, str->bufsz-1, 0);
1861
1862 if (cc>=0) str->vldsz = cc;
1863 else cc = JBXL_SSL_RECV_ERROR;
1864 return cc;
1865}

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().

Here is the caller graph for this function:

◆ ssl_tcp_recv_Buffer_tosize()

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ソケット記述子
sslSSL用ストリーム
str受信用データバッファ.予めメモリを確保しておく.
modsize 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK
size目標バイト数.
Return values
1以上受信バイト数.
0正常切断
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR受信失敗.

Definition at line 1951 of file ssl_tool.c.

1952{
1953 int cc, sz;
1954 int modon = FALSE;
1955
1956 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1957 if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
1958
1959 if (modon) memset(mod->buf, 0, mod->vldsz);
1961
1962 sz = str->vldsz;
1963 while (sz<size) {
1964 cc = ssl_tcp_recv_Buffer(sock, ssl, &buf);
1965 if (cc>0) {
1966 cat_Buffer(&buf, str);
1967 sz += cc;
1968 }
1969 else {
1970 if (cc<0) sz = cc;
1971 break;
1972 }
1973 }
1974 free_Buffer(&buf);
1975
1976 if (sz>size && modon) {
1977 copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
1978 str->vldsz = size;
1979 }
1980 return sz;
1981}
int copy_b2Buffer(void *src, Buffer *dst, int len)
任意のバイナリデータsrcを Buffer型変数dstへ lenバイト copyする
Definition buffer.c:518
int ssl_tcp_recv_Buffer(int sock, SSL *ssl, Buffer *str)
Definition ssl_tool.c:1849

References buf, Buffer::buf, cat_Buffer(), copy_b2Buffer(), FALSE, free_Buffer(), JBXL_ARGS_ERROR, make_Buffer(), RECVBUFSZ, ssl_tcp_recv_Buffer(), TRUE, and Buffer::vldsz.

Here is the call graph for this function:

◆ ssl_tcp_recv_Buffer_tosize_wait()

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ソケット記述子
sslSSL用ストリーム
str受信用データバッファ.予めメモリを確保しておく.
modsize 以上受信した場合はここに保存する.予めメモリを確保しておく.NULL でも OK
size目標バイト数.
tmタイムアウト時間.秒単位.
Return values
1以上受信したバイト数.
0おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR受信エラー.
JBXL_NET_RECV_TIMEOUTタイムアウト.

Definition at line 2006 of file ssl_tool.c.

2007{
2008 int cc, sz;
2009 int modon = FALSE;
2010
2011 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
2012 if (mod!=NULL && mod->buf!=NULL) modon = TRUE;
2013
2014 if (modon) memset(mod->buf, 0, mod->vldsz);
2016
2017 sz = str->vldsz;
2018 while (sz<size) {
2019 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, &buf, tm);
2020 if (cc>0) {
2021 cat_Buffer(&buf, str);
2022 sz += cc;
2023 }
2024 else {
2025 if (cc<0) sz = cc;
2026 break;
2027 }
2028 }
2029 free_Buffer(&buf);
2030
2031 if (sz>size && modon) {
2032 copy_b2Buffer((void*)(str->buf+size), mod, sz-size);
2033 str->vldsz = size;
2034 }
2035 return sz;
2036}
int ssl_tcp_recv_Buffer_wait(int sock, SSL *ssl, Buffer *str, int tm)
Definition ssl_tool.c:1920

References buf, Buffer::buf, cat_Buffer(), copy_b2Buffer(), FALSE, free_Buffer(), JBXL_ARGS_ERROR, make_Buffer(), RECVBUFSZ, ssl_tcp_recv_Buffer_wait(), TRUE, and Buffer::vldsz.

Here is the call graph for this function:

◆ ssl_tcp_recv_Buffer_wait()

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ソケット記述子
sslSSL用ストリーム
str受信用データバッファ.予めメモリを確保しておく.
tmタイムアウト時間.秒単位.
Return values
1以上受信したバイト数.
0おそらくは相手側がセッションをクローズした.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_RECV_ERROR受信エラー.
JBXL_NET_RECV_TIMEOUTタイムアウト.

Definition at line 1920 of file ssl_tool.c.

1921{
1922 int cc;
1923
1924 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1925
1926 str->vldsz = 0;
1927 cc = ssl_tcp_recv_wait(sock, ssl, (char*)str->buf, str->bufsz, tm);
1928 if (cc>=0) str->vldsz = cc;
1929
1930 //PRINT_MESG("ssl_tcp_recv_Buffer_wait : %s\n", (char*)str->buf);
1931 return cc;
1932}
int ssl_tcp_recv_wait(int sock, SSL *ssl, char *mesg, int sz, int tm)
Definition ssl_tool.c:1714

References Buffer::buf, Buffer::bufsz, JBXL_ARGS_ERROR, ssl_tcp_recv_wait(), and Buffer::vldsz.

Referenced by ssl_tcp_recv_Buffer_tosize_wait(), ssl_tcp_recv_lines_Buffer(), and ssl_tcp_recv_mstream_Buffer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ssl_tcp_recv_lines_Buffer()

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

Definition at line 2182 of file ssl_tool.c.

2183{
2184 int cc;
2185 Buffer msg, buf;
2186
2187 if (mesg==NULL || mesg->buf==NULL) return JBXL_ARGS_ERROR;
2188 buf = make_Buffer(LBUF);
2189
2190 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, &buf, tm);
2191 while (cc>0) {
2192 cat_Buffer(&buf, &msg);
2193 if (buf.buf[cc-1]==CHAR_LF) break;
2194 clear_Buffer(&buf);
2195 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, &buf, tm);
2196 }
2197 free_Buffer(&buf);
2198
2199 if (cc<=0) {
2200 free_Buffer(mesg);
2201 return cc;
2202 }
2203
2204 return mesg->vldsz;
2205}

References buf, Buffer::buf, cat_Buffer(), CHAR_LF, clear_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, LBUF, make_Buffer(), ssl_tcp_recv_Buffer_wait(), and Buffer::vldsz.

Here is the call graph for this function:

◆ ssl_tcp_recv_mstream()

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ソケット記述子
sslSSL用ストリーム
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 1801 of file ssl_tool.c.

1802{
1803 int cc;
1804 unsigned char* pp;
1805
1806 if (mesg==NULL || sb==NULL) return JBXL_ARGS_ERROR;
1807 //memset(mesg, 0, sz);
1808
1809 if (sb->buf==NULL) {
1810 *sb = make_mstream(RECVBUFSZ);
1811 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
1812 }
1813
1814 while (sb->datano==0) {
1815 cc = ssl_tcp_recv_wait(sock, ssl, mesg, sz, tm);
1816 if (cc<=0) return cc;
1817 put_mstream(sb, (unsigned char*)mesg);
1818 //memset(mesg, 0, sz);
1819 }
1820
1821 pp = get_mstream(sb);
1822 if (pp==NULL) return JBXL_NET_BUF_ERROR;
1823 if (strlen((const char*)pp)>=(unsigned int)sz) {
1824 memcpy(mesg, pp, sz-1);
1825 free(pp);
1826 return JBXL_NET_BUFSZ_ERROR;
1827 }
1828 memcpy(mesg, pp, strlen((const char*)pp));
1829
1830 free(pp);
1831 return strlen(mesg);
1832}

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().

Here is the call graph for this function:

◆ ssl_tcp_recv_mstream_Buffer()

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ソケット記述子
sslSSL用ストリーム
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 2128 of file ssl_tool.c.

2129{
2130 int cc;
2131 unsigned char* pp;
2132
2133 if (mesg==NULL || mesg->buf==NULL || sb==NULL) return JBXL_ARGS_ERROR;
2134 *mesg = make_Buffer(LBUF);
2135
2136 if (sb->buf==NULL) {
2137 *sb = make_mstream(RECVBUFSZ);
2138 if (sb->buf==NULL) return JBXL_MALLOC_ERROR;
2139 }
2140
2141 while (sb->datano==0) {
2142 cc = ssl_tcp_recv_Buffer_wait(sock, ssl, mesg, tm);
2143 if (cc<=0) {
2144 free_Buffer(mesg);
2145 return cc;
2146 }
2147 put_mstream(sb, mesg->buf);
2148 clear_Buffer(mesg);
2149 }
2150
2151 pp = get_mstream(sb);
2152 if (pp==NULL) return JBXL_NET_BUF_ERROR;
2153 copy_s2Buffer((char*)pp, mesg);
2154 free(pp);
2155
2156 return mesg->vldsz;
2157}

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.

Here is the call graph for this function:

◆ ssl_tcp_recv_wait()

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ソケット記述子
sslSSL用ストリーム
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 1714 of file ssl_tool.c.

1715{
1716 int cc;
1717
1718 if (mesg==NULL) return JBXL_ARGS_ERROR;
1719
1720 if (recv_wait(sock, tm)) {
1721 cc = ssl_tcp_recv(sock, ssl, mesg, sz);
1722 //if (cc<=0) DEBUG_MODE PRINT_MESG("SSL_TCP_RECV_WAIT: Session Closed. ret = %d. (%ds)\n", cc, tm);
1723 }
1724 else {
1725 //DEBUG_MODE PRINT_MESG("SSL_TCP_RECV_WAIT: Time Out. (%ds)\n", tm);
1726 return JBXL_NET_RECV_TIMEOUT;
1727 }
1728
1729 return cc;
1730}
int ssl_tcp_recv(int sock, SSL *ssl, char *rmsg, int size)
Definition ssl_tool.c:1643

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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ssl_tcp_send()

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

Definition at line 1676 of file ssl_tool.c.

1677{
1678 int cc;
1679
1680 if (smsg==NULL) return JBXL_ARGS_ERROR;
1681
1682 if (size<=0) size = strlen(smsg);
1683 if (ssl!=NULL) cc = SSL_write(ssl, smsg, size);
1684 else cc = send(sock, smsg, size, 0);
1685
1686 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
1687 return cc;
1688}

References JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.

Referenced by ssl_tcp_send_mesgln().

Here is the caller graph for this function:

◆ ssl_tcp_send_Buffer()

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ソケット記述子
sslSSL用ストリーム
str送信用データバッファ.
Return values
0以上送信バイト数.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 1881 of file ssl_tool.c.

1882{
1883 int cc;
1884
1885 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
1886
1887 if (str->vldsz<0) str->vldsz = strlen((const char*)str->buf);
1888 if (ssl!=NULL) {
1889 cc = SSL_write(ssl, str->buf, str->vldsz);
1890 }
1891 else {
1892 cc = send(sock, str->buf, str->vldsz, 0);
1893 }
1894
1895 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
1896 return cc;
1897}

References Buffer::buf, JBXL_ARGS_ERROR, JBXL_SSL_SEND_ERROR, and Buffer::vldsz.

◆ ssl_tcp_send_mesgln()

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ソケット記述子
sslSSL用ストリーム
mesg送信用メッセージ
Return values
0以上送信バイト数(改行を含む).
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.
JBXL_MALLOC_ERRORメモリエラー.

Definition at line 1747 of file ssl_tool.c.

1748{
1749 int cc, sz;
1750 char* buf;
1751
1752 if (mesg==NULL) return JBXL_ARGS_ERROR;
1753
1754 sz = strlen(mesg) + 3; // for CR+LF+0x00
1755 buf = (char*)malloc(sz);
1756 if (buf==NULL) return JBXL_MALLOC_ERROR;
1757
1758 strncpy(buf, mesg, sz);
1759 strncat(buf, "\r\n", 2);
1760 cc = ssl_tcp_send(sock, ssl, buf, strlen(buf));
1761
1762 free(buf);
1763 return cc;
1764}
int ssl_tcp_send(int sock, SSL *ssl, char *smsg, int size)
Definition ssl_tool.c:1676

References buf, JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, and ssl_tcp_send().

Here is the call graph for this function:

◆ ssl_tcp_send_sBuffer()

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ソケット記述子
sslSSL用ストリーム
str送信用データバッファ.
Return values
0以上送信バイト数.
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 2052 of file ssl_tool.c.

2053{
2054 int cc;
2055
2056 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
2057
2058 if (ssl!=NULL) cc = SSL_write(ssl, str->buf, strlen((const char*)str->buf));
2059 else cc = send(sock, str->buf, strlen((const char*)str->buf), 0);
2060
2061 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
2062 return cc;
2063}

References Buffer::buf, JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.

◆ ssl_tcp_send_sBufferln()

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ソケット記述子
sslSSL用ストリーム
str送信用メッセージバッファ.
Return values
0以上送信バイト数(含む改行).
JBXL_ARGS_ERROR引数に NULLのデータがある.
JBXL_SSL_SEND_ERROR送信失敗.

Definition at line 2079 of file ssl_tool.c.

2080{
2081 int cc;
2082 Buffer buf;
2083
2084 if (str==NULL || str->buf==NULL) return JBXL_ARGS_ERROR;
2085
2086 buf = dup_Buffer(*str);
2087 cat_s2Buffer("\r\n", &buf);
2088
2089 if (ssl!=NULL) cc = SSL_write(ssl, buf.buf, strlen((const char*)buf.buf));
2090 else cc = send(sock, buf.buf, strlen((const char*)buf.buf), 0);
2091
2092 free_Buffer(&buf);
2093
2094 if (cc<0) cc = JBXL_SSL_SEND_ERROR;
2095 return cc;
2096}

References buf, Buffer::buf, cat_s2Buffer, dup_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and JBXL_SSL_SEND_ERROR.

Here is the call graph for this function:

◆ tcp_recv_crypt_Buffer()

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

Definition at line 228 of file ssl_tool.c.

229{
230 Buffer buf;
231
233 int cc = tcp_recv_Buffer(sock, &buf);
234 if (cc<=0) {
236 return cc;
237 }
238
239 if (key!=NULL && cipher!=NULL) {
240 Buffer dec = decode_EVPAPI_Buffer(buf, *key, cipher);
241 copy_Buffer(&dec, data);
242 free_Buffer(&dec);
243 }
244 else {
245 copy_Buffer(&buf, data);
246 }
247
248 cc = data->vldsz;
250 return cc;
251}
int copy_Buffer(Buffer *src, Buffer *dst)
Buffer型変数 srcから dstへバッファをコピーする.
Definition buffer.c:315
int tcp_recv_Buffer(int sock, Buffer *str)
TCP経由でデータを受信する.バッファリングなし.
Definition xtools.c:276

References buf, copy_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer(), RECVBUFSZ, tcp_recv_Buffer(), and Buffer::vldsz.

Here is the call graph for this function:

◆ tcp_send_crypt_Buffer()

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

Definition at line 208 of file ssl_tool.c.

209{
210 int cc = 0;
211 Buffer buf;
212
213 if (data==NULL) return JBXL_ARGS_ERROR;
214
215 if (key!=NULL && cipher!=NULL) {
216 buf = encode_EVPAPI_Buffer(*data, *key, cipher);
217 cc = tcp_send_Buffer(sock, &buf);
219 }
220 else {
221 cc = tcp_send_Buffer(sock, data);
222 }
223
224 return cc;
225}
int tcp_send_Buffer(int sock, Buffer *str)
TCP経由でデータを送信する.
Definition xtools.c:305

References buf, encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and tcp_send_Buffer().

Here is the call graph for this function:

◆ tcp_send_crypt_mesg()

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");
int tcp_send_crypt_mesg(int sock, char *mesg, Buffer *key, EVP_CIPHER *cipher)
Definition ssl_tool.c:298

Definition at line 298 of file ssl_tool.c.

299{
300 int cc = 0;
301 Buffer buf, enc;
302
303 if (mesg==NULL) return JBXL_ARGS_ERROR;
304 //DEBUG_MODE PRINT_ESC(" SEND -> [%s]\n", mesg);
305
306 if (key!=NULL && cipher!=NULL) {
307 buf = make_Buffer_bystr(mesg);
308 enc = encode_EVPAPI_Buffer(buf, *key, cipher);
310 if (enc.vldsz>0) {
312 free_Buffer(&enc);
313
314 //DEBUG_MODE PRINT_ESC("CSEND -> [%s]\n", (char*)buf.buf);
315 cc = tcp_send_sBufferln(sock, &buf);
317 }
318 }
319 else {
320 cc = tcp_send_mesg(sock, mesg);
321 }
322
323 return cc;
324}
#define tcp_send_mesg(s, m)
Definition network.h:184
int tcp_send_sBufferln(int sock, Buffer *str)
TCPメッセージ(文字列)に改行(0x0d, 0x0a)を付け加えて送信する.
Definition xtools.c:546

References buf, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ tcp_send_crypt_sBuffer()

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 351 of file ssl_tool.c.

352{
353 int cc = 0;
354 Buffer buf, enc;
355
356 if (mesg==NULL) return JBXL_ARGS_ERROR;
357 //DEBUG_MODE PRINT_ESC(" SEND -> [%s]\n", (char*)mesg->buf);
358
359 if (key!=NULL && cipher!=NULL) {
360 enc = encode_EVPAPI_Buffer(*mesg, *key, cipher);
361 if (enc.vldsz>0) {
363 free_Buffer(&enc);
364
365 //DEBUG_MODE PRINT_ESC("CSEND -> [%s]\n", (char*)buf.buf);
366 cc = tcp_send_sBufferln(sock, &buf);
368 }
369 }
370 else {
371 cc = tcp_send_sBuffer(sock, mesg);
372 }
373
374 return cc;
375}
int tcp_send_sBuffer(int sock, Buffer *str)
TCP経由で文字列データを送信する.
Definition xtools.c:524

References buf, 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().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ udp_recv_crypt_Buffer()

int udp_recv_crypt_Buffer ( int sock,
Buffer * data,
struct addrinfo * sv,
Buffer * key,
EVP_CIPHER * cipher )

Definition at line 182 of file ssl_tool.c.

183{
184 Buffer buf;
185
187 int cc = udp_recv_Buffer(sock, &buf, sv);
188 if (cc<=0) {
190 return cc;
191 }
192
193 if (key!=NULL && cipher!=NULL) {
194 Buffer dec = decode_EVPAPI_Buffer(buf, *key, cipher);
195 copy_Buffer(&dec, data);
196 free_Buffer(&dec);
197 }
198 else {
199 copy_Buffer(&buf, data);
200 }
201
202 cc = data->vldsz;
204 return cc;
205}
int udp_recv_Buffer(int sock, Buffer *str, struct addrinfo *sv_addr)
recvform()をラッピングした関数.UDPデータを受信する.
Definition xtools.c:212

References buf, copy_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer(), RECVBUFSZ, udp_recv_Buffer(), and Buffer::vldsz.

Here is the call graph for this function:

◆ udp_recv_crypt_Buffer_sockaddr_in()

int udp_recv_crypt_Buffer_sockaddr_in ( int sock,
Buffer * data,
struct sockaddr_in * sv,
Buffer * key,
EVP_CIPHER * cipher )

Definition at line 132 of file ssl_tool.c.

133{
134 Buffer buf;
135
137 int cc = udp_recv_Buffer_sockaddr_in(sock, &buf, sv);
138 if (cc<=0) {
140 return cc;
141 }
142
143 if (key!=NULL && cipher!=NULL) {
144 Buffer dec = decode_EVPAPI_Buffer(buf, *key, cipher);
145 copy_Buffer(&dec, data);
146 free_Buffer(&dec);
147 }
148 else {
149 copy_Buffer(&buf, data);
150 }
151
152 cc = data->vldsz;
154 return cc;
155}
int udp_recv_Buffer_sockaddr_in(int sock, Buffer *str, struct sockaddr_in *sv_addr)
recvform()をラッピングした関数.UDPデータを受信する.IPv4専用.
Definition xtools.c:38

References buf, copy_Buffer(), decode_EVPAPI_Buffer(), free_Buffer(), make_Buffer(), RECVBUFSZ, udp_recv_Buffer_sockaddr_in(), and Buffer::vldsz.

Here is the call graph for this function:

◆ udp_send_crypt_Buffer()

int udp_send_crypt_Buffer ( int sock,
Buffer * data,
struct addrinfo * sv,
Buffer * key,
EVP_CIPHER * cipher )

Definition at line 162 of file ssl_tool.c.

163{
164 int cc = 0;
165 Buffer buf;
166
167 if (data==NULL) return JBXL_ARGS_ERROR;
168
169 if (key!=NULL && cipher!=NULL) {
170 buf = encode_EVPAPI_Buffer(*data, *key, cipher);
171 cc = udp_send_Buffer(sock, &buf, sv);
173 }
174 else {
175 cc = udp_send_Buffer(sock, data, sv);
176 }
177
178 return cc;
179}
int udp_send_Buffer(int sock, Buffer *str, struct addrinfo *sv_addr)
sendto() をラッピングした関数.UDP経由でデータを送る.
Definition xtools.c:248

References buf, encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and udp_send_Buffer().

Here is the call graph for this function:

◆ udp_send_crypt_Buffer_sockaddr_in()

int udp_send_crypt_Buffer_sockaddr_in ( int sock,
Buffer * data,
struct sockaddr_in * sv,
Buffer * key,
EVP_CIPHER * cipher )

Definition at line 112 of file ssl_tool.c.

113{
114 int cc = 0;
115 Buffer buf;
116
117 if (data==NULL) return JBXL_ARGS_ERROR;
118
119 if (key!=NULL && cipher!=NULL) {
120 buf = encode_EVPAPI_Buffer(*data, *key, cipher);
121 cc = udp_send_Buffer_sockaddr_in(sock, &buf, sv);
123 }
124 else {
125 cc = udp_send_Buffer_sockaddr_in(sock, data, sv);
126 }
127
128 return cc;
129}
int udp_send_Buffer_sockaddr_in(int sock, Buffer *str, struct sockaddr_in *sv_addr)
sendto() をラッピングした関数.UDP経由でデータを送る.IPv4専用.
Definition xtools.c:72

References buf, encode_EVPAPI_Buffer(), free_Buffer(), JBXL_ARGS_ERROR, and udp_send_Buffer_sockaddr_in().

Here is the call graph for this function: