micropython on ESP32 でTwitter(その1)
Espruino on ESP32 で Twitter(その1) - いっぺーちゃんの いろいろやってみよ~のmicropython版です
これの元ネタがmicropython版なので、戻ってきた感じですが、Espruino版で入れた種々の変更も取り込んで一から作り直しました。
まずは、micropythonのBug fixです(笑)。
以下のパッチをあててmicropythonを再buildしてください。
これは、ハッシュ値の計算を2つ以上同時に行うと2つ目以降の計算値が不正になる、というBugを修正するものです。
mbedtlsでのハッシュ値の計算は、1つだけだとハードウェアを使用しますが、2つ目以降はソフトウェアで行います。これはハッシュ値計算用ハードウェアが1つしかないためです。
このとき、mbedtls_sha*_starts()で計算データの初期値を設定していないと、計算データが不正になります。
ハードウェアを使用する場合は、初期値の設定はハードウェアで自動的に行われるため、ハードウェアを使用する1つ目の計算は正常に行われます。
diff --git a/esp32/moduhashlib.c b/esp32/moduhashlib.c index 6f67aa7..5a6d20b 100644 --- a/esp32/moduhashlib.c +++ b/esp32/moduhashlib.c @@ -46,6 +46,7 @@ STATIC mp_obj_t sha256_make_new(const mp_obj_type_t *type, mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(union sha_ctxs)); o->base.type = type; mbedtls_sha256_init(&o->state.sha256); + mbedtls_sha256_starts(&o->state.sha256, 0); // [#/] add if (n_args == 1) { sha256_update(MP_OBJ_FROM_PTR(o), args[0]); } @@ -58,6 +59,7 @@ STATIC mp_obj_t sha1_make_new(const mp_obj_type_t *type, mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(union sha_ctxs)); o->base.type = type; mbedtls_sha1_init(&o->state.sha1); + mbedtls_sha1_starts(&o->state.sha1); // [#/] add if (n_args == 1) { sha1_update(MP_OBJ_FROM_PTR(o), args[0]); }
次はhmacモジュールのインストールです。
参照元にある通り、ここから拝借します。
hmac/hmac.pyの右上の「View」ボタンをクリックしてファイル全体を表示します(その他のファイルは使いません)。
右上の「Raw」ボタンを右クリックして「名前を付けて保存」を選択し、ローカルディスクに保存します。
Ubuntuから直接なら、以下のように実行しても取得できます。
wget https://raw.githubusercontent.com/bynds/micropython-lib/ff74b8cb508199a33e1978d68bd7076f2a536ab0/hmac/hmac.py
ダウンロードしたら、以下のパッチを当てます(ESP32ではuhashlibでなくhashlibなので)。
これをupipmなどでインストールします。
--- hmac.py.org 2017-08-19 07:06:27.771787400 +0900 +++ hmac.py 2017-08-19 07:17:43.191131335 +0900 @@ -8,7 +8,11 @@ #import hashlib as _hashlib #PendingDeprecationWarning = None #RuntimeWarning = None -import uhashlib as _hashlib +#import uhashlib as _hashlib +try: + import uhashlib as _hashlib +except: + import hashlib as _hashlib trans_5C = bytes((x ^ 0x5C) for x in range(256)) trans_36 = bytes((x ^ 0x36) for x in range(256))
さらにに以下のファイルをダウンロード&解凍し、upipmなどでインストールします。
また、Espruino on ESP32 で Twitter(その2) - いっぺーちゃんの いろいろやってみよ~にある通り、4つのキー(Consumer key、Consumer secret、Access Token、Access Token Secret)を用意しておいてください。
次回に続く。。。