68user's page 掲示板

Prev< No. 3858〜3876> Next  [最新発言に戻る] [過去ログ一覧]
No. 3858 # 68user 2004/07/13 (火) 15:09:09
>>3856 ニッタン
> 出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。
了解です。

>>3857 つばき
> この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
同じです。
    - ftp なら get するか、put するか
    - rcp なら rcp ./file host: するか rcp host:file . するか
の違いです。

わたしの思う大きな違いは Anounymous ftp という仕組みでファイルを
配布できるのが ftp、そうでないのが rcp。

後は些細な違いしかないと思いますが、それでも 10 や 20 はあげられる
かと思います。課題ということなのでいろいろ調べてみてください。

No. 3859 # samsara 2004/07/13 (火) 15:57:04
はじめまして、ネットワークプログラミングの勉強をしています。
Windows上でネットワーク関連のソフトウェアを作成したことはあるのですが、
ライブラリを使用していた為、SocketAPI等はあまり深い知識がありません。
そこで教えていただきたい事があるのですが、ここの掲示板でよろしいでしょうか?

1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?

参考情報等教えていただきたいと思ってます。宜しくお願い致します。

No. 3860 # tototo 2004/07/13 (火) 16:51:20
順番変更しなければならない理由はないのですが、
PATHの順番を変更するやり方
はあるのかが気になったのため、お聞きしました。

No. 3861 # 68user 2004/07/13 (火) 21:46:58
>>3859 samsara
> 1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/bsd-compatibility.html など。

> 2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?
たとえば
    http://x68000.q-e-d.net/~68user/net/echo-3.html#6
の backlog とか、UDP で受信できる最大サイズを超えた場合の
処理などですかね。より詳しいことを知りたいなら
    http://x68000.q-e-d.net/~68user/net/link-book.html
        「UNIX ネットワークプログラミング第2版 Vol.1」
をどうぞ。後は
    http://apr.apache.org/
などのライブラリのソースの #if 部分をとことん読む、などなど。

>>3860 tototo
> PATHの順番を変更するやり方
    PATH=`echo $PATH | sed 's@/usr/bin:@@'`':/usr/bin'
とか
    for i in `echo $PATH | tr ':' ' '`; do
          いろいろ
    done
とかですかねぇ。

No. 3862 # 68user 2004/07/13 (火) 22:24:51
ここ数ヶ月 (web 引越し前)、マルチポストしたり回答しても返事すら
書かない質問者が多く、困っていました。困るだけならまぁいいんですが、
わたしの web 更新のモチベーションを大いに下げてくれました。

というわけで、↑に書いたとおり、
      http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse
を読まない・読んでも守りたくない人は質問しないでください。
もちろん、これらのルールを守っておられる方々の質問は引き続き
歓迎いたします。

これはマナーではなく、この掲示板のルールであることに注意して
下さい。これが気にいらない方は (当然ながら) この掲示板を見ない
自由があります。

web 引越し後は以前のような不届きな質問者はいなくなったようで、
とてもうれしく思っています。

No. 3863 # samsara 2004/07/13 (火) 23:01:52
68userさま、回答ありがとうございます。
教えていただいたページをじっくり読んでみます。

No. 3864 # 68user 2004/07/14 (水) 02:36:01
>>3845 ニッタン
自分用のメモ。ソースが
    SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method());
    SSL ssl = SSL_new(ctx);
    SSL_connect(ssl);
となっていたとして、

      SSL_CTX *SSL_CTX_new(SSL_METHOD *meth){
            ret->method=meth;

      SSL_METHOD *SSLv23_client_method(void){
            SSLv23_client_data.ssl_connect=ssl23_connect;

      int ssl23_connect(SSL *s)
            ret=ssl23_client_hello(s);

      static int ssl23_client_hello(SSL *s)
            RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE);

      int RAND_pseudo_bytes(unsigned char *buf, int num)
            const RAND_METHOD *meth = RAND_get_rand_method();
            return meth->pseudorand(buf,num); /* (*1) */

      const RAND_METHOD *RAND_get_rand_method(void)
            default_RAND_meth = RAND_SSLeay(); /* (*2) */
            return default_RAND_meth;

      static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num){
            ret = RAND_bytes(buf, num);

      static int ssleay_rand_bytes(unsigned char *buf, int num)
            if (ok){
                  ...
            } else {
                  RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED);

ときて「PRNG not seeded」エラーになる、てな感じですかね。


(*1)
      RAND_METHOD rand_ssleay_meth={
            ssleay_rand_seed,
            ssleay_rand_bytes,
            ssleay_rand_cleanup,
            ssleay_rand_add,
            ssleay_rand_pseudo_bytes,
            ssleay_rand_status
      };

      typedef struct rand_meth_st {
            void (*seed)(const void *buf, int num);
            int (*bytes)(unsigned char *buf, int num);
            void (*cleanup)(void);
            void (*add)(const void *buf, int num, double entropy);
            int (*pseudorand)(unsigned char *buf, int num);
            int (*status)(void);
                } RAND_METHOD;
(*2)
      RAND_METHOD *RAND_SSLeay(void)
            return(&rand_ssleay_meth);

No. 3865 # つばき [E-mail] 2004/07/14 (水) 10:40:53
68user様。回答ありがとうございました。
自分なりに調べまして解決しました。助言を下さってありがとうございます。

No. 3866 # 2004/07/14 (水) 11:17:29
To UNIXの部屋管理者様
もしかすると変なことを行ってるかもしれませんが。
cp -r の項目で以下の解説が有りますが。

-R ディレクトリを再帰的にコピーする
ディレクトリ dir1 以下に、ファイル foo・bar があった場合、
% cp -R dir1 dir2
は、ディレクトリ dir2 の下にディレクトリ dir 1をコピーする。つまり
dir2/dir1/foo、dir2/dir1/foo <<<<<<<<<の二項目はdir2/dir1/barではないでしょうか
というファイルが新たに作成される。一方、
% cp -R dir1/ dir2
とすると(`/'を付けると)、dir2 の下に dir1 以下のファイル・ディレクトリをコピーする。つまり
dir2/foo、dir2/foo <<<<<<<<<同様にの二項目はdir2/barではないでしょうか
というファイルができる。

No. 3867 # ニッタン 2004/07/14 (水) 12:18:27
68userさん、はいそうです。
ここまで調べるのは苦労しませんでしたか?
私はマスタリングTCP/IP SSL/TLS編がなければ
未だに判らなかったと思います。

No. 3868 # jeiu 2004/07/14 (水) 17:44:12
ただいまSLL勉強中です。このHPも参考にさせて頂いています。
つまらない質問ですが初心者の至りということでお許しください。
ネットワークプログラミングの基礎知識 >> RSA で暗号化してみよう (1)に
暗号化のサンプルがありますが、これらの作業はOpenSSLのライブラリの中で
行われている事なのでしょうか。
たとえば、ネットワークプログラミングの基礎知識 >> SSL/TLS でアクセスしてみよう (1)
には暗号化の記述はありませんが実際には指定したプロトコルで暗号化が行われている
と思います。どこで実装されるものなのでしょうか?

No. 3869 # 68user 2004/07/14 (水) 23:15:03
>>3866
ご指摘のとおりかと思います。というわけで、修正しました。
      http://X68000.q-e-d.net/~68user/unix/pickup?cp
ありがとうございました。

>>3867 ニッタン
> ここまで調べるのは苦労しませんでしたか?
調べるのに 3日かかってますので、苦労しました。

でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません (別にこれがわからなくても構わないんですが、
気になるもので)。

>>3868 jeiu
> どこで実装されるものなのでしょうか?
OpenSSL のライブラリの中です。

SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
提示し、サーバがその中から選びます。よって常に RSA が使用される
わけではありません (DH を使う場合もある)。

で、暗号スイートを提示したり、RSA で暗号化・復号化したり、
DH で鍵交換したり、プレマスターシークレットを送ったり、
ということはすべて OpenSSL のライブラリ中で記述されています。

No. 3870 # ニッタン 2004/07/15 (木) 22:09:01
>調べるのに 3日かかってますので、苦労しました。

でしたら、やはりお持ちのマスタリングTCP/IP SSL/TLS編を
辞書的に使いながら追いかける方がいいかもしれませんよ。

>でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません

結局、RAND_poll()内で乱数の種をプロセスIDや/dev/randomなどを使って作成して
RAND_add()しているからだと思います。
RAND_seed()も結局、RAND_add()をしていますし。

No. 3871 # 68user 2004/07/16 (金) 02:33:49
>>3870 ニッタン
/dev/random や /dev/urandom がない環境ではエラーになるが、
RAND_poll() を呼ぶとうまくいくと。

ということはおそらく RAND_poll() を呼ぶと
      http://snapshots.jp.freebsd.org/tour/current/userland/S/7348.html#145
に処理が移ると思います。

# このソースは OpenSSL 0.9.7d です。

ここでは /dev/random や /dev/urandom を読んでいろいろやって
ますが、/dev/random や /dev/urandom がない環境なので、結局は

    unsigned long l;

    l=curr_pid;
    RAND_add(&l,sizeof(l),0);
    l=getuid();
    RAND_add(&l,sizeof(l),0);
    l=time(NULL);
    RAND_add(&l,sizeof(l),0);

だけが実行されると思います。ここで 第三引数の entropy には全て 0 を
渡しています。

RAND_add を呼ぶと ssleay_rand_add が呼ばれ、
      http://snapshots.jp.freebsd.org/tour/current/userland/S/7341.html#190
が実行されます。

    if (ok)
        return(1);
    else
        RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED);

とあるのがエラーになっている箇所かと思います。つまり RAND_poll() を
呼ぶと ok が真になり、RAND_poll() を呼ばないと偽になる、と。ここで
ok とは何かというと

    ok = (entropy >= ENTROPY_NEEDED);

です。ENTROPY_NEEDED は

    ./crypto/rand/rand_lcl.h:#define ENTROPY_NEEDED 32 /* require 256 bits = 32 bytes of randomness */

なので、entropy <= 32 なときに RPNG_NOT_SEEDED でエラーになる。
逆に言えば、RAND_poll() を呼ぶと entropy >= 32 になるためうまく
いくようになる、ということです。しかし entropy を増やしているのは

    entropy += add;

しかないような気がします。でも、add は RAND_add() の第三引数で、
今回はすべて 0 が渡されています。よって、

    entropy += 0;

となるわけです。それなのになぜ entropy が増えて >=32 になるのか
わからないなぁ、といったところで止まっています。

「マスタリングTCP/IP SSL/TLS編」は調べましたが、内部構造には
触れていようで見つけられませんでした。もしどこかに載っていたら
教えてください。

No. 3872 # 68user 2004/07/16 (金) 02:58:19
>>3872 68user
続きです。

こちらには /dev/random・/dev/urandom が存在しない環境がないため、
FreeBSD で OpenSSL のソースをいじって、無理矢理 /dev/random・
/dev/urandom が存在しない状況を作ってみました。その結果、
    PRNG not seeded
なエラーが発生しました。

しかし SSL_connect() の直前に RAND_poll() を挿入しても、同じく
PRNG not seeded となりました。そこで確認させていただきたいのですが、

>>3845 ニッタン
> SSL_connect()するまでに以下の関数のどれかを使うと良い様です。
> 3、RAND_poll()
> 一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。
はそちらの環境では正常に動作しているのですよね?

No. 3873 # jeiu 2004/07/16 (金) 11:57:50
回答ありがとうございます。
もうひとつ教えてください。

>SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
>提示し、サーバがその中から選びます。よって常に RSA が使用される
>わけではありません (DH を使う場合もある)。

クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?

たとえば、SSL V2に対応したアプリケーションとかV3に対応した
アプリケーションとかで決まることなのでしょうか?
または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。

No. 3874 # 68user 2004/07/16 (金) 12:41:39
>>3873 jeiu
> クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?
クライアント作成者が勝手に決めます。例えば 3DES と RC4 はいいけど
DES は暗号強度が気に入らないから使わないとか、MD5 より強固な SHA-1 を
使うとか。

OpenSSL であれば SSL_CTX_set_cipher_list() を使って好きな暗号
スイートをセットすればよいでしょう。

暗号スイートは具体的には
      http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt

    TLS_RSA_WITH_3DES_EDE_CBC_SHA
    TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
などを指します。

上記 RFC の ClientHello がクライアントからの暗号スイートの提示、
ServerHello がサーバからの暗号スイート決定通知、です。

> または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
> 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。
これは意味がわかりませんでした。

No. 3875 # ニッタン 2004/07/16 (金) 12:48:04
誤解を招くような書き方をしてしまいました。
申し訳ありません。
まず、RAND_poll()はRAND_byte()やRAND_status()の始めての呼び出しの際に
一度だけ呼ばれていると思われます。
RAND_poll()内では/dev/random・/dev/urandomを使用して
乱数の種を作っています。

/dev/random・/dev/urandomが存在しない環境でも
上記の様にRAND_poll()は呼ばれていますが、
No.3871の通り
乱数の種は作られません。
そこで、RAND_poll()を自前で呼び出しても同じ結果になります。

つまり、RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDEDのエラーが
発生した時は
RAND_poll()で乱数の種を作成するのに失敗しているので、
自前で乱数の種を作らないといけない
と言った説明を追記して頂ければいいと思います。

自前で乱数の種を作るのが
1、RAND_load_file()

2、RAND_seed()
と言う訳です。

貴重な時間を割かせてしまいまして、申し訳ありませんでした。

No. 3876 # 68user 2004/07/18 (日) 00:14:10
>>3875 ニッタン
更新しました。長らくお待たせしてすいません。
      http://X68000.q-e-d.net/~68user/net/ssl-1.html

詳しく説明しようとして、ドツボにはまった感がありますが、
いかがでしょうか。

RAND_status を呼べばその中から RAND_poll が呼ばれるのですが、
あえて RAND_poll を呼んでいるのは、マニュアルに書いてないこと
はなるべく前提としないでおこう、という方針だからです。

最初のサンプルプログラムがこれではわかりづらすぎるかなぁ。

Prev< No. 3858〜3876> Next  [最新発言に戻る] [過去ログ一覧]