■■■ 提供する API ■■■ 
 
  Openssl の API の簡単なラッパーで，socket とほぼ同様のインターフェースを提供します．

  具体的には，以下のデータ構造と関数を提供する C のライブラリです．
  各関数は，名前から類推される通りの機能を提供します．
 
  struct opt_t {
	char *priv_key;
	char *password;
	char *certificate;
	char *ca_cert;
  };

  void    grid_initialize ( const struct opt_t *opt );
  void    grid_finalize ( void );
  int     grid_connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
  int	  grid_bind ( int sockfd, struct sockaddr *my_addr, socklen_t addrlen );
  int  	  grid_listen ( int s, int backlog );
  int     grid_accept ( int s, struct sockaddr *addr, socklen_t *addrlen );
  ssize_t grid_send ( int s, const void *buf, size_t len, int flags );
  ssize_t grid_recv ( int s, void *buf, size_t len, int flags );
  int     grid_shutdown ( int s, int how );

  /* Grid_xxx () functions are same as grid_xxx () functions except that
   * the Grid_xxx () functions abort when they fail. */
  int     Grid_connect( int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen );
  void    Grid_bind ( int sockfd, struct sockaddr *my_addr, socklen_t addrlen );
  void    Grid_listen ( int s, int backlog );
  int     Grid_accept( int s, struct sockaddr *addr , socklen_t *addrlen );
  size_t  Grid_send( int s, const void *buf, size_t len, int flags );
  size_t  Grid_recv( int s, void *buf, size_t len, int flags );

  /* conveninent functions for network programming */
  int  Socket ( int domain, int type, int protocol );
  void Setsockopt_reuseaddr ( int s );
  in_addr_t in_addr_of_hostname ( const char *name );
  struct sockaddr_in create_inet_sockaddr ( in_addr_t in_addr, int port );

  プロセスを立ち上げる時に，ユーザは
    - 自分の秘密鍵 
    - 秘密鍵のパスワード
    - 自分の証明書
    - 自分の証明書を署名した CA の証明書
  を与えるようにします．
   
  ユーザから与えられた情報を元にコネクション確立時に認証を行います．

  今現在は，
  自分が指定された CA を X とすると，
  X 以外の CA によって署名された秘密鍵・証明書を使っている
  プロセスからの connect は拒否するようにしています．

 
■■■ ライブラリのビルド & インストール ■■■ 

  > cvs -d :pserver:anonymous@oop7.is.s.u-tokyo.ac.jp:/roots/phoenix login
  Logging in to :pserver:anonymous@oop7.is.s.u-tokyo.ac.jp:2401/roots/phoenix
  CVS password:  （空パスワード）
 
  > cvs -d :pserver:anonymous@oop7.is.s.u-tokyo.ac.jp:/roots/phoenix co libgrid

  > cd libgrid/

  > ./configure -prefix=$INSTALL_PREFIX

  > make

  > make install 


■■■ ライブラリの使用例 ■■■ 

  Linux ならば 

  > gcc -I$INSTALL_DIR/include -L$INSTALL_DIR/lib -lgrid -lssl foo.c -o foo

  などとすることで，コンパイルすることができます．


  生成された実行ファイルを

  > LD_LIBRARY_PATH=$INSTALL_DIR/lib ./foo

  というように実行することができます．

  sample/sample.c にサンプルコードが置いてあります．


■■■ 鍵・証明書・CAについて ■■■ 
   
  See doc/how_to_ca.txt 
 

■■■ TODO ■■■ 

  - 関数の返り値をきちんと扱う．
     （エラー処理，非ブロッキング関係）

  - grid_finalize ()
    grid_shutdown ()
    grid_get_error_kind ()
    などを実装する．
    
  - 各関数を reentrant にする．

  - 本当にきちんと認証が動いているかの確認
