接触日シート別冊は、日本の接触確認アプリCOCOAで陽性登録された際に通知サーバーに登録されるデータを整理し、推定の接触日とzipファイル単位のHASH値を付加し、統計情報として、また、広範な接触の非公式な接触日をHASH値からCOCOAユーザーご自身で求めていただくためのWebサイトです。
この接触日シートで提示しているデータを、どのように取得し、計算しているかをお示しするために、プログラム自体を公開することとしました。
プログラムの実行環境はMacです。
以下を除き、ご自身の責任で、対価無しに改変してご利用頂けますが、広告収入を含め有償サービスの実現のためにご利用頂く際には、事前にご相談ください。
satoru.net @satorunet には使用許諾をしません。使用を発見した際には差止請求、損害賠償請求をします。
list.jsonとzipファイルをダウンロードします。 rocazさん https://twitter.com/rocaz のprobeCOCOATekを実行しているだけです。 https://github.com/rocaz/probeCOCOATek rocazさんに感謝申し上げます。ご利用方法はprobeCOCOATekのご案内をご参照ください。
list.jsonのzipについて、zipファイルから接触日とHASHを算出し、表(contactDay.csv)にしています。 シェルスクリプトは読みづらいですね。
contactDay.csvをスプレッドシートに読み出します。
実行結果のスプレッドシートです。
接触日シート別冊は、このスプレッドシートをリソースにしています。
zipに含まれている export.bin のHASHです。Macのターミナル等のシェルで、shasumコマンドで求まります。 zip番号が4000であれば、zipfilesに格納されているとして、次で求まります。
unzip -o -p zipfiles/4000.zip "export.bin" | shasum -a 256
このHASH値は、iOSの「チェックの詳細」画面などに表示されるHASH値で、zipファイルと一対一に対応しています。ですので、COCOA 1xまでは、HASH値がわかると、zip番号を特定できます。 AndroidのHASHとは異なります。
zipファイルには複数のTEKが格納されており、zipファイル1ファイルに含まれている複数のTEKのそれぞれのrolling_start_interval_numberは同じ値です。
rolling_start_interval_numberは、接触確認が機能しているスマホ間でBLTで送受信されるキー(接触符号, RPI)の開始日時です。有効期間は24時間です。
開始日時なので、スマホがすれ違った日(接触日)です。
仕様上UTCなので仕様通りなのであれば日本時間に変換すべきですが、日本時間で出力されているように解しており、接触日シート別冊では日本時間への変換をしていません。
そのように解しているのは、2020年8月から9月に不特定の方、100名ほどからの聴き取り結果によりますが、その後のAPIやCOCOAのバージョンアップの影響は検証しきれておりません。
(cocoa_logの daysSinceLastExposure は、"output_date"を日本時間と考えて9時間戻してUTCにし、daysSinceLastExposureの値を日として減算した日時の日を(最後の)接触日とするのが現状では整合的と考えております)。
HASH値からzip番号を特定い、zipに含まれるTEKのrolling_start_interval_numberは同じ値なので、HASH値から接触日を推定できています。
EN2 (ExposureWindow)の採用により、提供されたキーの数(MatchCount)がzip(HASH)ごとに示されなくなったため、HASHから接触日を推定することができなくなりました。
なお、EN2では、接触日は9時スタートと解しています。
上記の処理で得られているファイルも公開しておりましたが、TEK配信が1日に数回となり、情報処理負担が増加したため、公開を見合わせています。
しかし、広範な接触(キーの一致)で公費PCRを実施いただいている保健所様、病院様・クリニック様には、ご要望に応じた使いやすいデータとしてご提供できますので、ご相談ください。(スプレッドシートの共有や、Excelファイルの自動的なメール添付送信など)。 感染拡大の抑止へのご協力、ありがとうございます。