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

Annotation of OpenXM/doc/OpenXM-specs/OX-RFC-103.oxw, Revision 1.9

1.9     ! takayama    1: % $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-103.oxw,v 1.8 2006/03/03 00:43:02 takayama Exp $
1.5       takayama    2: /*&C
                      3:
                      4: OX-RFC: 103                                   OpenXM committers
                      5:
                      6:                                               December 9, 2003,
                      7:                                               September 19, 2004
1.7       takayama    8:                                               February 4, 2006
1.5       takayama    9:
                     10: */
                     11: //&en  Supplement to OX-RFC-100
                     12: //&en     --- Broadcasting in process trees and engine authentication
1.6       takayama   13: //&en     --- Structure of error packets.
1.9     ! takayama   14: //&ja  OX-RFC-100 への追加機能
        !            15: //&ja     ---  プロセス木構造での同報とエンジン認証
        !            16: //&ja     --- エラーパケットの構造.
1.5       takayama   17:
                     18: /*&C
                     19:
                     20: Status of this memo
                     21:   This is an experimental specification.
                     22:   Distribution of this memo is unlimited.
                     23:
                     24: Copyright Notice
1.6       takayama   25:   OpenXM.org, 2003, 2004, 2006
1.5       takayama   26:
                     27: */
1.1       takayama   28:
                     29:
                     30: /*&ja
1.5       takayama   31:
1.9     ! takayama   32: @@要約
        !            33:  この RFC は OpenXM RFC 100 (および 101) の実装により明らかになった種々の問題点をもとに
        !            34:  RFC 100 プロトコルへの幾つかの追加を提案する.
1.5       takayama   35:
1.1       takayama   36: */
                     37:
1.9     ! takayama   38: //&ja @@中断および変数の伝播
1.5       takayama   39: //&en @@Propagation of an interruption and a value of a variable
1.3       takayama   40:
1.9     ! takayama   41: //&ja @@@中断
1.5       takayama   42: //&en @@@Interruption
1.1       takayama   43:
1.2       takayama   44: /*&ja
1.5       takayama   45:
1.9     ! takayama   46: OX RFC 103 では,
        !            47: エンジンは OX RFC 100 に定義された中断処理を完了したのち,
        !            48: さらに次の処理をおこなわないといけない.
        !            49: 上意下達の中断処理:
        !            50: 1. 自分の子供プロセスをすべてリストする
        !            51:   (たとえば asir の場合は ox_get_serverinfo())
        !            52: 2. 子供プロセスに順番に OpenXM-RFC 100 の中断メッセージを送る.
1.5       takayama   53:
1.2       takayama   54: */
                     55:
                     56: /*&en
1.5       takayama   57:
1.2       takayama   58: Engines complient to OX RFC 103 must execute the following
                     59: procedures after finishing the interruption exception
                     60: defined by OX RFC 100.
1.5       takayama   61:
                     62: 1. List all the child processes.
                     63:   (For example, use the function ox_get_serverinfo() in case of asir).
                     64: 2. Send all the child processes the interruption message defined
1.2       takayama   65:    OX RFC 100.
1.5       takayama   66:
1.2       takayama   67: */
1.1       takayama   68:
1.9     ! takayama   69: //&ja @@@サーバ木の大域変数
1.5       takayama   70: //&en @@@Global variable of the tree of the servers
1.3       takayama   71:
1.9     ! takayama   72: //&ja OX RFC 103 対応のエンジンはエンジン関数
1.3       takayama   73: /*&en
                     74: The engines complient to OX RFC 103 implement the engine function
                     75: */
                     76: /*&C
1.5       takayama   77:    ox103_set_shared_variable(CMO string Name, CMO object value)
1.3       takayama   78: */
                     79: /*&ja
1.9     ! takayama   80: を実装している.
        !            81: この関数が呼ばれると, エンジンスタックマシンの変数 Name に値 value
        !            82: が設定され, さらに子どものプロセスすべてのエンジン関数
1.5       takayama   83:       ox103_set_shared_variable
1.9     ! takayama   84: をよぶ.
1.3       takayama   85: */
                     86: /*&en
                     87: When this function is called,
1.5       takayama   88: the value value is assigned to
                     89: the variable Name of the engine stackmachine
1.3       takayama   90: and the engine calls the function
1.5       takayama   91:        ox103_set_shared_variable
1.3       takayama   92: of all the child processes with the same arguments.
                     93: */
                     94:
                     95: /*&ja
1.9     ! takayama   96: たとえば,
        !            97: この機能は asir-contrib において変数  Xm_noX (ox server 用の debug
        !            98: window を表示するかしないかのフラグ) の値を同報するのに用いている.
1.3       takayama   99: */
                    100: /*&en
                    101: For example,
                    102: this protocol is used in the asir-contrib
1.5       takayama  103: to broad cast the value of the variable  Xm\_noX,
1.3       takayama  104: which is the flag of hiding the debug window of an ox server.
                    105: */
                    106:
                    107:
1.9     ! takayama  108: //&ja @@新しい CMO
1.5       takayama  109: //&en @@New CMO
1.1       takayama  110:
1.9     ! takayama  111: //&ja @@ファイルへの読み書き
1.5       takayama  112: //&en @@File IO
1.1       takayama  113:
1.9     ! takayama  114: //&ja @@エンジン認証手続き
1.5       takayama  115: //&en @@Engine authentication
1.1       takayama  116:
1.2       takayama  117: /*&ja
1.5       takayama  118:
1.9     ! takayama  119: バイトオーダーを決めるための情報交換 (OX-RFC 100 参照) の前に
        !           120: エンジン認証手続きをおこなう.
1.4       takayama  121:
1.9     ! takayama  122: 認証プロトコルには下の図の step 1, step 2, step 3 である.
1.4       takayama  123:
                    124:
                    125:  client                                            server
                    126:
                    127:      ---------------- step 1 ----------------------->
1.9     ! takayama  128:      ssh による server への login.
        !           129:      controle server, engine server との接続を確立するための
        !           130:      ポート番号および      -control= ... , -data=...
        !           131:      認証方法および        -authtype=NONE | <<oneTimePassword>>
        !           132:      認証パスワード        -passControl=... , -passData=...
        !           133:      も送信される.
        !           134:      認証パスワードの暗号  -authEncoding=<<NONE>> | file | RSA
        !           135:      化方法の指定.
        !           136:      << >> は src/kxx/ox の標準値
1.4       takayama  137:
                    138:
                    139:     <----------------  step 2 -------------------------->
1.9     ! takayama  140:        -reverse の場合は <--- の向きに TCP/IP 接続が確立される.
        !           141:        そうでないときは ---> の向きに TCP/IP 接続が確立される.
1.4       takayama  142:
                    143:     <----------------  step 3 -------------------------->
1.9     ! takayama  144:        -authtype=oneTimePassword の時.
        !           145:        connect した側が accept した側へ oneTimePassword を送る.
        !           146:        末尾の 0 を送信する.
1.4       takayama  147:
1.9     ! takayama  148:     以下 launcher の仕事は終了して, engine と control に制御が移る.
1.4       takayama  149:     <----------------  step 4 -------------------------->
1.9     ! takayama  150:        engine の byte order を設定.
1.4       takayama  151:
                    152:     <---------------------------------------------------->
1.9     ! takayama  153:        OpenXM のパケット交換
1.4       takayama  154:
1.5       takayama  155:
1.4       takayama  156: */
                    157:
                    158: /*&ja
                    159:
1.9     ! takayama  160:  authtype は NONE か oneTimePassword である.
        !           161:  oneTimePassword は英数字で構成された列である.
        !           162:  oneTimePassword は常にクライアントで生成されて, なんらかの方法でサーバに
        !           163:  配送される.  connect 側が oneTimePassword を平文で accept 側に送信して
        !           164:  認証が終了する.
1.4       takayama  165:
1.9     ! takayama  166:  authEncoding で oneTimePassword の配送方法を規定する.
        !           167:  authEncoding は NONE か file か RSA である.
1.4       takayama  168:
1.9     ! takayama  169:  authEncoding=NONE が選択された場合 oneTimePassword の配送に特別な方法を利用
        !           170:  しない.
        !           171:  NONE を選択した場合, 現在の ox launcher の実装ではたとえば -passControl
        !           172:  のあとに oneTimePassword が生の形で現れることとなる.
        !           173:  Unix の場合これは command の引数であり client と server の通信路が
        !           174:  ssh 等で暗号化されていたとするとネットワークユーザは覗きみることはできないが,
        !           175:  同一機のユーザは見ることが可能である.
        !           176:  したがって NONE の選択が可能であるのは client および server が十分信頼
        !           177:  できるときに限る.
1.4       takayama  178:
                    179: */
                    180:
                    181: /*&ja
                    182:
1.9     ! takayama  183: @@@authEncoding=file の場合.
1.4       takayama  184:
1.9     ! takayama  185:  authEncoding=file を選択した場合は oneTimePassword は別に用意された安全な
        !           186:  通信経路(たとえば scp) を用いて file として配送される.
        !           187:  oneTimePassword が格納された file 名を -passControl, -passData 引数で渡す.
        !           188:  file 名は $HOME/.openxm/tmp.otp/ からの相対パス名である.
        !           189:  パスの区切り文字は windows でも / を用いる.
        !           190:  クライアントは次の規則でファイル名を生成する.
        !           191:  ファイル名には英数字と . -  _ の利用しかゆるされない. ファイル名は次の形式
        !           192:  である.
1.4       takayama  193:
                    194:     clientname-servernameUidPidSerial-time.pass
                    195:
1.9     ! takayama  196:  ここで time は time(2) の戻り値を数字文字列に変換した形式である.
        !           197:  oneTimePassword の生成時刻を切り上げて 10 分毎の正時に変換したものとする.
        !           198:  servernameUidPidSerial は client が oneTimePassword を生成してから
        !           199:  10 分間, クライアントシステムで高い確率で一意的であることが保証されている
        !           200:  文字列ならなんでもよい.
1.4       takayama  201:
1.9     ! takayama  202:  例
1.4       takayama  203:       client                                            server
                    204:
1.9     ! takayama  205:      oneTimePassword 1342546 を格納したファイル
        !           206:      yama.openxm.org-00001-2312123123.pass   を生成
1.4       takayama  207:
1.9     ! takayama  208:      oneTimePassword 89123888 を格納したファイル
        !           209:      yama.openxm.org-00002-2312123124.pass   を生成
1.4       takayama  210:      ----------------------------------------------------->
1.9     ! takayama  211:         上の二つのファイルを安全な通信路を用いて配送する.
        !           212:        (たとえば scp )
1.4       takayama  213:
                    214:      ----------------------------------------------------->
                    215:           ox -authtype oneTimePassword
                    216:              -authEncoding file
                    217:              -passControl yama.openxm.org-00001-2312123123.pass
                    218:              -passData yama.openxm.org-00002-2312123124.pass
                    219:
                    220:
                    221:     <----------------  step 2 -------------------------->
1.9     ! takayama  222:        -reverse の場合は <--- の向きに TCP/IP 接続が確立される.
        !           223:        そうでないときは ---> の向きに TCP/IP 接続が確立される.
1.4       takayama  224:
                    225:     <----------------  step 3 -------------------------->
1.9     ! takayama  226:        connect した側が accept した側へ oneTimePassword を平文でおくる.
1.4       takayama  227:
                    228:
                    229:
1.9     ! takayama  230:      oneTimePassword 1342546 を格納したファイル
        !           231:      yama.openxm.org-00001-2312123123.pass   を server に生成するために
        !           232:     たとえば sendStringAsAfile(char *servername, char *serveruser,
1.4       takayama  233:                   char *filename, char *otp);
1.9     ! takayama  234:     のような API を用意しておくとよいであろう.
1.4       takayama  235:
                    236: */
                    237:
                    238: /*&ja
                    239:
1.9     ! takayama  240: @@@authEncoding=RSA の場合.
1.4       takayama  241:
1.9     ! takayama  242: RSA の秘密鍵, 公開鍵を格納するファイル名は以下のとおり.
        !           243: $HOME/.openxm/rsa/ox103-rsa0-identity       (秘密鍵をならべたもの)
        !           244: $HOME/.openxm/rsa/ox103-rsa0-identity.pub   (公開鍵: この形式では利用されず)
        !           245: $HOME/.openxm/rsa/ox103-rsa0-authorizedkeys (公開鍵をならべたもの)
1.4       takayama  246:
1.9     ! takayama  247: 鍵ファイルは次のデータを空白で区切って並べたものである.
        !           248:   user識別子    鍵(10進数字列)    RSAフォーマット識別子(optional)
        !           249: コメント行は # で始まる.
        !           250: 各データの区切りは 0xd または 0xa または 両方である.
1.4       takayama  251:
1.9     ! takayama  252: フォーマット識別子が 0 の場合は公開鍵暗号化
        !           253: x --> x^65537 mod n を用い, 128 byte (1024 bit) づつデータを区切って処理する.
        !           254: 秘密鍵暗号化は  x --> x^d mod n を用いる.
        !           255: フォーマット識別子 0 は実験用の意味.
        !           256: 秘密鍵は n,d ,  公開鍵は n の形式で n と d は , で区切る.
        !           257: 文字列を送信するときは 0 が文字列終りのマークとなり,
        !           258: 0 でのこり部分を埋める. バイト列を送るときはデータの長さは別送する.
1.4       takayama  259:
1.9     ! takayama  260: Todo: 鍵の格納方法, データ区切りの方法など可能な限り
        !           261: RFC3447 に準拠するように変更せよ.  準拠が完了したら -rsa0- を
        !           262: -rsa- と変更する.
1.4       takayama  263:
1.9     ! takayama  264: 例:
1.4       takayama  265:
1.9     ! takayama  266: client  側
1.4       takayama  267:
                    268:   ox103-rsa0-identity
1.9     ! takayama  269:      # client 側が使う秘密鍵
1.4       takayama  270:      takayama@client.math.kobe-u.ac.jp  1234523....
                    271:
                    272:
                    273:   ox103-rsa0-authorizedkeys
1.9     ! takayama  274:      @ server 側が使う秘密鍵に対応する公開鍵
1.4       takayama  275:      takayama@server.math.kobe-u.ac.jp  8989898....
                    276:
1.9     ! takayama  277: server 側
1.4       takayama  278:   ox103-rsa0-identity
1.9     ! takayama  279:      # server 側が使う秘密鍵
1.4       takayama  280:      takayama@server.math.kobe-u.ac.jp  8781234....
                    281:
                    282:   ox103-rsa0-authorizedkeys
1.9     ! takayama  283:      @ client 側が使う秘密鍵に対応する公開鍵
1.4       takayama  284:      takayama@client.math.kobe-u.ac.jp  89891....
                    285:
1.9     ! takayama  286: authEncoding=RSA を利用する場合はこれらの鍵を適切に .openxm/rsa の下に
        !           287: 置かないといけない.  .openxm/rsa の permission は rwx------ であること.
1.4       takayama  288:
1.9     ! takayama  289: 注意: 秘密鍵を生で格納しない場合ファイル名を ox103-rsa2-* 等と変更する
        !           290: 予定.  RSA encoding 方法は数字無し, 数字の大きいものから鍵ファイルを
        !           291: 順番にサーチして RSA のフォーマットを決定する.
1.4       takayama  292:
1.9     ! takayama  293: authEncoding=RSA の場合 -passData および -passControl は
        !           294: oneTimePassword (文字列) を bit data とみて rsa で暗号化したものを
        !           295: URL encoding した形で送る.
1.4       takayama  296:
1.9     ! takayama  297: oneTimePassword の周期は十分大きくないといけない.
        !           298: 一年は 31536000 秒である. 100 年は 3153600000 秒 (10 桁) である.
        !           299: oneTimePassword は数字の場合 10 桁以上であることが必須であり,
        !           300: 20 桁以上であることが望ましい.
1.5       takayama  301:
                    302: */
                    303:
                    304: /*&ja
                    305:
1.9     ! takayama  306: @@@Step 1 が失敗した場合について.
1.5       takayama  307:
1.9     ! takayama  308: Step 1  の失敗の原因には次のような可能性がある.
        !           309: 1. ssh による remote login の失敗.
        !           310: 2. Remote server のパスに ox100start/ox 等のローンチャが存在しない.
        !           311: 3. Remote server に xterm が存在しないか, 存在しても X サーバの接続に失敗する.
        !           312: 4. Remote server にエンジンが存在しない.
        !           313: 5. Remote server と client の TCP/IP 接続がなんらかの原因で失敗する.
1.5       takayama  314:
1.9     ! takayama  315: 失敗の場合に対応するため,
        !           316: TCP/IP 接続での Accept 側はタイムアウト動作をすること.
1.5       takayama  317:
                    318:
1.9     ! takayama  319: 失敗の原因を知らせるプロトコルはきめられていないが,
        !           320: 実装上の対策として以下のものがある.
        !           321: 1. エラーメッセージを出力して sleep(10); する.
        !           322: 2. エラーメッセージをファイル等に出力する.
1.5       takayama  323:
1.9     ! takayama  324: なお OX-RFC-101 では Step 1 が分離しているため, エラーの通知がより簡単である.
1.4       takayama  325:
1.2       takayama  326: */
                    327:
1.5       takayama  328:
1.9     ! takayama  329: //&ja @@貢献者および試験実装
1.5       takayama  330: //&en @@Contributors and sample implementations
1.2       takayama  331:
                    332: /*&ja
1.9     ! takayama  333: 中断および変数の伝播については高山が設計, asir および kan/sm1 への
        !           334: 実装, 評価をおこなった.
1.5       takayama  335: (OpenXM/src/asir-contrib/packages/src/oxrfc103.rr,
                    336:  OpenXM/src/kan96xx/Doc/oxrfc103.sm1
1.9     ! takayama  337:  をみよ).
1.5       takayama  338:
1.9     ! takayama  339: エンジン認証手続きの file encoding 法は野呂と高山の議論から生まれた.
        !           340: エンジン認証手続きは   ox100start, ox に部分実装されている.
1.5       takayama  341:   OpenXM/src/kxx/
1.9     ! takayama  342: のファイル群および
1.5       takayama  343:   OpenXM/src/kan96xx/Doc/ox.sm1
1.9     ! takayama  344: をみよ.
        !           345: 例:  sm1を起動後,   (ox.sm1) run  asirconnectr
1.3       takayama  346: */
                    347:
                    348: /*&ja
1.9     ! takayama  349: 行列, ベクトルの CMO は NTL のサーバ化をテストケースとして
        !           350: 岩根が設計, 実装, 評価を行った.
        !           351: RSA のキー生成, DES 等の OpenXM crypt ライブラリの実装は岩根がおこなっている.
        !           352: OpenXM/src/ox_ntl/crypt をみよ.
1.6       takayama  353: */
                    354:
1.9     ! takayama  355: //&ja @@エラーパケットの構造.
1.6       takayama  356: //&en @@Structure of error packets
                    357:
                    358: /*&en
                    359:   English translation has not been done.
                    360: */
                    361:
                    362: /*&ja
1.9     ! takayama  363: Error packet は CMO_ARRAY を body 部分とする CMO であるが,
        !           364: ここではその body 部分の array の構造を定義する.
        !           365: 0 番目の成分は CMO_INT32 である.  エラー発生の原因となったパケット番号.
        !           366:                                   わからないときは -1.
        !           367: 1 番目の成分は CMO_INT32 である.  CMO_ERROR2 共通エラー番号.
        !           368:                                   わからないときは -1.
        !           369: 2 番目の成分は CMO_STRING でありエラーメッセージを格納する.
        !           370: 3 番目の成分(optional) が ox-rfc-103 で新しく定義する部分である.
        !           371: 3 番目の成分のデータ型は CMO_ARRAY である.
        !           372: Array の各要素はまた長さ 2 の CMO_ARRAY であり,
        !           373: 第一成分が CMO_STRING, 第2成分は CMO オブジェクトである.
        !           374: 第一成分はキーワードが格納され, 第2成分はその値である.
        !           375: キーワードとして現在次のものを ox-rfc-103 として提案している.
        !           376: なおサーバは全てのキーワードの値を戻す必要はない.
        !           377: エラー情報は言語の仕様に依存するため asir_where の用に asir 言語に依存した
        !           378: 形式のエラー情報のわたしかたもある. 今後何通りかの方法に収束していくと予想している.
        !           379:
        !           380:   reason_of_error,  (CMO_STRING)実行時エラーの理由
        !           381:   where,   (CMO_ARRAY) 実行時エラーの場所をあらわす CMO_STRING のarray.
        !           382:   lines,    (CMO_ARRAY) 実行時エラーを起こした行番号(CMO_INT32) のarray.
        !           383:                         -1 は不明を表す.
        !           384:   locals,  (CMO_ARRAY) 実行時エラーの時の局所変数の名前と値の
        !           385:                        pair(長さ2のarray) の array
        !           386:   parse_error_at,      (CMO_INT32) parse エラーをおこした行番号.
        !           387:   reason_of_parse_error,  (CMO_STRING) parse エラーの理由.
        !           388:   asir_where, (CMO_ARRAY) asir形式のエラー位置情報.
        !           389:        [場所,関数名,行番号] または [場所,行番号] のリスト.
        !           390:        負の行番号は意味のない情報でありクライアントは無視すべきである.
1.6       takayama  391: */
                    392:
                    393: /*&C
                    394:
                    395: Example 1.
                    396:   [["parse_error_at", 3 ],
                    397:    ["reason_of_parse_error","parse error after (x-)"],
                    398:   ]
                    399:
                    400: Example 2.
                    401:   [["reason_of_error", "invalid argument"],
                    402:    ["where",["shell","length"]],
                    403:    ["lines", [15,-1]]
                    404:   ]
1.8       takayama  405:
                    406: Example 3.
                    407:  ["asir_where"
                    408:   [["toplevel", 10],
1.9     ! takayama  409:    ["string","foo",3],          // string は execute_string で渡された string 内を意味する.
1.8       takayama  410:    ["/usr/local/lib/OpenXM/asir/lib/afo.rr","abc",4]
                    411:   ]
                    412:  ]
1.6       takayama  413:
                    414: */
                    415:
                    416: /*&ja
1.9     ! takayama  417: 例2の補足.
1.6       takayama  418:    ["where",["shell","length"]],
                    419:    ["lines", [15,-1]]
1.9     ! takayama  420: の lines の意味は解説を要するであろう.
        !           421: [15,-1] の 15 は executeString に与えられた文字列の 15 行目に出現している
        !           422: 関数 shell でエラーが起こったことを意味している.
        !           423: 関数 shell の中から呼ばれている length 関数でエラーが起きているのであるが,
        !           424: -1 はその行(shell 関数の定義中での相対的な行番号)は不明であるということを
        !           425: 意味している.
1.2       takayama  426: */
1.1       takayama  427:
1.9     ! takayama  428: //&ja @@参考文献
1.5       takayama  429: //&en @@Bibliography
                    430:
                    431: /*&C
                    432:
                    433: [OpenXM-RFC-100]  Design and Implementation of OpenXM Client-Server Model
                    434:                  and Common Mathematical Object Format.  M.Noro, N.Takayama
                    435:
                    436: [OpenXM-RFC-101] Protocol to Start Engines.  K.Ohara
                    437:
                    438:
                    439: [RFC3447]  Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography
                    440:      Specifications Version 2.1. J. Jonsson, B. Kaliski. February 2003.
                    441:      (Format: TXT=143173 bytes) (Obsoletes RFC2437) (Status:
                    442:      INFORMATIONAL)
                    443:
                    444: */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>