Repository navigation
Expand file tree
/
Copy pathprotocol.txt
More file actions
439 lines (334 loc) · 16 KB
/
Copy pathprotocol.txt
File metadata and controls
439 lines (334 loc) · 16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
(Japanese)
----------------------------------------------------------------------
IP Messenger 通信プロトコル仕様(ドラフト10版) 1996/02/21
Modify 2011/05/03
H.Shirouzu
http://ipmsg.org
----------------------------------------------------------------------
概要
TCP/UDP Port を使用した、メッセージ送受信サービスです
特徴
TCP/IP が使えれば OS の種類を問いません。自分のいるネットワーク
内(および指定のネットワーク)で、動的なメンバ認識ができます。
メッセージ送信そのものは、IP接続している全メンバに対し行えます。
詳細
TCP/UDP ポート(default:2425)を使用して、以下の方法で処理します。
(メッセージ送受信:UDP、ファイル送受信:TCP を使用)
1.コマンド
1) コマンド種類 (command番号(32bit)のうち、下位8bit)
IPMSG_NOOPERATION 無操作
IPMSG_BR_ENTRY サービスにエントリ(起動時にBroadcast)
IPMSG_BR_EXIT サービスから抜ける(終了時にBroadcast)
IPMSG_ANSENTRY エントリを認識したことを通知
IPMSG_BR_ABSENCE 不在モード変更
IPMSG_BR_ISGETLIST ホストリスト送出可能メンバの探索
IPMSG_OKGETLIST ホストリスト送出可能通知
IPMSG_GETLIST ホストリスト送出要求
IPMSG_ANSLIST ホストリスト送出
IPMSG_SENDMSG メッセージの送信
IPMSG_RECVMSG メッセージの受信確認
IPMSG_READMSG 封書の開封通知
IPMSG_DELMSG 封書破棄通知
IPMSG_ANSREADMSG 封書の開封確認(8 版から追加)
IPMSG_GETFILEDATA 添付ファイル要求(TCP で使用)
IPMSG_RELEASEFILES 添付ファイル破棄
IPMSG_GETDIRFILES 添付階層ファイル要求
IPMSG_GETINFO IPMSGバージョン情報取得
IPMSG_SENDINFO IPMSGバージョン情報応答
IPMSG_GETABSENCEINFO 不在通知文取得
IPMSG_SENDABSENCEINFO 不在通知文応答
IPMSG_GETPUBKEY RSA 公開鍵取得
IPMSG_ANSPUBKEY RSA 公開鍵応答
2) オプションフラグ種類 (command番号(32bit)のうち、上位24bit)
IPMSG_ABSENCEOPT 不在モード(メンバ認識系コマンドで使用)
IPMSG_SERVEROPT サーバー(予約)
IPMSG_DIALUPOPT メンバ認識系のコマンドを個別に送り返す
IPMSG_SENDCHECKOPT 送信チェック
IPMSG_SECRETOPT 封書
IPMSG_READCHECKOPT 封書確認(8 版から追加)
IPMSG_PASSWORDOPT 錠前
IPMSG_BROADCASTOPT ブロードキャスト(同報)
IPMSG_MULTICASTOPT マルチキャスト(複数選択)
IPMSG_NEWMULTIOPT ニューバージョンマルチキャスト(予約)
IPMSG_NOLOGOPT ログに残さない(ことを推奨)
IPMSG_NOADDLISTOPT BR_ENTRYしていない一時メンバ通知
IPMSG_AUTORETOPT 自動応答(ピンポン防止用)
IPMSG_FILEATTACHOPT ファイル添付
IPMSG_ENCRYPTOPT 暗号
IPMSG_ENCEXTMSGOPT ファイル添付情報を暗号文に含める
IPMSG_CAPUTF8OPT UTF-8を使用する能力がある
IPMSG_UTF8OPT メッセージ全体に UTF-8を使用している
IPMSG_CLIPBOARDOPT メッセージ画像埋め込み添付をサポート
IPMSG_RETRYOPT 再送フラグ(HOSTLIST 取得時に使用)
3) 暗号拡張部用フラグ (拡張部に組み合わせを hex 表現で使用)
IPMSG_RSA_512 公開鍵(RSA 512bit)暗号能力
IPMSG_RSA_1024 公開鍵(RSA 1024bit)暗号能力
IPMSG_RSA_2048 公開鍵(RSA 2048bit)暗号能力
IPMSG_RC2_40 共通鍵(RC2 40bit)暗号能力
IPMSG_BLOWFISH_128 共通鍵(Blowfish 128bit)暗号能力
IPMSG_AES_256 共通鍵(AES 256bit)暗号能力
IPMSG_PACKETNO_IV 共通鍵暗号の IV に Packet番号文字列を利用
IPMSG_ENCODE_BASE64 暗号文の共通鍵以降の記述に base64 を利用
IPMSG_SIGN_SHA1 平文に SHA1電子署名を付与
4) 添付ファイル拡張用ファイル種類(fileattr下位8bit)
IPMSG_FILE_REGULAR
IPMSG_FILE_DIR
IPMSG_FILE_RETPARENT
IPMSG_FILE_SYMLINK
IPMSG_FILE_CDEV
IPMSG_FILE_BDEV
IPMSG_FILE_FIFO
IPMSG_FILE_RESFORK
5) 添付ファイル拡張用ファイル属性(fileattr上位24bit)
IPMSG_FILE_RONLYOPT
IPMSG_FILE_HIDDENOPT
IPMSG_FILE_EXHIDDENOPT
IPMSG_FILE_ARCHIVEOPT
IPMSG_FILE_SYSTEMOPT
6) 添付ファイル拡張用拡張ファイル属性
IPMSG_FILE_UID
IPMSG_FILE_USERNAME
IPMSG_FILE_GID
IPMSG_FILE_GROUPNAME
IPMSG_FILE_PERM
IPMSG_FILE_MAJORNO
IPMSG_FILE_MINORNO
IPMSG_FILE_CTIME
IPMSG_FILE_MTIME
IPMSG_FILE_ATIME
IPMSG_FILE_CREATETIME
IPMSG_FILE_CREATOR
IPMSG_FILE_FILETYPE
IPMSG_FILE_FINDERINFO
IPMSG_FILE_ACL
IPMSG_FILE_ALIASFNAME
2.コマンドフォーマット(すべて文字列として表現)
1) コマンド(フォーマットバージョン1)
Ver(1) : Packet番号 : 自User名 : 自Host名 : Command番号 : 追加部
2) 現在のコマンドフォーマットによるメッセージの送信文字列例
"1:100:shirouzu:jupiter:32:Hello"
3.コマンド処理概要
1) メンバ認識
起動時に、IPMSG_BR_ENTRY コマンドをブロードキャストし、すでに
立ち上がっているメンバに、新規参加を知らせます。
このブロードキャストにより、すでに立ち上がっているメンバは、
自分の送信先リストに新規参加メンバの情報を追加します。さらに、
IPMSG_ANSENTRY コマンドをその新規参加メンバに対し、返信します。
(備考: Win版では、メンバ数やIPアドレス距離等に基づいて、0-4秒
程度のランダムな待ちを入れています)
新規参加メンバは、この IPMSG_ANSENTRY を受信することにより、
すでに立ち上がっている全メンバの情報を得ることができます。
したがい、IPパケットが失われない限りは、全てのメンバが同一の
送信先リストを保持できるというわけです。
不在モードやニックネームの変更などを、メンバ全員に通知するには、
IPMSG_BR_ABSENCE をブロードキャストします。(IPMSG_BR_ENTRY と
違い、受け取ったメンバは IPMSG_ANSENTRY を返しません)
IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE コマンドでは、
不在モードにあわせて IPMSG_ABSENCEOPT を立てて、コマンドの追加
部にはニックネームを入れます。また、ダイアルアップユーザなど、
ネットワーク指定のブロードキャストが届かないメンバは、さらに、
IPMSG_DIALUPOPT を立てます。このオプションが立っているメンバに
は、メンバ認識系のコマンドを個別に送出します。
(グループ化拡張)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE
において、従来のコマンドフォーマット文字列に続いて('\0'を挟んで)
グループ名を入れることによって、自分の所属(設定)するグループ名
を伝えることができます。
2) メッセージ送受信
メッセージ送信には IPMSG_SENDMSG を使用し、拡張部にメッセージ
本体を入れます。受信側は、IPMSG_SENDCHECKOPT が立っている場合
に限り、IPMSG_RECVMSG を返します。拡張部には元のパケット番号を
入れます。
ブロードキャストによるメッセージ送信は、IPMSG_BOADCASTOPT を
立てた IPMSG_SENDMSG を使用します。(不在通知文など)自動送出
されるパケットには、ピンポン防止のため IPMSG_AUTORETOPT をつけ
ます。どちらかのオプションが立っているパケットには、確認および
自動送出パケットを返しません。
封書で送出するには、IPMSG_SECRETOPT を立てたパケットを送出しま
す。この場合、受信側は開封時に IPMSG_READMSG を送出します。
拡張部には元のパケット番号を入れます。
(追加された、IPMSG_NOADDLISTOPT について)
自分の送信先リストに載っていないホストからの IPMSG_SENDMSG
パケット到着時には、
・ 送信先に IPMSG_BR_ENTRY を送信して、ホスト存在確認を行う
・ 直接自分の送信先リストに加える
のいずれかの処理を行うことにより、エントリー系パケット取りこぼ
しをフォローする実装が考えられます。しかし、エントリーを行わな
い単発メッセージ送信の場合は、これは望ましくない動作ですので、
この場合は受信ホストにそのようなフォロー動作をしないことを推奨
するため、IPMSG_SENDMSG に IPMSG_NOADDLISTOPT フラグを立てます。
(8版で追加された、IPMSG_READCHECKOPT について)
IPMSG_READMSG に、IPMSG_READCHECKOPT がついていた場合、丁度、
IPMSG_SENDMSG における IPMSG_SENDCHECKOPT のように処理します。
ただし、返信には、IPMSG_RECVMSG ではなく、IPMSG_ANSREADMSG
を使用します。
なお、メッセージの画像埋め込みは 4)ファイル添付拡張にて説明。
3) メッセージ送受信-暗号化拡張(9版で追加)
公開鍵(RSA)と共通鍵(AES/Blowfish/RC2)を組み合わせて実現します。
暗号関連の拡張部は原則として、hex フォーマットで表します。
ただし、暗号対応能力(後述)に IPMSG_ENCODE_BASE64 が含まれ
ている暗号メッセージ送信では、共通鍵部分以降の記述について
hex の代わりに、base64 で記述します。(10版で追加)
(公開鍵取得)まず受信側に IPMSG_GETPUBKEY を送信します。相手
から IPMSG_ANSPUBKEY を受け取ることにより、相手側 RSA 公開鍵
を得ます。IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY ともに、拡張部の最初
に自ホストの暗号対応能力(IPMSG_RSA_2048 等)をフラグの OR で
表した値を入れます。
(フラグ詳細は「1. 3) 暗号拡張部用フラグ」をご覧ください)
さらに、IPMSG_ANSPUBKEY では':'を挟んで、公開鍵を EE-NNNNNN
(E=指数、N=法)という形を入れます。E と N の間には '-' を
入れて、区切りにします。
なお、2度目以降の送信時には、公開鍵および暗号対応能力を記憶
することにより、このシーケンスを省略することができます。
(メッセージ暗号化)送信側は、両者でサポートしている共通鍵
種類を選んでセッション用共通鍵を作り、その共通鍵を用いて本文
を暗号化します。さらにその共通鍵を相手側公開鍵で暗号化します。
なお、実装により組み合わせに制限があります(4. その他を参照)
(暗号メッセージ送信)IPMSG_SENDMSG に IPMSG_ENCRYPTOPT を
を立てて、拡張部の最初に、暗号化に使用した公開鍵/共通鍵種類
の組み合わせを OR で表現した値を入れます。続いて、':' を入れ
た後、(これ以降 IPMSG_ENCODE_BASE64 を立てた場合は hex の
代わりに base64 で記述します)、公開鍵で暗号化した共通鍵、
':' を挟んで、共通鍵で暗号化した本文を入れます。
なお、平文には末尾の'\0'を含めます。
(電子署名オプション)両者が SHA-1による電子署名をサポート
している場合、IPMSG_SIGN_SHA1 立てた上で、平文への SHA-1ダイ
ジェスト値を自分自身の秘密鍵で暗号化した署名を、上記の暗号化
本文に続けて ':'をはさんで追加します。
なお、エンコード・パディング方式については、RSA 公開鍵による
暗号/署名では PKCS#1-v1_5、AES/Blowfish/RC2 共通鍵による暗号
化は PKCS#5 CBC を使用します。
IPMSG_PACKETNO_IV が立っている場合、IV は Packet番号文字列を
利用します。(IV サイズより短いため、残りは 0 で補完します)
IPMSG_PACKETNO_IV が立っていない場合、IV は 0 となります。
また、Entry 系パケットには IPMSG_ENCRYPTOPT を立て、暗号機能
をサポート可能であることを表明します。
(公開鍵指紋付ユーザ名)(10版で追加)
2048bitRSA かつ SHA-1 署名が利用可能なユーザは、ユーザIDの
末尾に、公開鍵を利用した指紋(後述)を付与することで、
1) ユーザ名の一意性を保ちやすくする
2) 公開鍵詐称によるなりすましを防ぐ(IPMSG_ANSPUBKEY受信時
に鍵と指紋の一致を確認)
ことができます。
公開鍵指紋付きユーザ名は以下のようにして作成します。
1) 公開鍵の法に対する SHA-1 ダイジェスト値(160bit)を生成
2) 末尾に 32bit の 0 を付与して、192bit の値とする
3) 192bit を 64bit*3つのフィールドに分割し、3つを XORする
4) 64bit値を16文字固定のhex文字列化する
5) ユーザ名の末尾に、ユーザ名-<指紋文字列> の形式で指紋を付加
なお、この公開鍵指紋付ユーザ名を使っているにもかかわらず、
Entry系に IPMSG_ENCRYPTOPT フラグが立っていない、もしくは
IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY での暗号対応能力 に、
IPMSG_RSA_2048/IPMSG_SIGN_SHA1 が含まれていない場合は、
不正パケットとして破棄することを推奨します。
4) ファイル添付拡張(9版で追加)
ファイル添付(ダウンロード許可)通知するには、IPMSG_SENDMSG
に IPMSG_FILEATTACHOPT を立てたメッセージを送信します。
その際、通常(or 暗号)メッセージに続けて、'\0'をはさんで、
添付(ダウンロード許可)ファイル情報を列挙します。
fileID:filename:size:mtime:fileattr[:extend-attr=val1
[,val2...][:extend-attr2=...]]:\a[:]fileID...
(なお、size, mtime, fileattr は hex で表現します。
filenameに':'がある場合、"::"でエスケープします)
受信側が添付ファイルをダウンロードしたい場合、送信元UDPポート
と同じ番号のTCPポートに対して、IPMSG_GETFILEDATA コマンドを使
い、拡張部に packetID:fileID:offset を入れて、データ送信要求
パケットを出します。(すべてhex)
添付側がそのリクエストを受信して、送信要求を正しいと認めると、
その通信路に該当ファイルのデータを流します(フォーマットなし)
受信側が階層添付ファイルをダウンロードしたい場合は、コマンド
に IPMSG_GETDIRFILES を使い、拡張部に packetID:fileID を入れて
データ送信要求パケットを出します。(すべてhex)
データ送信側は、以下のフォーマットで階層データを流します。
header-size:filename:file-size:fileattr[:extend-attr=val1
[,val2...][:extend-attr2=...]]:contents-data
次のheadersize:次のfilename...
(filename と contetns-data 以外はすべて hex)
header-size は header-size の先頭から contents-data の直前の
':'までのサイズをあらわします。extend-attr は省略可かつ複数
存在可能な拡張属性で、'='で対応するデータ値を入れます。
fileattr が IPMSG_FILE_DIR の場合、自動的にそのディレクトリに
潜った状態とみなして、後続のファイル情報が続きます。
fileattr が IPMSG_FILE_RETPARENT の場合、親ディレクトリに戻
ることを表し、ファイル名は常に"."です。このときの属性値は、
親ディレクトリに戻る前の、現在ディレクトリの情報を表します。
送信は添付ディレクトリ自体から開始し、最後に添付ディレクトリ
に戻る IPMSG_FILE_RETPARENT 情報を送信して終了を伝えます。
なお、Entry 系パケットに IPMSG_FILEATTACHOPT を立て、ファイル
添付をサポート可能であることを表明します。
(添付ファイル名暗号化)上記フォーマット内容を、メッセージ平文
末尾から '\0' に続けて記述した後、メッセージ全体の暗号化を行う
ことができます。その場合、Entry系パケットおよび IPMSG_SENDMSG
に IPMSG_ENCEXTMSGOPT を立てます。
(メッセージ画像埋め込み添付)メッセージに貼り付けられた画像
は、通常のファイル添付として送られます。ただし、fileattr に
IPMSG_FILE_CLIPBOARD を指定します。ファイル名フィールドには、
添付したい画像種類の拡張子を含むダミーファイル名を指定します。
通常は PNG を使います。
メッセージへの画像埋め込み位置は、上記の extend-attr=val の形
で IPMSG_FILE_CLIPBOARDPOS=挿入用推奨オフセット位置(文字単位)
を指定します(すべてhex表現)。ただし、複数の画像を挿入する場合、
自画像よりも前に存在する画像も1文字としてカウントします。
なお、メッセージ画像埋め込みをサポートしているホストは、Entry系
パケットに IPMSG_CLIPBOARDOPT を立てます。
5) 多言語(UTF-8)拡張
ファイル送受信を含むメッセージの送受信で UTF-8 での多言語通信を
行えるホストは、IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE
コマンドで IPMSG_CAPUTF8OPT を立てたパケットを流すことで、UTF-8
での送受信が可能であることを表明します。お互いが IPMSG_CAPUTF8OPT
をサポートしている場合、IPMSG_UTF8OPT を立てた上で、メッセージ
(ファイル添付メッセージ部分を含む)を UTF-8 で表現したパケット
を送信することができます。
添付ファイルを受信する場合、元の添付メッセージに IPMSG_UTF8OPT
が立っていれば、同じく IPMSG_UTF8OPT を立てた IPMSG_GETFILEDATA
コマンドで添付ファイル転送要求を送ることで、ファイル名/ディレク
トリ名をUTF-8 で表現したデータを受信することができます。
BR系パケット(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE) に
ついては、IPMSG_UTF8OPT による UTF-8表現は使えません(既存の
非UTF-8クライアントに問題が発生するためです)。そのため、
BR系パケットでは、グループ名拡張の末尾に続いて、\0\n の 2バイト
を付加(グループ名拡張を入れない場合、ダミーのグループ名として
\0 を挿入した後、\0\n を続けます。つまり、\0\0\n となります)
した後、UTF-8 で以下のエントリを追加します。
UN:ユーザ名\n
HN:ホスト名\n
NN:ニックネーム\n
GN:グループ名\n
なお、ASCIIのみで表現可能なエントリや存在しないエントリは
省略して構いません。上記拡張と従来のフィールドが異なる場合、
拡張エントリを正しいものと解釈します。
6) その他のコマンド
他のメンバのバージョンを取得するには、IPMSG_GETINFO コマンド
を送ります。受信側は拡張部にバージョン情報の文字列を設定した
IPMSG_SENDINFO を送り返します。
不在モードメンバの不在通知文を取得するには、IPMSG_GETABSENCEINFO
コマンドを送ります。受信側は、不在モード中なら不在通知文を設定
した、IPMSG_SENDABSENCEINFO を送り返します。不在モード中でない
場合、適当な文字列("Not absence mode"など)を送り返します。
7) 確認・リトライ
一定時間以内に確認パケット(IPMSG_SENDMSG に対する、
IPMSG_RECVMSG など)が受け取れなかった場合、同一のパケットを
再送出します。リトライの回数・間隔については、実装依存です。
4. その他
1) 改行について
送出メッセージ内の改行文字は、UNIX形式に統一します('0x0a')。
必要に応じて、変換を行ってください。
2) デリミタ
デリミタに':'を使っている関係上、ユーザ名、ホスト名領域には、
':'を含む名前は、使えません。万一、自ホスト名が':'を含んでいる
場合、他の文字(たとえば';')などに置き換えて使用してください。
3) 文字コード
IPMSG_UTF8OPT を付与した場合、文字コードは UTF-8、そうでない
場合は、CP932 の使用を想定しています。
4) 暗号化の組み合わせ
プロトコルではありませんが、リファレンス実装の説明ということで、
Windows版では、以下の3つの組み合わせのみサポートしています。
1. IPMSG_RSA_2048 / IPMSG_AES_256 ... (*1)
2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2)
3. IPMSG_RSA_512 / IPMSG_RC2_40
(*1) オプションで IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1 をサポート
(*2) オプションで IPMSG_PACKETNO_IV をサポート
5. 連絡先
http://ipmsg.org に記載しています。
附記
コマンドコードは、ipmsg.hを参照してください。
何かご意見・提案がありましたら、お寄せください。