SAORI の呼び出し¶
里々は、() の中から SAORI を呼び出せます。
登録¶
satori_conf.txt の @SAORI に、1 行に 1 つ、次の形式で書きます。
@SAORI
呼び出し名,相対パス,定義済み引数1,定義済み引数2,…
| 項目 | 内容 |
|---|---|
| 呼び出し名 | () の中で使う名前 |
| 相対パス | SAORI のファイルの、ゴーストの master フォルダからの相対パス |
| 定義済み引数 | 呼び出しのたびに、先頭に付けて渡す引数(省略可) |
- 同じ呼び出し名を複数登録するとエラーになります。
- 実行中に登録するときは load_saori を使います。
saori/ssu.dllを指定すると、内蔵の ssu が使われます(登録しなくても、ssu の関数名は自動で登録されます)。saori/internal_crypto.dllのように、実体のないinternal_で始まる名前を指定すると、本体(SSP)が内蔵するモジュールを呼べます(本体の内蔵モジュール。Mc205-1以降)。Mc205-2以降は、登録しなくても(internal_crypto、…)のようにモジュール名で呼べます(登録なしの呼び出し)。
種類¶
| 種類 | 条件 | 動作 |
|---|---|---|
| SAORI/1.0(universal) | 拡張子が .dll |
DLL を読み込み、GET Version で SAORI/1.0 を確認して使う |
| SAORI over DirectSSTP | 拡張子が .dll で、ファイルがなく、名前が internal_ で始まる(または本体が互換の機能を内蔵する SAORI の名前) |
DLL を読まず、呼び出しのたびに本体へ要求を送る(Mc205-1以降) |
| SAORI basic | 拡張子が .dll 以外(.exe など) |
実行ファイルを、引数をコマンドラインに並べて起動し、標準出力を結果にする。SecurityLevel が local のときだけ |
呼び出し¶
(呼び出し名、引数1、引数2、…)
- 引数は SAORI 引数の計算の設定によって、先に整数の式として計算されることがあります。
- リクエストの
Argument0から、定義済み引数、()の引数の順に渡されます。 - 結果(
Result)が()の展開結果になり、Value0… は(S0)… に入ります((Sの数)が個数)。 - 結果に
()が含まれていれば、もう一度展開されます。 SecurityLevelは、里々の実行権限(localまたはexternal)を渡します。
通信¶
- 里々から SAORI へは
Charset: UTF-8で送ります。SAORI がloaduをエクスポートしていれば UTF-8 のパスで、なければ従来のloadで呼びます。 GET Versionの応答のCharsetが、送ろうとしたUTF-8と違う SAORI(葉梨のhanasi.dllのように、Charset: Shift_JISを返しつつ常に Shift_JIS で読み書きするもの)には、Mc203-5以降、応答の文字コードで送ります。それまでは UTF-8 で送っていたため文字化けしていました。GET Versionの応答にCharsetヘッダがない(または空の)SAORI には、Mc203-2以降、ACP 版と同じくCharset: Shift_JISで送ります。華和梨の SAORI モードのように、Charsetヘッダを見ずに Shift_JIS として読む SAORI があるためです。Shift_JIS にない文字(絵文字など)は?になります。GET Versionの応答にCharsetヘッダがない(または空の)SAORI には、Mc201-9以降、直後に何もしないEXECUTE(Argument0が空)を 1 回送り、応答を読み捨てます。YAYA as SAORI の古いayasaori.aymは、GET VersionでCharsetを返さず、その後の最初のEXECUTEだけ文字コードの設定が合わずに文字化けするためです。ayasaori.aymをyaya-as-saoriの現行版に差し替えれば、この呼び出しは行われません。- 応答は、応答の
Charsetヘッダに従って読みます。ヘッダがなければ、Shift_JIS で送った SAORI の応答は Shift_JIS として、それ以外は内容で判定して読みます(Mc203-2以降)。
本体の内蔵モジュール¶
Mc205-1以降、本体が内蔵する機能(ハッシュ・暗号・乱数・日時の計算など)を、DLL なしの SAORI として呼べます。里々は SAORI/1.0 の要求を Direct SSTP で本体へ送ります。規格と、モジュールごとの関数・引数は SAORI over DirectSSTP(SSP 2.9.13以降)を参照してください。
@SAORI
sha,saori/internal_crypto.dll,Digest,sha256
convert,saori/internal_data.dll,Convert
(sha、abc)
(convert、48656c6c6f、--data-in=hex、--out=base64)
この例の (sha、abc) は ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad に、(convert、…) は SGVsbG8= に展開されます。
- 登録の書式も呼び出しも、DLL の SAORI と同じです。定義済み引数・
ResultとValue0…の扱い・SAORI 引数の計算も同じです。Argument0が関数名、Argument1以降がその関数の引数と--オプション=値です。 Moduleヘッダには、相対パスのファイル名から.dllを除いたもの(小文字にしたもの)を入れます。- 実体のファイルが同じ場所にあるときは、これまでどおり DLL として読みます。
- 互換モジュール(
houchiclipcopytextcopysaori_ipsaori_cpuidmciaudiocpuusagehttpcstringhanayu)も、ファイルがなければ本体の内蔵機能を呼びます。 --async=識別子を付けると非同期になり、結果はイベントOnInternalSaoriComplete(識別子がOnで始まるときはその名前)で届きます。()は空に展開されます。- 要求は
Charset: UTF-8で送ります。引数に改行は書けません(ヘッダの区切りになるため、送らずに400として扱います)。改行や先頭・末尾の空白を含むデータは、--data-in=base64などで渡します。 - 本体のウィンドウが分かるのは、本体から
hwndの通知を受けてからです。それより前に呼ぶと送れず、500として扱います。 - 本体の応答を最大 30 秒待ちます。時間のかかる処理(大きなファイルのハッシュ、パスワードのハッシュなど)は
--asyncを使ってください。 SecurityLevelは里々の実行権限を送りますが、規格では、Direct SSTP は常にLocalとして扱われ、ヘッダの値は見られません。外部から呼ばれた処理でも、内蔵モジュールの--data-in=file(ファイルの読み込み)などがLocalの権限で動くことになるので、externalのときに呼ばない、引数に外部の値を入れない、といった注意が必要です。- Windows 版だけです。Linux / macOS 版では、ファイルがなければ
プラグインが存在しません。になります。
登録なしの呼び出し¶
Mc205-2以降、internal_ で始まる内蔵モジュールは、@SAORI に書かなくても、モジュール名をそのまま呼び出し名にして呼べます。
(internal_crypto、Digest、sha256、abc)
(internal_random、UUID)
(internal_crypto、HashPassword、secret、--async=OnHashDone)
Argument0が関数名、Argument1以降がその関数の引数です(登録したときに定義済み引数で渡していたものも、ここに書きます)。- 登録されていない
internal_で始まる名前が初めて呼ばれたとき、里々は本体にinternal_systemのListModulesを送って内蔵モジュールの一覧を取得し、一覧にある名前なら呼び出し名,saori/<小文字の名前>.dllと登録したのと同じように扱います。一覧は辞書の読み込み(load)ごとに 1 回だけ取得します。 - モジュール名の大文字小文字は区別しません(
(INTERNAL_Crypto、…)でも呼べます)。英数字と_以外を含む名前は対象外です。 - 一覧にない名前、本体が SAORI over DirectSSTP に対応していない場合(SSP 2.9.12以前)は、ほかの名前と同じく
(名前) not found.になり、()はそのまま残ります。 - 本体に
internal_systemがない場合(SSP 2.9.13)は、一覧を確かめずにinternal_で始まる名前をすべて内蔵モジュールとして扱います。 - 本体のウィンドウが分かる(
hwndの通知を受ける)前は一覧を取得できないので、解決されません。次の呼び出しで再び取得を試みます。 @SAORIに同じ呼び出し名を登録していれば、そちらが使われます。別名や定義済み引数を付けたいときは、これまでどおり登録してください。- Windows 版だけです。
エラー¶
| ログの内容 | 意味 |
|---|---|
設定ファイルの書式が正しくありません。 |
呼び出し名か相対パスがない |
同じ呼び出し名が複数定義されています。 |
呼び出し名の重複 |
プラグインが存在しません。 |
ファイルがない |
SAORI/1.xのdllの読み込みに失敗しました。 |
読み込みに失敗した |
400 Bad Request / 呼び出しの不備 |
SAORI が 400 を返した |
500 Internal Server Error / saori内でのエラー |
SAORI が 500 を返した |
SAORI over DirectSSTP : 本体のウィンドウがまだ分からないため、送れませんでした。 |
内蔵モジュールを呼んだが、本体のウィンドウが分からない |
SAORI over DirectSSTP : 名前 を本体の内蔵モジュールとして登録しました。 |
登録なしで呼んだ internal_ の名前を登録した(Mc205-2以降。エラーではない) |
SAORI over DirectSSTP : 本体の内蔵モジュールを使えません。(理由) |
内蔵モジュールの一覧を取得できなかった。以後、登録なしの呼び出しは解決しない(Mc205-2以降) |
これらのログは DLLのパス - 呼び出し名 : 内容 の形式です。内蔵の ssu を使っている(saori\ssu.dll のファイルがない)場合、Mc201-6以降は DLL のパスの代わりに (internal ssu) と表示されます。
Mc205-1以降、400 / 500 の後ろに、SAORI が返した ErrorDescription を (…) で添えます。内蔵モジュールでは、DLL のパスの代わりに (DirectSSTP モジュール名) と表示され、次のような失敗理由も付きます(モジュールごとの理由は SAORI over DirectSSTP を参照)。
| 失敗理由(括弧の中) | 意味 |
|---|---|
unknown module |
本体にそのモジュールがない |
unknown function |
Argument0 の関数名がモジュールにない |
invalid parameter |
引数の欠けや誤り |
no response from baseware |
本体に送れなかった・応答がなかった |
baseware does not support SAORI over DirectSSTP |
本体が SAORI over DirectSSTP に対応していない(SSP 2.9.12以前) |
Argument<n> contains a line break |
引数に改行が含まれる(里々が送らずに返す) |
里々を SAORI として呼び出す¶
satori.dll は、SAORI/1.x のリクエストにも応答できます(Argument0 を ID、Argument1… を Reference0… にして通常と同様に処理し、Result と Value0… で返します)。