reEncryptionの実装
僕の方で実装をしていく
まずは起動から
wslに変えたからいろいろと環境構築が初めからやる必要がある
wget https://dist.ipfs.io/go-ipfs/v0.13.0/go-ipfs_v0.13.0_linux-amd64.tar.gz
tar xvfz go-ipfs_v0.13.0_linux-amd64.tar.gz
初期化
ipfs init
起動
ipfs daemon
動いたYudai.icon
from websockets.legacy.client import (ModuleNotFoundError: No module named 'websockets.legacy'
ずっとこのエラーなんだけどYudai.icon
websocketsとweb3とuviornの依存関係が合わない
IPFSのversionが合わなくてダウングレードなどは出来たけど、IPFS自体の起動ができなくなった
mameta.iconとバージョンを合わせる
ReadMeに追加
ドキュメントでいろいろと書いていくの大切すぎる
一旦起動しきらないとAPIのテストが出来ない
ただ単体機能テストしながらならば進められるかYudai.icon
2024/1/1
新年早々からまじで地獄か...
IPFSのバージョンが合わず一生環境構築で無駄な時間をかけているわ あー使っているipfsClientが新しいIPFS daemonで使えないのが問題
mameta.iconが新しいのをインポートしてくれている
新しいやつ
原因は分かっている
IPFSのrepoのバージョンが合っていないせいでIPFSの実行が出来ない状態になっている
現在Monasで使用しているバージョンが低いからIPFS自体のバージョンを落とさないといけなくて落としたんだけど、repoのバージョンが合っていないって出てきている状態
そこでMameta.iconに落とすツールを教えてもらってやっているんだけど最終的に出来ないって出たYudai.icon
yuda_1@Ishi-Yudai:/mnt/c/Users/isiyu/OneDrive/デスクトップ/Monas/demo-cryptree$ fs-repo-migrations -to 10 -y
panic: qtls.ClientSessionState doesn't match
github.com/ipfs/fs-repo-migrations/ipfs-10-to-11/_vendor/github.com/marten-seemann/qtls-go1-15.init.0()
/home/yuda_1/go/pkg/mod/github.com/ipfs/fs-repo-migrations@v1.7.1/ipfs-10-to-11/_vendor/github.com/marten-seemann/qtls-go1-15/unsafe.go:14 +0x24b
こっちがパニックなんだけどwYudai.icon
実装に全く入れないーーー
後解決方法としてはコードで実装している側のIPFSのバージョンを上げる方法があるYudai.icon
ただこれだとフロント側のバージョンも上げないといけなくていろいろと問題が出てくる可能性がある
なんか簡単に出来る方法があればいいけど、最終的にはバージョンをあげないといけないと思うんよね
一旦返答待ちかYudai.icon
再暗号化の実装って動かさず単体テストでできるかな?
疑似的なデータとか使ってできたりしないかな?
出来ない可能性があるとすればIPFSと繋がっていない状態になる事くらい(まあでかいんだがw)Yudai.icon
再暗号化のトリガー
アクセス解除したいタイミングYudai.icon
アクセス解除したいノードをどのように特定するか
確かにこれどう特定しようか
誰に何を共有しているかの状態をどこかに保持している場合はもちろんCIDによって特定は可能
一旦CIDの発火にしてみるかYudai.icon
1, ノードの指定(CID)
2, 再暗号化の実行
指定したノードから子ノードへ再帰的に再暗号化処理を行う
CIDの更新とIPFSへのアップロードを繰り返す
親ノードのメタデータを更新
3, 特定ノードからルートノードまでは鍵の生成はせずCIDの更新と元の鍵で暗号化を繰り返す
そうなると2つ再帰処理があるに近い感じかな?Yudai.icon
再暗号化処理の言語化
find_deepest_nodeによって最下層までchildが無くなるまで探索する
探索と暗号化は分けるべきかYudai.icon
childが無くなったらfile_cidがメタデータにあるかを確認する
ある場合、新しいfile_keyで暗号化し、IPFS上にアップロードする
CIDを受け取りメタデータを更新し暗号化するってことを再帰的に行う
IPFSが起動できないからモックを作成して進めていく まさ氏がfakeIPFSを作ってくれていたから使用していく
setUp
code:test.py
def setUp(self):
self.ipfs = FakeIPFS()
self.root_node = CryptTreeNode.create_node("Root_folder", "owner_id", True, self.ipfs)
self.sub_folder1 = CryptTreeNode.create_node("Sub_folder1", "owner_id", True, self.ipfs, parent=self.root_node)
self.sub_folder2 = CryptTreeNode.create_node("Sub_folder2", "owner_id", True, self.ipfs, parent=self.sub_folder1)
self.sub_folder3 = CryptTreeNode.create_node("Sub_folder3", "owner_id", True, self.ipfs, parent=self.sub_folder2)
self.file1 = CryptTreeNode.create_node("file1", "owner_id", False, self.ipfs, parent=self.sub_folder3, file_data=b"File content")
self.sub_folder3.add_node(self.file1.metadata"file_cid", "file1", "/path/to/file1", False) sub_folder1_cid = self.ipfs.add(json.dumps(self.sub_folder1.metadata).encode())
sub_folder2_cid = self.ipfs.add(json.dumps(self.sub_folder2.metadata).encode())
sub_folder3_cid = self.ipfs.add(json.dumps(self.sub_folder3.metadata).encode())
file1_cid = self.ipfs.add(json.dumps(self.file1.metadata).encode())
実行結果:
Root Node Metadata: {'name': 'Root_folder', 'owner_id': 'owner_id', 'creation_data': '2024/01/07 19:48:53', 'child': {'Sub_folder1': {'metadata_cid': '2c5cc728216dfad2671bc46e1ea5643ad926888ce7dbbab9b0cb30a3888ac346'}}}
Sub Folder 1 Metadata: {'name': 'Sub_folder1', 'owner_id': 'owner_id', 'creation_data': '2024/01/07 19:48:54', 'parent': 'gAAAAABlmoGWGkhYJ2HMSUeBfs56mx2nLfOTbmbV_uK-3fupuCZagKIzn6XM1KvH87zS-zNdlO3IPgpBo618HdSyiR7C9LXXc80d4XGQmV4D8YxkolbT_d8=', 'child': {'Sub_folder2': {'metadata_cid': '02285be23b221f7b6f8cd602bcfa4bf7157b079b71f27e70de50d032fefe528f'}}}
Sub Folder 2 Metadata: {'name': 'Sub_folder2', 'owner_id': 'owner_id', 'creation_data': '2024/01/07 19:48:54', 'parent': 'gAAAAABlmoGWTaMflMa9wkTJ3VOxAkJMp_yLv9_wTRtJkvqhf_7NAK1a-5RfS9rFYOWOISLQz9bA5LIWxGZ1k1JyePQGL6T13MZjvRnW9Zg_H581SLp3cXE=', 'child': {'Sub_folder3': {'metadata_cid': '36ed3a911d65fff8fea1a820062b98de97fad945f231a68f04f40f0051ffe97b'}}}
Sub Folder 3 Metadata: {'name': 'Sub_folder3', 'owner_id': 'owner_id', 'creation_data': '2024/01/07 19:48:54', 'parent': 'gAAAAABlmoGWDJkWnEiwNQr0uwQUCIRMiOKGLgp6LQzJksT9iae0PFtvwaybsmAqjtBlf4dyTvwvnN0JQsrZ3VogVhy5naacasvfdiiXuh605XZG3_QmZdc=', 'child': {'/path/to/file1': {'metadata_cid': '7b4da49290b5918cf5afe46d3aa9a65eebccca0a80bec75276be41f3882e2929', 'name': 'file1', 'is_directory': False}}}
File 1 Metadata: {'name': 'file1', 'owner_id': 'owner_id', 'creation_data': '2024/01/07 19:48:54', 'parent': 'gAAAAABlmoGWau5DAjaKWWPI9V65afCN25TP0LkC-wE0I2Dc1iATk-Ezc6LaVJx6n_l3fguBchoJkhdrQ95f5Jc376KI6K27AhsPkgHCHA2JgKYJQxXCzdQ=', 'file_cid': '7b4da49290b5918cf5afe46d3aa9a65eebccca0a80bec75276be41f3882e2929'}
やっと正しく動いたーーYudai.icon*2
メモ:
IPFSじゃなくてfakeIPFSを使用ているから幾つかipfs_client = fake_ipfsにしている
後で消す必要あり
childがある限り探索していく
code:cryptree.py
def find_deepest_node(self):
if "child" in self.metadata and self.metadata"child": for child_key, child_info in self.metadata"child".items(): child_metadata_json = self.ipfs_client.cat(child_cid).decode('utf-8')
child_metadata = json.loads(child_metadata_json)
child_node = CryptTreeNode(metadata=child_metadata, keydata={}, subfolder_key="", fake_ipfs=self.ipfs_client)
return child_node.find_deepest_node()
else:
return self
出来ているはずだけど、
Traceback (most recent call last):File "test.py", line 42, intest_find_deepest_nodeself.assertEqual(deepest_node.metadata["name"], "file1" )AssertionError: 'Sub_folder1' != 'file1'- Sub_folder1+ file1
合わないYudai.icon*3
ルートフォルダーから下になぜか下がらない状態
メタデータにはchildはあるんやけどなーYudai.icon
やっと原因を見つけた、Sub_folder1を復号化してからSub_folder2を見つけ出さないといけないわ!Yudai.icon
def fetch_key, def decrypt_dataで再暗号化処理をする
def fetch_key -> fetchkeyでdycrypt_key, metadataをリターンする
これをDecryptRequestにしてdef decrypt_dataに送る