[BACK]Return to OX-RFC-103.oxw CVS log [TXT][DIR] Up to [local] / OpenXM / doc / OpenXM-specs

File: [local] / OpenXM / doc / OpenXM-specs / OX-RFC-103.oxw (download)

Revision 1.9, Sat Mar 14 01:21:56 2020 UTC (4 years, 1 month ago) by takayama
Branch: MAIN
CVS Tags: HEAD
Changes since 1.8: +195 -195 lines

euc --> utf8.
A note on XQuartz X11 and OX_XTERM_GEOMETRY.

% $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-103.oxw,v 1.9 2020/03/14 01:21:56 takayama Exp $
/*&C

OX-RFC: 103                                   OpenXM committers
                                           
                                              December 9, 2003, 
                                              September 19, 2004
                                              February 4, 2006

*/
//&en  Supplement to OX-RFC-100 
//&en     --- Broadcasting in process trees and engine authentication
//&en     --- Structure of error packets.
//&ja  OX-RFC-100 への追加機能 
//&ja     ---  プロセス木構造での同報とエンジン認証
//&ja     --- エラーパケットの構造.

/*&C 

Status of this memo
  This is an experimental specification. 
  Distribution of this memo is unlimited.

Copyright Notice
  OpenXM.org, 2003, 2004, 2006

*/


/*&ja

@@要約
 この RFC は OpenXM RFC 100 (および 101) の実装により明らかになった種々の問題点をもとに
 RFC 100 プロトコルへの幾つかの追加を提案する.

*/

//&ja @@中断および変数の伝播
//&en @@Propagation of an interruption and a value of a variable

//&ja @@@中断
//&en @@@Interruption

/*&ja

OX RFC 103 では,
エンジンは OX RFC 100 に定義された中断処理を完了したのち,
さらに次の処理をおこなわないといけない. 
上意下達の中断処理:
1. 自分の子供プロセスをすべてリストする
  (たとえば asir の場合は ox_get_serverinfo())
2. 子供プロセスに順番に OpenXM-RFC 100 の中断メッセージを送る.

*/

/*&en

Engines complient to OX RFC 103 must execute the following
procedures after finishing the interruption exception
defined by OX RFC 100. 

1. List all the child processes.
  (For example, use the function ox_get_serverinfo() in case of asir).
2. Send all the child processes the interruption message defined
   OX RFC 100.

*/

//&ja @@@サーバ木の大域変数
//&en @@@Global variable of the tree of the servers

//&ja OX RFC 103 対応のエンジンはエンジン関数 
/*&en
The engines complient to OX RFC 103 implement the engine function
*/
/*&C
   ox103_set_shared_variable(CMO string Name, CMO object value)
*/
/*&ja
を実装している.
この関数が呼ばれると, エンジンスタックマシンの変数 Name に値 value 
が設定され, さらに子どものプロセスすべてのエンジン関数
      ox103_set_shared_variable
をよぶ.
*/
/*&en
When this function is called, 
the value value is assigned to
the variable Name of the engine stackmachine
and the engine calls the function 
       ox103_set_shared_variable
of all the child processes with the same arguments.
*/

/*&ja
たとえば,
この機能は asir-contrib において変数  Xm_noX (ox server 用の debug
window を表示するかしないかのフラグ) の値を同報するのに用いている.
*/
/*&en
For example,
this protocol is used in the asir-contrib
to broad cast the value of the variable  Xm\_noX,
which is the flag of hiding the debug window of an ox server.
*/


//&ja @@新しい CMO
//&en @@New CMO

//&ja @@ファイルへの読み書き
//&en @@File IO

//&ja @@エンジン認証手続き
//&en @@Engine authentication

/*&ja

バイトオーダーを決めるための情報交換 (OX-RFC 100 参照) の前に
エンジン認証手続きをおこなう.

認証プロトコルには下の図の step 1, step 2, step 3 である.


 client                                            server

     ---------------- step 1 ----------------------->
     ssh による server への login.
     controle server, engine server との接続を確立するための
     ポート番号および      -control= ... , -data=...
     認証方法および        -authtype=NONE | <<oneTimePassword>>
     認証パスワード        -passControl=... , -passData=...
     も送信される.
     認証パスワードの暗号  -authEncoding=<<NONE>> | file | RSA
     化方法の指定.
     << >> は src/kxx/ox の標準値


    <----------------  step 2 -------------------------->
       -reverse の場合は <--- の向きに TCP/IP 接続が確立される.
       そうでないときは ---> の向きに TCP/IP 接続が確立される.

    <----------------  step 3 -------------------------->
       -authtype=oneTimePassword の時.
       connect した側が accept した側へ oneTimePassword を送る.
       末尾の 0 を送信する.

    以下 launcher の仕事は終了して, engine と control に制御が移る.
    <----------------  step 4 -------------------------->
       engine の byte order を設定.

    <---------------------------------------------------->
       OpenXM のパケット交換


*/

/*&ja

 authtype は NONE か oneTimePassword である.
 oneTimePassword は英数字で構成された列である.
 oneTimePassword は常にクライアントで生成されて, なんらかの方法でサーバに
 配送される.  connect 側が oneTimePassword を平文で accept 側に送信して
 認証が終了する.

 authEncoding で oneTimePassword の配送方法を規定する.
 authEncoding は NONE か file か RSA である.

 authEncoding=NONE が選択された場合 oneTimePassword の配送に特別な方法を利用
 しない.
 NONE を選択した場合, 現在の ox launcher の実装ではたとえば -passControl
 のあとに oneTimePassword が生の形で現れることとなる.
 Unix の場合これは command の引数であり client と server の通信路が
 ssh 等で暗号化されていたとするとネットワークユーザは覗きみることはできないが,
 同一機のユーザは見ることが可能である.
 したがって NONE の選択が可能であるのは client および server が十分信頼
 できるときに限る.

*/

/*&ja

@@@authEncoding=file の場合.

 authEncoding=file を選択した場合は oneTimePassword は別に用意された安全な
 通信経路(たとえば scp) を用いて file として配送される.
 oneTimePassword が格納された file 名を -passControl, -passData 引数で渡す.
 file 名は $HOME/.openxm/tmp.otp/ からの相対パス名である.
 パスの区切り文字は windows でも / を用いる.
 クライアントは次の規則でファイル名を生成する. 
 ファイル名には英数字と . -  _ の利用しかゆるされない. ファイル名は次の形式
 である.

    clientname-servernameUidPidSerial-time.pass

 ここで time は time(2) の戻り値を数字文字列に変換した形式である.
 oneTimePassword の生成時刻を切り上げて 10 分毎の正時に変換したものとする.
 servernameUidPidSerial は client が oneTimePassword を生成してから
 10 分間, クライアントシステムで高い確率で一意的であることが保証されている
 文字列ならなんでもよい.

 例
      client                                            server

     oneTimePassword 1342546 を格納したファイル
     yama.openxm.org-00001-2312123123.pass   を生成

     oneTimePassword 89123888 を格納したファイル
     yama.openxm.org-00002-2312123124.pass   を生成
     ----------------------------------------------------->
        上の二つのファイルを安全な通信路を用いて配送する.
       (たとえば scp )

     ----------------------------------------------------->
          ox -authtype oneTimePassword
             -authEncoding file
             -passControl yama.openxm.org-00001-2312123123.pass
             -passData yama.openxm.org-00002-2312123124.pass
 

    <----------------  step 2 -------------------------->
       -reverse の場合は <--- の向きに TCP/IP 接続が確立される.
       そうでないときは ---> の向きに TCP/IP 接続が確立される.

    <----------------  step 3 -------------------------->
       connect した側が accept した側へ oneTimePassword を平文でおくる.
     


     oneTimePassword 1342546 を格納したファイル
     yama.openxm.org-00001-2312123123.pass   を server に生成するために
    たとえば sendStringAsAfile(char *servername, char *serveruser,
                  char *filename, char *otp);
    のような API を用意しておくとよいであろう.

*/

/*&ja

@@@authEncoding=RSA の場合.

RSA の秘密鍵, 公開鍵を格納するファイル名は以下のとおり.
$HOME/.openxm/rsa/ox103-rsa0-identity       (秘密鍵をならべたもの)
$HOME/.openxm/rsa/ox103-rsa0-identity.pub   (公開鍵: この形式では利用されず) 
$HOME/.openxm/rsa/ox103-rsa0-authorizedkeys (公開鍵をならべたもの)

鍵ファイルは次のデータを空白で区切って並べたものである.
  user識別子    鍵(10進数字列)    RSAフォーマット識別子(optional)
コメント行は # で始まる.
各データの区切りは 0xd または 0xa または 両方である.

フォーマット識別子が 0 の場合は公開鍵暗号化
x --> x^65537 mod n を用い, 128 byte (1024 bit) づつデータを区切って処理する.
秘密鍵暗号化は  x --> x^d mod n を用いる.
フォーマット識別子 0 は実験用の意味.
秘密鍵は n,d ,  公開鍵は n の形式で n と d は , で区切る.
文字列を送信するときは 0 が文字列終りのマークとなり, 
0 でのこり部分を埋める. バイト列を送るときはデータの長さは別送する.

Todo: 鍵の格納方法, データ区切りの方法など可能な限り 
RFC3447 に準拠するように変更せよ.  準拠が完了したら -rsa0- を 
-rsa- と変更する.

例:

client  側

  ox103-rsa0-identity
     # client 側が使う秘密鍵
     takayama@client.math.kobe-u.ac.jp  1234523....


  ox103-rsa0-authorizedkeys
     @ server 側が使う秘密鍵に対応する公開鍵
     takayama@server.math.kobe-u.ac.jp  8989898....

server 側
  ox103-rsa0-identity
     # server 側が使う秘密鍵
     takayama@server.math.kobe-u.ac.jp  8781234....

  ox103-rsa0-authorizedkeys
     @ client 側が使う秘密鍵に対応する公開鍵
     takayama@client.math.kobe-u.ac.jp  89891....
  
authEncoding=RSA を利用する場合はこれらの鍵を適切に .openxm/rsa の下に
置かないといけない.  .openxm/rsa の permission は rwx------ であること.

注意: 秘密鍵を生で格納しない場合ファイル名を ox103-rsa2-* 等と変更する
予定.  RSA encoding 方法は数字無し, 数字の大きいものから鍵ファイルを
順番にサーチして RSA のフォーマットを決定する.

authEncoding=RSA の場合 -passData および -passControl は
oneTimePassword (文字列) を bit data とみて rsa で暗号化したものを
URL encoding した形で送る.

oneTimePassword の周期は十分大きくないといけない.
一年は 31536000 秒である. 100 年は 3153600000 秒 (10 桁) である.
oneTimePassword は数字の場合 10 桁以上であることが必須であり,
20 桁以上であることが望ましい.

*/

/*&ja

@@@Step 1 が失敗した場合について.

Step 1  の失敗の原因には次のような可能性がある.
1. ssh による remote login の失敗.
2. Remote server のパスに ox100start/ox 等のローンチャが存在しない.
3. Remote server に xterm が存在しないか, 存在しても X サーバの接続に失敗する.
4. Remote server にエンジンが存在しない.
5. Remote server と client の TCP/IP 接続がなんらかの原因で失敗する.

失敗の場合に対応するため,
TCP/IP 接続での Accept 側はタイムアウト動作をすること.


失敗の原因を知らせるプロトコルはきめられていないが, 
実装上の対策として以下のものがある.
1. エラーメッセージを出力して sleep(10); する.
2. エラーメッセージをファイル等に出力する.

なお OX-RFC-101 では Step 1 が分離しているため, エラーの通知がより簡単である.

*/


//&ja @@貢献者および試験実装
//&en @@Contributors and sample implementations

/*&ja
中断および変数の伝播については高山が設計, asir および kan/sm1 への
実装, 評価をおこなった.
(OpenXM/src/asir-contrib/packages/src/oxrfc103.rr,
 OpenXM/src/kan96xx/Doc/oxrfc103.sm1
 をみよ).

エンジン認証手続きの file encoding 法は野呂と高山の議論から生まれた.
エンジン認証手続きは   ox100start, ox に部分実装されている.
  OpenXM/src/kxx/
のファイル群および
  OpenXM/src/kan96xx/Doc/ox.sm1
をみよ.
例:  sm1を起動後,   (ox.sm1) run  asirconnectr
*/

/*&ja
行列, ベクトルの CMO は NTL のサーバ化をテストケースとして
岩根が設計, 実装, 評価を行った.
RSA のキー生成, DES 等の OpenXM crypt ライブラリの実装は岩根がおこなっている.
OpenXM/src/ox_ntl/crypt をみよ.
*/

//&ja @@エラーパケットの構造.
//&en @@Structure of error packets

/*&en
  English translation has not been done.
*/

/*&ja
Error packet は CMO_ARRAY を body 部分とする CMO であるが,
ここではその body 部分の array の構造を定義する.
0 番目の成分は CMO_INT32 である.  エラー発生の原因となったパケット番号.
                                  わからないときは -1.
1 番目の成分は CMO_INT32 である.  CMO_ERROR2 共通エラー番号.
                                  わからないときは -1.
2 番目の成分は CMO_STRING でありエラーメッセージを格納する.
3 番目の成分(optional) が ox-rfc-103 で新しく定義する部分である.
3 番目の成分のデータ型は CMO_ARRAY である. 
Array の各要素はまた長さ 2 の CMO_ARRAY であり,
第一成分が CMO_STRING, 第2成分は CMO オブジェクトである.
第一成分はキーワードが格納され, 第2成分はその値である.
キーワードとして現在次のものを ox-rfc-103 として提案している.
なおサーバは全てのキーワードの値を戻す必要はない.
エラー情報は言語の仕様に依存するため asir_where の用に asir 言語に依存した
形式のエラー情報のわたしかたもある. 今後何通りかの方法に収束していくと予想している.

  reason_of_error,  (CMO_STRING)実行時エラーの理由
  where,   (CMO_ARRAY) 実行時エラーの場所をあらわす CMO_STRING のarray.
  lines,    (CMO_ARRAY) 実行時エラーを起こした行番号(CMO_INT32) のarray.
                        -1 は不明を表す.
  locals,  (CMO_ARRAY) 実行時エラーの時の局所変数の名前と値の 
                       pair(長さ2のarray) の array
  parse_error_at,      (CMO_INT32) parse エラーをおこした行番号.
  reason_of_parse_error,  (CMO_STRING) parse エラーの理由.
  asir_where, (CMO_ARRAY) asir形式のエラー位置情報.
       [場所,関数名,行番号] または [場所,行番号] のリスト.
       負の行番号は意味のない情報でありクライアントは無視すべきである.
*/

/*&C

Example 1.
  [["parse_error_at", 3 ],
   ["reason_of_parse_error","parse error after (x-)"], 
  ]

Example 2.
  [["reason_of_error", "invalid argument"],
   ["where",["shell","length"]],
   ["lines", [15,-1]]
  ]

Example 3.
 ["asir_where"
  [["toplevel", 10],
   ["string","foo",3],          // string は execute_string で渡された string 内を意味する.
   ["/usr/local/lib/OpenXM/asir/lib/afo.rr","abc",4]
  ]
 ]

*/

/*&ja
例2の補足.
   ["where",["shell","length"]],
   ["lines", [15,-1]]
の lines の意味は解説を要するであろう.
[15,-1] の 15 は executeString に与えられた文字列の 15 行目に出現している
関数 shell でエラーが起こったことを意味している.
関数 shell の中から呼ばれている length 関数でエラーが起きているのであるが,
-1 はその行(shell 関数の定義中での相対的な行番号)は不明であるということを
意味している.
*/

//&ja @@参考文献
//&en @@Bibliography

/*&C

[OpenXM-RFC-100]  Design and Implementation of OpenXM Client-Server Model 
                 and Common Mathematical Object Format.  M.Noro, N.Takayama 

[OpenXM-RFC-101] Protocol to Start Engines.  K.Ohara


[RFC3447]  Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography
     Specifications Version 2.1. J. Jonsson, B. Kaliski. February 2003.
     (Format: TXT=143173 bytes) (Obsoletes RFC2437) (Status:
     INFORMATIONAL)

*/