Lispと一緒(42) ラズパイPico2でもuLisp、SHA256ハードを試用

Joseph Halfmoon

別シリーズの過去回にてラズパイPico2、RP2350の周辺回路 SHR256計算機(アクセラレータ?)を調べました。メンドいハッシュの計算を自主的に行ってくれる優れものです。調べただけで実機動作がまだだったので、今回uLispから突いて計算できることを確認。まあ動作確認用のサンプルコードでしかないすけど。

※Lispと一緒 投稿順 index はこちら

※実機確認は Raspberry Pi Pico2で行ってます。

※使用させていただいとります uLisp のバージョンは 4.6b (Arm用)です。

SHA256

ハッシュ関数といえば現在の定番はコレじゃないかと思います、SHA256ね。ラズパイPicoでは装備していなかったですが、セキュリティの高まったPico2のRP2350ではハードウエアのSHA256計算ハードウエアを搭載、こいつにおまかせすればよろし?これについてちょいと調べてみたのが以下の別シリーズ過去回です。

Pico三昧(47) ラズパイPico2:RP2350、Pico:RP2040、SHA256

実験用のソース

上記のハードウエア「計算機」をちょいと突いて動作していることを確認するだけの目的の uLispコードが以下に。実用に供することを考えておらんので、エラーがどうとか、リカバリはこうとかまったく考えていない手抜きです。

; RP2350 SHA256 Low level functions
; 2025/1/6 J.Halfmoon
(defun sha256-start ()
  (let ((sha256-base #x400f8000)
         (sha256-csr #x00))
    (register (+ sha256-base sha256-csr) 1)))

(defun sha256-wdata512 (lis16)
  (let ((sha256-base #x400f8000)
        (sha256-wdata #x04))
       (if (/= (length lis16) 16)
         nil
         (dolist (dat lis16)
           (sha256-rdy)
           (register (+ sha256-base sha256-wdata) dat)))))

(defun sha256-wait ()
  (let ((sha256-base #x400f8000)
        (sha256-csr #x00))
        (if (zerop (logand (register (+ sha256-base sha256-csr)) 4))
          (sha256-wait))))

(defun sha256-rdy ()
  (let ((sha256-base #x400f8000)
        (sha256-csr #x00))
        (if (zerop (logand (register (+ sha256-base sha256-csr)) 2))
          (sha256-rdy))))

(defun sha256-sum ()
  (let ((sha256-base #x400f8000)
        (sha256-sum0 #x08)
        (res '()))
    (dotimes (x 8 res)
      (setq res (cons (register (+ sha256-base sha256-sum0 (* x 4))) res)))))

(defun sha256-upto512 (lis16)
  (sha256-start)
  (sha256-wdata512 lis16)
  (sha256-wait)
  (sha256-sum)))

(defun toHexList (lis)
  (mapcan (lambda (x) (list (format nil "~x" x))) (reverse lis)))

; l
(defvar L16 
            '(#x6C800000 #x00000000 #x00000000 #x00000000
              #x00000000 #x00000000 #x00000000 #x00000000
              #x00000000 #x00000000 #x00000000 #x00000000
              #x00000000 #x00000000 #x00000000 #x00000008))

なお、末尾の defvar L16は、テスト用の入力パターンです。入力は512ビットブロック単位で、512ビットに満たない場合は、「パティング」することになってます。SHA256のパディングについてはどこぞに仕様があると思うのでご覧くだされ。上記では、アルファベットの1文字 l (小文字のL)、アスキーコード8ビットにパディングつめて512ビットとしてSHA256計算をお願いするためのものです。RP2350のSHA256計算機は512ビットの入力を32ビット単位で16回書きこむスタイルなので、32ビットx16要素のリストとしてます。

uLisp上での動作確認

上記プログラムをuLispにロード後、テストパターンを処理してみた結果が以下に。SHA256sample_uLisp

SHA256というだけあって、結果は256ビットっす。RP2350のSHA256計算機は32ビットの結果8個を返すスタイルなので、結果は8要素のリストとしてゲットするようにしています。下の方にあるLinux上での同じデータに対するSHA256計算の結果と比べるために、HEX表示で順番が同じくなるようにtoHexListとかいう関数を急遽一枚被せてあります。Lisp風の名前じゃないけど。

以下は同じ “l”一文字のテキストをLinux上で処理した結果です。SHA256sample_Linux

たぶん(全部見てないけど)同一結果が得られたみたい。ま、RP2350のSHA256計算ハードウエアは動いているみたい。いい加減な動作確認。

Lispと一緒(41) ラズパイPico2でもuLisp、uLisp to C 変換 へ戻る

Lispと一緒(43) ラズパイPico2でもuLisp、breakとtrace、デバッグ へ進む

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です