🤓

Chrome は SubtleCrypto.decrypt() のエラーを識別しない

2023/12/30に公開

発見に至る経緯

Web Crypto API の勉強がてら自分用のオフラインパスワードマネージャを開発しています。
JSON 形式にシリアライズして暗号化したオブジェクト、および暗号・復号に用いる CryptoKeyIndexedDB に保存する仕組みにしました。
鍵は生成時に extractable プロパティを false に設定することで平文として取得できなくなります。IndexedDB に保存された CryptoKey は鍵の参照のみを API に提供するので、ユーザーや拡張機能、あるいはマルウェアにストレージを開けられて勝手に持ち出される心配がなくなります。

開発を進めるにつれて、やがて SubtleCrypto.decrypt(...) の部分でエラーが発生します。Promise ベースの API ということで .catch(...) でログを取ることに。しかし

console
Error

としか出ず、MDN にあるエラーのどれにあたるのか分からない事態に。(この時点で他のブラウザで検証すべきだったのですが)かれこれ一時間は格闘し、やがて FireFox での検証でエラーの正体が OperationError であった事が判明しました。

反省

デバッグは2つ以上のブラウザで行うようにします。。

Discussion