断念したのでこのタイトル。
動機
Zigのstdにはcryptoライブラリがあって、これをNimで読み込ませる事でNimでも高度な暗号化処理が可能になるのでは…? という期待から取り組んでいた。
Zigからexport
export
というキーワードが付いた関数はCから呼び出すことができる。
この手の手順でよくやるno mangleはやらないらしい。これ意外だった。
以下はサンプル
これをコンパイルするのだけど、Nimは
- ヘッダファイル
- 静的ライブラリ
- 共有ライブラリ
の3つに対応しているので、今回は動的ライブラリとして出力してみる。
以下のコマンドを実行。
zig build-lib ./src/main.zig -lc -dynamic
するとカレントディレクトリに共有ライブラリが出力される。
Nimでimport
Nimではdynlib
プラグマを使うことで共有ライブラリを読み込むことができる。
proc add(x: cint, y: cint): int {.dynlib: path, importc: "add".}
dynlib
にはライブラリの絶対パスを指定する。
importc
には関数名を指定する。
関数宣言部分では、呼び出す関数の型を指定する。この際、Cとの互換性があるcint
を使う。1
NimからZig stdを呼び出す
ZigとC間で文字列を受け渡すためには、[*:0]const u8
を使うらしい。センチネルというやつらしい。
Nimではこんな感じで呼び出せる。
std.cryptoを呼び出したい
さてここからが本題。Zigにはstd.crypto
という暗号化処理向けのモジュールがあって、その中にはなんと楕円曲線暗号の関数がある。
これをNimから呼び出せれば行けるのでは…!と思った。
秘密鍵のバイト配列のポインタを返すようにしている。 Nim側はこんな感じ。
これを実行するとメモリ番地らしき値が表示される。ここから値にアクセスしようとしたけど、Nimでポインタを扱う情報が意外と少なくて断念した。ソースコードはここに公開しておくので、気になる人は試してみて欲しい。
Footnotes
-
別にintでも行けるらしい。また、cintは大抵の場合int32になるんだそう。 ↩