いっぺーちゃんの いろいろやってみよ~

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などでインストールします。

tiny_twitter_py_20170819.zip

また、Espruino on ESP32 で Twitter(その2) - いっぺーちゃんの いろいろやってみよ~にある通り、4つのキー(Consumer key、Consumer secret、Access Token、Access Token Secret)を用意しておいてください。

 

次回に続く。。。