CodeMeterドングルで自前COMPをプライバシー保護

これは 2020/11/27 第４回 テクニカルディレクター公開総会 - TECH DIRECTORS PUBLIC MEETING で話した **機能の切り売り** についての記事です。機能切り売りについて自分が喋っている様子は [コチラの動画](https://youtu.be/e-rmu3r-g5g?t=1633) の27:10 あたり

> 注:
> この記事を見て今すぐお手元のTouchDesignerを使って試せる事は一つもありません。表題について興味のある方が時間とお金をかけて取り組む時用の資料です。
> 
> 興味がある方も、以下の文章を読んで一発で理解するのは難しいと思います（固有名詞がガンガン出てくるので。。）ハンズオン動画を用意したので詳しくは動画を見た方が良いと思います。
> ※作業中のあるある凡ミスもカットしてない未編集ノーカット動画です。凡ミス箇所も併せて参考にして下さい。
> https://www.youtube.com/watch?v=ElXCX9qrL9o


# 自分のtoxをライセンス保護して販売したい

toxをコピペすると一瞬で他のTouchDesignerプロジェクトへコンポーネントを流用出来る。このお手軽さはTouchDesignerを使う事の特大メリットな一方、以下の場合に困る。

- 納品物toxを入れてるPCからtoxファイルだけコピって持ち出されるのが嫌な時
- 自前toxを販売したい。1 tox / 1 license をひもづけたい時

コレのお手軽解決法は無いかDerivativeに相談した所、TouchDesignerライセンス管理ドングルにも採用されているWIBU-SYSTEMS（以下WIBU） CodeMeterを使うのがお手軽でセキュアだとアドバイスを貰った。CodeMeterを使ったTD COMP暗号化についての日本語ドキュメントが無く、そもそも事例がかなり少ないらしく、WIBUの営業さんも経験がなかったようでした。

CodeMeterを使ったライセンス管理方法は2通りあります。
数多くライセンス管理をする人向けの方法（ローカルネットワークにライセンス管理用Webサーバーを立てる方法）ではなく、オフライン完結のCodeMeter License Editorを使う、運用手間が少ない方法のメモ残しておきます。

※↓COMP右クリ > Privacy > Dongle から設定出来るコレの話です。
![スクリーンショット 2020-11-03 150940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86490/72c777ba-d5a9-6447-c09f-2b23417f5b4a.png)


## Component Privacy
COMPのお手軽プライバシー保護方法は2つある。どちらもProライセンスが必要。
参考: https://docs.derivative.ca/Privacy


### 1. COMPを右クリ > Privacy から、パスワードで保護

`Pros:` 簡単。即導入可能
`Cons:` COMP内に入れないようパスワード保護するだけ。Cookは走る = toxさえあれば、作者が保護したくてもとりあえず動いてしまう。  

### 2. COMPを右クリ > Privacy から、CodeMeterドングルを使ってComponent Privacyを有効にする

`Pros:` セキュア。中身も見れないし、ドングルが無いとCookが走らない
`Cons:` 費用がかかる。SDKを郵送で送ってもらうので導入まで数営業日かかる

この **2.** が今回の主題「CodeMeterを使ったライセンス保護」にあたる。
TouchDesigner自体のライセンス管理ドングルもCodeMeterを使っている。CodeMeterを使ってCOMPを暗号化する為の仕組みもTouchDesignerに組み込まれている。

今回はこの **2.** を採用して、TouchDesignerのライセンスドングル 又 は自前のUSBドングル どちらかにCOMPのライセンスを入れ、そのドングルが無いとCookが走らないような状態を作る事をゴールとします。

CodeMeterの仕組みについての解説は省略し、TouchDesignerで↑コレを実現する手順だけを解説します。


## CodeMeter

販売元のWIBU営業さんに日本語で問い合わせ可能。
https://www.wibu.com/jp/products/codemeter.html

CodeMeterの仕組みについてはWIBUのWebサイトを見て下さい。
またWebサイトに掲載されている情報以外にも、営業さんが詳しい資料や噛み砕いた資料を沢山持っているので、CodeMeterの仕組みがよくわからない場合は即営業さんに問い合わせるのが良いと思います。

費用についてはここに記載出来ないのでWIBUの方に問い合わせて下さい。


## 大事な語彙

以下、WIBUに関する大切な語彙

- `CodeMeter SDK` 暗号化SDK。TouchDesignerに既に組み込まれてるので、TouchDesignerを使ってCOMPを暗号化したい人は意識しなくていい
- `Firm Code` 企業ごとに固有の番号。符号無し整数。（Derivativeのファームコードは[102327](https://docs.derivative.ca/License_Dongle#Loading_or_Updating_your_License_on_a_Dongle)）
- `CmContainer` ドングル内にいれるコンテナ。このコンテナに FirmCode をひもづける
- `Product Code` プロダクト = ライセンス保護したいCOMP の管理番号。符号無し整数
- `CodeMeter License Editor` ライセンス管理ポータル。デスクトップ用ソフト。WIBUに問い合わせると送ってくれるDVDに同梱されている
- `CodeMeter Contol Center` エンドユーザーも使うデスクトップ用ソフト。TouchDesignerドングルユーザーが、ライセンスのリクエストファイルを作る時に起動する奴
- `FSBドングル` FSB = Firm Security Box。正式名称か分からないけど便宜上こう呼びます。マスターキーのような存在で、これを使ってエンドユーザー向けのライセンスドングルを作ります。


以下WIBUとは関係無い、[Derivativeが独自に表記している](https://docs.derivative.ca/Privacy#Component_Privacy_with_CodeMeter_Dongle) 大切な語彙（この語彙の意味がよくわからずハマった）

- `License Dongle` エンドユーザーが使うドングルの事
- `Developer Dongle` COMPにプライバシー保護をかける為のドングルの事。中身はLicense Dongleとほとんど同じ。唯一、ProductCodeに FeatureMap=1 というプロパティがついている という違いがある（後述）




## Privacy保護作業のイメージと、おおまかな流れ

以下、ライセンス発行者を A社 と表記します。

#### FSBドングルを使ってエンドユーザー向けのライセンスドングルを作る作業イメージ
空のドングル内に**A社のFirmCodeにひもづいたCmContainer**を登録します。これで「ファームアイテム」というカギの入れ物のような物が出来た という状態です。
次に、ファームアイテム（カギの入れ物）に **Product Code（A社の特定のプロダクトを使う為のカギ）** を登録します。特定プロダクトを使用する為の「プロダクトアイテム」という物がファームアイテム配下に追加されました。

これでエンドユーザー向けのA社の特定のプロダクトを使う為のライセンスドングルが完成しました。この一連の作業には`FSBドングル`が必要です。空のドングルはWIBUから購入します。Derivativeから買うTouchDesignerライセンスドングルもWIBUが販売しているドングルを全く同じ仕様です。**Derivativeから買ったドングルにA社のFirmCode / ProductCodeを入れる事も可能です。**


#### 実際の流れ

- `CodeMeter SDK`をWIBUから購入する。DVD郵送でSDKが数営業日後に届く。DVDには空のドングルが付いてた。
- SDK購入時に、同時にA社の `Firm Code` を発行してもらう。数営業日後にメールでFirm Codeが送られてくる
- `CodeMeter License Central` を起動する（DVDに同梱されている）
- 空のドングルをFSBドングルにする。`CodeMeter Control Center`を使って、WIBUから送られてくる `CmFirm-xxxxxxx.wbc`をドングルに入れるとFSBドングルになる。
- FSBドングル内にA社の`CmContainer`を作る為の情報を入れる。WIBUから教えてもらうURLにアクセスし、WIBUから教えてもらうチケット番号を入力するとFSBドングルに`CmContainer`を作れる機能がアクティベートされる。`CmContainer`を10個作れる機能 = xxxxx円 という形でWIBUから諸々購入する
- 空のドングルを2個用意する。`Developer Dongle`用と`License Dongle`用
- `License Dongle`を作る。ドングルに`FirmCode`を登録し、その中に`ProductCode`を登録する
- `Developer Dongle`を作る。ドングルに`FirmCode`を登録し、その中に`ProductCode`を登録する。ProductCodeを登録する際、`FeatrueMap=1`のプロパティを付与する。このプロパティを持ったドングル保持者のみ、Developerとして判断され、COMPの中に入ることができる
- `Developer Dongle`をPCに刺して、TouchDesignerでCOMPを暗号化する。暗号化されたCOMPはLicense/Developerどっちかのドングルが刺さってないと中に入れないしCookも走らない = 今回のゴール！

## ユーザーのドングル内容をリモートで更新する方法
[TouchDesignerライセンスドングルの使用方法](https://docs.derivative.ca/License_Dongle#Loading_your_License_on_a_Dongle) と同じです。

- ユーザーから `Dongle Update File（.WibuCmRaC）` を送ってもらう。
- 受け取った`.WibuCmRaC`ファイルを`CodeMeter License Editor`で開く。`File > Open context file`
- オフラインでの作業時と同様に、`ProductCode`等の追加・削除編集をする
- 新たに出来た`.WibuCmRaU`ファイルをユーザーへ返送する（ユーザーから受け取るものと拡張子が1文字違うので注意）
- ユーザーは`CodeMeter Contol Center`を使って、受け取った`.WibuCmRaU`ファイルをドングルに入れる



## その他

Pythonを使って暗号化を自動化出来る
https://docs.derivative.ca/COMP_Class#Privacy_2

ある程度自動化したものがコチラ
https://drive.google.com/file/d/13nXtKZ7qmDWl5L1pFBSWR3IxtmwmJfx5/view?usp=sharing