ssssをgolangに移植してみた

この記事は、Go2 Advent Calendar 2018の9日目の記事です。

qiita.com

以前、ssssを使った秘密分散について書きました。丁度1年ぐらい前ですね。

ohac.hatenablog.com

ssssというのはSSSS.GRIDMANとは全く関係なくて、Shamir's Secret Sharing Schemeのことです。 Shamirというのは人の名前で、RSA暗号のSの人ですね。

で、これを今回Go言語に移植してみました。 というのもこのssssはC言語でコーディングされており、今時の高級言語には移植されていなかったためです。

Go言語ならWindowsやARM用のバイナリを作るのは簡単ですし、最近ではwasmにも変換できるため、 ブラウザ上で動作させるように改造することも容易になります。

ソースコードgithubに置きました。

github.com

とりあえず移植したレベルですので、ライブラリ化やコマンドラインアプリ部分との分離とかはまだやっていません。 git cloneして、go buildすればssssgoというバイナリができますので、以下のような感じで動作させることができます。

ssssgo$ go build

ssssgo$ ./ssssgo -t 3 -n 6 split
Generating shares using a (3,6) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: foo bar baz
Using a 88 bit security level.
1-d9bd5efeb34972b41dcb98
2-25c1440f501ee5a1723d81
3-2e14fbbc265d4f36d2ca65
4-bd30c359096f0190188682
5-b6e57cea7f2cab07b87174
6-4a99661b9c7b3c12d78749

ssssgo$ ./ssssgo -t 3 combine
Enter 3 shares separated by newlines:
Share [1/3]: 6-4a99661b9c7b3c12d78749
Share [2/3]: 3-2e14fbbc265d4f36d2ca65
Share [3/3]: 2-25c1440f501ee5a1723d81
Resulting secret: foo bar baz

コマンドライン書き方がちょっとオリジナルとは違うのと、入力文字列が隠れない点が移植しきれていませんが、ちゃんと動いていることが分かります。

今回はAdvent Calenderの記事でもありますので、git log -pを見ながら移植についての感想みたいなものを書こうかと思います。

最初はやはり勢いが大事です。まずは拡張子.cを.goに書き換えて、go fmtが動くところまで持ってきました。 ただし、ややこしそうなところや、最初の目標と考えていたsplit部分以外はひとまずコメントアウトしました。

で、一番の不安要素としてはgmpの部分をどうやって移植すればよいかと考えていました。 mini-gmpを移植しないといけないのかと。

1つ見つけたのは github.com/ncw/gmp というパッケージで、これはlibgmpをgolangから呼べるようにするもののようでした。

github.com

gmpというのは何なのかを調べたところ、大きい整数を扱うための高速なライブラリのようでした。 gmpGNU Multi-Precision Libraryの略だそうです。

GNU Multi-Precision Library - Wikipedia

今回は高速動作は重要ではないですし、整数のライブラリなら他にもあるだろうと調べたところ、普通に標準ライブラリにありました。math/bigというやつで、この中のInt部分です。

big - The Go Programming Language

この時点での移植プランとしては、とりあえずncw/gmpを使って動作するところまで持っていき、その後でmath/bigへ移植しようと考えました。 ncw/gmpはmath/bigと同じようなインターフェイスを持っているため、ncw/gmpで動けば、ほぼそのままmath/bigでも動くだろうし、libgmpの関数とmath/bigでの呼び方の対応を見るにはncw/gmpソースコードを見れば分かりそうだったので、非常にありがたかったです。math/bigへの移行はgmp.Intをbig.Intに書き換えるだけです。

オリジナルの乱数は乱数プールから値を読むような処理がありました。これは最初はmath/randのUint32()を使っていましたが、セキュアでないため後でcrypto/randに置き換えました。(wasm化する場合はこれはJavaScriptのSecureRandomあたりにバインディングされるのではないかと思いますが、調べていません。SecureRandomは古い実装だとMath.randomにfallbackする問題があるらしいですが、wasmが動くような最近のブラウザはたぶん大丈夫なのかもしれません。すんません調べていません。)

ということで、できていないところとしてはメモリのロック処理(mlockall)、uidの処理(seteuid)、secret入力時のecho offがありますが、本質的な部分ではないので今はあまり移植するモチベーションがありません。

まとめ

C言語で書かれているコードをWindowsやRasPiやブラウザで動かしたければまずは拡張子を.goに書き換えることからスタートしてみてはいかがでしょうか。

wineでKontakt 6 Playerを動作させた

以前、Kontakt 5 Playerをwine環境で動作させました。

ohac.hatenablog.com

あれからだいぶ時間も経過しまして、Kontaktは6が最新バージョンとなりました。 割と簡単に動くだろうと思っていたのですが、かなり苦労しました。

ある時期にライセンスやダウンロードの管理がService CenterからNative Accessに変更となり、 これを正常に動作させるために非常に苦労したのです。

Kontakt 5 PlayerとService Centerについては今のところLegacy Softwareからダウンロード可能です。 ただしライセンスの管理はできないかもしれませんし、古いソフトのアップグレードのキーの入手は困難と なってきますので、Native Accessに移行せざるを得ないでしょう。

結果的には無理矢理動かすことができましたので、覚えている範囲でつまづき点をメモしておきます。 また、苦労した点は最後の方に書いておきます。

  • 使用したwineは64bitの3.20。PlayOnLinuxでビルドした。
  • 環境変数は以下のような感じで設定
export PATH=$HOME/.PlayOnLinux/wine/linux-amd64/3.20/bin:$PATH
export WINEPREFIX=$HOME/.wine64a
export WINE=wine64
  • 前回同様winetricksで色々と必要そうなものを追加インストール。winecfgであれこれネイティブ版に切り替えたり戻したりしてみる。
  • インストールは$WINE Native\ Access\ 1.7.3\ Setup\ PC.exeで実行。特に問題なく終了した。
  • cd $WINEPREFIX/drive_c/Program\ Files/Native\ Instruments/Native\ Accessディレクトリを移動。
  • httpsでのアクセスで問題が起きるようなので、以下のCaddyfileでhttp化したプロキシサーバーを立てる。ポートは443だけどhttpで動作する。

Caddyfile · GitHub

  • このままだとNative Access.exeは正規のサーバーにhttpsで接続してしまうので、バイナリにパッチを当てる。
  • 今回はbviでapi.native-instruments.comをapi.native-instruments.cozに1文字変更し、その直後にあるhttpsをhttp+ヌル文字に書き換えた。
$ diff -u <(xxd Native\ Access.exe.orig) <(xxd Native\ Access.exe)
--- /dev/fd/63  2018-11-11 11:09:20.783091625 +0900
+++ /dev/fd/62  2018-11-11 11:09:20.781091569 +0900
@@ -576386,7 +576386,7 @@
 008cb810: 7400 6d00 7000 0000 4e61 7469 7665 4163  t.m.p...NativeAc
 008cb820: 6365 7373 0000 0000 6170 692e 6e61 7469  cess....api.nati
 008cb830: 7665 2d69 6e73 7472 756d 656e 7473 2e63  ve-instruments.c
-008cb840: 6f6d 0000 6874 7470 7300 0000 0000 0000  om..https.......
+008cb840: 6f7a 0000 6874 7470 0000 0000 0000 0000  oz..http........
 008cb850: 7773 733a 2f2f 736f 636b 6574 732e 636c  wss://sockets.cl
 008cb860: 6f75 642e 6e61 7469 7665 2d69 6e73 7472  oud.native-instr
 008cb870: 756d 656e 7473 2e64 6500 0000 0000 0000  uments.de.......
  • また、api.native-instruments.cozは存在しないので、sudo vi /etc/hostsでローカルホストに向くように変更する。
  • caddyを実行する。ポートは443なのでsetcapとかsudoなどでなんとかする。(caddyのインストールや使い方はQiitaとかにあるので検索してください。)
  • $WINE Native\ Access.exeで実行する。うまくいけばログイン画面が出るでしょう。
  • その後は普通の手順で進むことができると思いますが、スタンドアローン版のKontakt Playerはなぜか音が出ないので、デフォルトパッチの編集だけを行い、あとはairwave+CarlaとかでVSTとして動かすとよいかと思います。
  • 各種ソフトウェアのダウンロード後は自動でインストール後に削除されてしまうので、どこかにコピーしておいた方がよいかもしれません。
  • スタンドアローン版はwineasioをうまくインストールできたら音が出るようになるかもしれませんが、今のところまだ手順を確立していません。

f:id:ohac:20181111113558p:plain f:id:ohac:20181111114212p:plain f:id:ohac:20181111114238p:plain f:id:ohac:20181111114256p:plain f:id:ohac:20181111114339p:plain

2018/11/11 14:45追記

wineasioは以下のissueにおおよその手順が書いてあり、自分の環境に合わせて実行するとうまく音が出るようになりました。

github.com

苦労した点と調査内容

  • WINEDEBUGでのログのキャプチャ。LANG=C WINEDEBUG=-all,+winhttp,+wininet,+winsockなどを付けてログを見てみる。
  • Native Access.exe自体のログがいくつかある。
    • users/$USER/Local\ Settings/Application\ Data/cache/Native\ Instruments/Native\ Access/NativeAccess_1.log
    • jq < users/$USER/Application\ Data/Native\ Instruments/Native\ Access/uret_cache
  • 関連してそうなホストで絞り込み、tcpdumpでキャプチャしてみる。分かりにくいので.pcapで保存してWireSharkで見てみる。TLSで通信しているだろうから、中身がよく分からないが、あまりにも中身が短すぎておかしい。
  • このあたりでTLS周りを疑うようになる。aria2c.exeもインストールされているので、これで適当なhttpsサイトから何かをダウンロードしようとしてみるがうまくいかない。
  • mingのcurlを入手し、httpsでダウンロードしてみるとうまくいく。よくみると証明書もbinにインストールされていた。
  • wine controlcurlに添付されていた証明書をインストールしてみたが、Native Access.exeの問題は解決せず。
  • caddyでプロキシを立ててexeとhostsを変更し今に至る。ポート443が使われてしまうのでhttpsのままなのかと思ったが問題なく動作したのでとりあえずOKとした。
  • Add a serialではキー入力を受け付けなかったので、5文字ずつコピーしてペーストした。

Ubuntu 18.04 トラックボールでホイールスクロールを模擬

会社で使っているマウスのホイールの調子が悪くなってきました。 ホイールは比較的早く壊れるので、できればこれに頼らないようにしていきたいものです。

家で使っているのはELECOM EX-Gというトラックボールなのですが、せっかくでかいボールが付いているので、 このボールでホイールのエミュレーションをするように設定してみました。

/usr/share/X11/xorg.conf.d に 80-elecom-trackball.conf という名前で以下のような内容のファイルを作りました。

Section "InputClass"
        Identifier "Wheel Emulation"
        MatchProduct "ELECOM ELECOM TrackBall Mouse"
        Driver "evdev"
        Option "EmulateWheel" "true"
        Option "EmulateWheelButton" "8"
        Option "Emulate3Buttons" "true"
EndSection

MatchProductの部分はxinputコマンドで出てきた名前を使います。 8と書かれているところはBack, ForwardボタンのBackに相当する部分です。 xevで押してみると確認できます。

元々Back, Forwardボタンは使っていなかったので、しばらくはこれで使ってみようかと思います。

追記1:

Backボタンとしても機能してしまっていたので、以下の設定で中クリック扱いにするようにしました。

        Option "EmulateWheelButton" "8"
        Option "ButtonMapping" "1 2 3 4 5 6 7 2 2"

EmulateWheelButtonはマッピング前の数値を使うようなので、注意が必要です。

ついでにBlenderの操作でForward(中クリック)を押しながら視点の移動ができるようになりました。

追記2:

ホイールのティルト左右でBack, Forwardができるようにしました。

        Option "ButtonMapping" "1 2 3 4 5 8 9 2 2"

DSLでMIDI変換スクリプトが書けるLV2プラグインを作成した

作りました。

f:id:ohac:20180917180640p:plain

github.com

これまではプログラマブルMIDI情報の変換にはmididingsとかQmidirouteを使っていましたが、LV2プラグインで欲しいなと思っていました。

スタックマシンなら簡単に実装できるかなと思い、作ってみたところなんとか作成することができました。

命令はすべてASCIIで表現可能なため、Carlaで保存されたXMLを直接編集することで内容を変更することが可能です。 独自の設定GUIは今のところありません。

命令はbrainf*ckの元となったFALSEをベースにしていますが、かなり別物になっています。 そのまま書くと訳が分かりませんので、別の言語(RubyPythonなど)で生成するようにした方がよいかと思います。

スクリプトの例として以下のようなものを作成しております。

5度上のノートを追加するやつ

Tx8*7-<3N%R%C\7+\

ノートオフを無視するやつ

C%%x/8-3Z%R%%%%

ベロシティを少し上げるやつ

$x8*7-<5Z%7+R%%x8*1-

MIDI CHを1増やすやつ

@1+@@

nanoPAD2の8つのパッドにそれぞれの音程をセットするやつ

\$4h-7N%%5h\R%$5h-7N%%4h\R%$6h-7N%%3i\R%$7h-7N%%2i\R%$8h-7N%%1i\R%$9h-7N%%0i\R%$ah-7N%%fh\R%$bh-7N%%eh\R%$ch-7N%%dh\R%$dh-7N%%ch\R%$eh-7N%%bh\R%$fh-7N%%ah\R%$0i-7N%%9h\R%$1i-7N%%8h\R%$2i-7N%%7h\R%$3i-7N%%6h\R%\

最後のは訳が分かりませんが、ジェネレータ側のdrum_pad.rbを見ていただければなんとなく分かるかと思います。

命令についての解説が全くないので、ぼちぼち書いていこうかと思っています。

WineでDrumMic'a!(KONTAKT Player 5)を動かしてみた

サンプラーと言えばNIのKONTAKTが有名です。 サードパーティの音源も多数あり、Linuxユーザーにとっては非常にうらやましく思うソフトの1つです。 サードパーティの音源は謎の可逆圧縮がかかっておる訳ですが、これはFLACでもALACでもなく、 独自の秘密のフォーマットであり、バイナリの変換ツール単体も提供されておらず、オープンな思想からは大きく外れております。

文句ばっかり言ってても始まらないのでLinuxのWineで動かす方法を探っておりました。

以前、KONTAKT Player 5を動作させたことはあったのですが、それからPCも変わり、いろいろとバージョンも変わってしまい、 手順も忘れていたので改めて環境構築に取り組んでみました。

以前はアクティベーションのソフトが動かなかったのですが、海外サイトでいろいろ調べていると最近のWineでは問題が解決してそうな感じだったのでモチベーションが上がりました。

アクティベーションがもし動くなら、ゼンハイザーがマイクの宣伝用に無償で提供しているドラム音源、DrumMic'a!をインストールし、アクティベートできればKONTAKTのクロスグレードが安く入手できます。 セールのときはさらに半額になったりすることもあるようです。今はKONTAKT 6が控えているのでしばらくセールはないかもしれませんが。

で、結果から言うと動きました。

f:id:ohac:20180909092843p:plain

f:id:ohac:20180909092854p:plain

手順はちょっと整理できていないので、とりあえず苦労した点やコツを箇条書きにしておきます。

  • wineはgitのやつからビルドしていたが結局うまくいかず、PlayOnLinuxでビルドしたやつでうまくいった。
    • PlayOnLinuxはうまく動かないところがあるが、wineの管理だけはちゃんと動いていた。
  • 環境変数のPATH, WINEPREFIX, WINEをちゃんとセットする。(WINEはwine64を指定)
  • フォントが文字化けというか豆腐になるのを調べるにはps axでプロセスIDを調べてlsof -pでfontsをgrepする。
    • フォントを別のファイルに置き換えたり、消したりすると直ったり、原因の切り分けができたりする。
  • winetricksで色々とインストールする。
  • winehqのサイトで動かした人のコツを調べる。
  • winetricks msvcp140=native は重要。
  • winetricks win7 も重要っぽい。
  • msvcp140などのdllのサイズが小さくなってしまい、winetricksでいろいろやっても戻らないことがあった。
    • 別環境のWINEPREFIXを作成し、そこで入手できるパターンを探す。
    • うまくいったときのDLLを保存しておいた方がよい。今回はたまたま別環境にあったのでそれを使って上書きした。
    • winehqのサイトではDLLをあるサイトからダウンロードした人もいるが、この方法は危険だと思う。
  • sudo mount -t udf -r Kontakt_Factory_Selection.iso cdr -o unhide みたいな感じでマウントする必要あり。
  • 今のところKONTAKTスタンドアローンでは音が出ていない。AirWaveを使ってCarlaのVSTとして読み込むと音が出た。
    • AirWaveは本家ではなく、rodlie/airwaveのバージョンを使う。READMEとその変更内容(git log -p)をよく読むこと。
  • DrumMicA.zipのダウンロードは時間がかかる。
    • sha256sumは 2a8a6a5b5d480b1eb9ef25ec7830e6ead89cf9b6a7fe1d90c95a4399d24e11f9 だった。
  • DrumMicA.zipはunzipコマンドでエラーが出るので7z xで展開する。DrumMicA Setup PC.exeを実行する。

あと、Sample Tank 3のメモもついでに書いておきます。

  • SampleTank_3_3.7.zipの中のInstall SampleTank.exeをインストールする。
  • Program\ Files\ (x86)/IK\ Multimedia/Authorization\ Manager/Authorization\ Manager.exe でアクティベートする。
  • SampleTank_3_Sound_Content_Part_1.zipから_8.zipまでを展開し、それぞれインストーラを実行する。

それとKORGのM1とWAVESTATIONのメモも。

  • 文字化けしてアクティベーションの画面がよく分からないときは手順のPDFを見ながら操作する。
  • wine64でインストールしてもAirWaveでは32bit扱いになり、Carlaでホスティングできない。調査中。32bitのwine環境の方がよいのかも?
  • スタンドアローンでは一応動いているが、レイテンシを考えるとwineasioを頑張って入れる必要がある。
    • 前はそうしたが、手順をまた調べる必要がありそう。

2018/11/11追記: 続きを書きました。

ohac.hatenablog.com

Pianoteq 6 PROのインストールメモ

Linuxをサポートしている珍しい貴重な音源、Pianoteq 6 PROをインストールしたときのメモです。

まず、Pianoteqのサイトに行き、サインインします。

www.pianoteq.com

User areaのDownloadsからLinux, v6.2.2, 32-bit/64-bitをダウンロード。 拡張子は7z。 (なんかOrganteq Alphaというのもダウンロードできるぞ。なんだこれ。)

適当なところで展開して、スタンドアローン版の実行ファイルamd64/Pianoteq 6を実行。

以下のような画面が表示される。

f:id:ohac:20180904125909p:plain

ボタンを押すと以下のような画面となる。

f:id:ohac:20180904130133p:plain

Registered productsに表示されているコードを入力し、Quick Activationを押す。

f:id:ohac:20180904130157p:plain

こんな感じの画面が出れば成功。

f:id:ohac:20180904130413p:plain

設定せよ、と指示があるので以下のようにJACKを指定してみる。 MIDIキーボード(AKAI LPK25)を接続して、それを選択。

f:id:ohac:20180904131152p:plain

なんか画面がでかいので設定でTinyに変更してみた。

f:id:ohac:20180904130707p:plain

JACKで接続。MIDIは接続しなくてもいいみたい。

f:id:ohac:20180904131347p:plain

無事、音が鳴った。

VST/LV2の場合はCarlaで.soを読み込ませるとよい。

f:id:ohac:20180904132932p:plain

f:id:ohac:20180904132945p:plain

f:id:ohac:20180904132958p:plain

f:id:ohac:20180904133009p:plain

こんな感じ。 GUIを出すと...

f:id:ohac:20180904133034p:plain

はみ出て見えない...

Linuxで再生されている音を録音する方法色々

Windowsはよく知りませんが、Linuxでは簡単に再生されている音を録音することができます。

方法1. parecコマンドを使う

$ parec > rec.raw

f:id:ohac:20180902105944p:plain

こんな感じでpavucontrolからどれを録音するか選択できます。

この例ではNull出力を使っています。

~/.config/pulse/default.paで以下のように指定すればNull出力が使えるようになります。

load-module module-null-sink

これならオーディオインターフェイスがなくてもいけますね。

あと、録音用のNull出力を別系統にしたい場合は以下のようにして名前を変えてやれば増やすことが可能です。

load-module module-null-sink sink_name=parec sink_properties="device.description=Null2"

動的にやるなら以下のコマンドで。

$ pactl load-module module-null-sink sink_name=parec sink_properties="device.description=Null2"

f:id:ohac:20180902110622p:plain

方法2. PulseAudio+ffmpegを使う

$ ffmpeg -f pulse -i default -y rec.flac

f:id:ohac:20180902110823p:plain

ffmpegなので好きな形式にエンコードすることができます。 PulseAudioありでビルドされている必要がありますが、Debianパッケージならありになっています。

方法3. JACK+timemachineを使う

JACKを開始後、timemachineを起動。

$ timemachine

f:id:ohac:20180902111338p:plain

f:id:ohac:20180902111348p:plain

PulseAudio JACK Sinkの出力をtimemachineに接続。 あとはボタンを押せばRAWで録音開始となります。 ファイル名は現在日時をベースとしたものになります。

これも録音用を別系統にしたければ別名のJACK Sinkを作成すればよいです。

$ pactl load-module module-jack-sink client_name=pulse2

f:id:ohac:20180902111858p:plain

f:id:ohac:20180902111910p:plain

方法4. JACK+ffmpegを使う

方法3とほぼ同じですが、timemachineではなくffmpegを使う方法。

$ ffmpeg -f jack -i ffmpeg -y `date +%Y%m%d_%H%M%S`.flac

ファイル名はなんでもいいですが、ここではdateコマンドで現在日時を使うようにしています。