みなさん こんにちはSTM32マイコン体験実習セキュリティ編パート3ですパート3ではトラストドーン対応ファームエアプロジェクトを扱う上で必要な知識とスキルを習得しますトラストドーン対応ファームエアを実機で動かす準備をした後最初の演習を体験します演習1と演習2で2つのキーポイントを体験しますSTM32にはオプションバイトと呼ばれる不機発生設定領域がありこのオプションバイトの設定でトラストゾーンを有効にしますSTM32エルゴマイコンのオプションビットTZENトラストゾーンをイネーブルを1に設定するとトラストゾーンが有効になりますSTM32キューブプログラマーを使ってSTM32エルゴマイコンのオプションバイトを変更しますこのスライドはSTM32エルゴのオプションバイトを変更する時の注意点をまとめていますオプションビットTZENを1に設定するとSTM32エルゴでトラストゾーン機能が有効になります一度オプションビットTZENを1に設定した後0に戻してトラストゾーンを無効にする操作は簡単に実行できないようになっています別のオプションバイトのRDPのレベルを0から1に設定してそれをまた0に戻す操作が必要になりますTZENが1になっていてトラストゾーンが有効の状態でRDPレベル1に設定する時に注意点があります積は空間でブートしてその後ノーマル空間にジャンプしてノーマル空間で動作を維持するファームエアがSTM32エルゴマイコンの内部フラッシュメモリに書き込んである必要がありますそうでないとRDPレベル1に設定した直後からJタグがつながらなくなります一旦この状態になるとSTM32エルゴ内蔵ブートローダーを使わないと復旧できなくなりますまた誤ってRDPレベル2に設定してしまうと内部フラッシュメモリに書き込まれているファームエアに関係なくJタグがつながらなくなり二度と復旧できなくなりますPCとニュークレオ基板をUSBケーブルで接続してCubeプログラマーを起動しますCubeプログラマーの画面右上のコネクトボタンをクリックして基板上のターゲットマイコンと接続しますオプションバイトを読み書きする時はCubeプログラマーの左サイドメニューのOBアイコンをクリックしますオプションバイト画面の上から3番目にあるユーザーコンフィグレーションの三角矢印をクリックして展開しますユーザーコンフィグレーションの下の方にTZENビットの設定がありますTZENにチェックを入れてアプライボタンをクリックしますTZENを1に設定したら演習1をやってみましょうデフォルトではSTM32エルゴの内部フラッシュメモリは2つのバンクで構成されていますトラストドーンを有効にした直後はフラッシュバンク1と2のどちらもセキュアに設定されていますトラストドーン対応サンプルファーメアはフラッシュバンク1がセキュアでフラッシュバンク2がノンセキュアの設定であることを前提に動作しますフラッシュバンク2がセキュアの設定のままでこのトラストドーン対応サンプルファーメアを動作させたらどうなるか試すのが演習1ですこのスライドはトラストドーンを有効にした直後の内部フラッシュメモリのセキュリティ設定を絵にしたものです青色がセキュアで赤色がセキュアではないノーマルを示していますトラストドーン対応ファーメアはリセット後にまずセキュアファーメアでブートし処理を実行してその後ノーマルファーメアにジャンプしますメインループはノーマルファーメアで動作しますファームエアコードを内部フラッシュメモリからフェッチして実行する時コアテックスM33はSAUとIDAUでアドレス空間へのアクセスを常時チェックしていますこのチェックを通った後さらに内部フラッシュメモリ固有のセキュリティ設定がチェックされてこれも合格するとフラッシュメモリやのアクセスが成立しますこのスライドが示すようにノーマルファーメア実行時にSAUとIDAUのフラッシュバンク2のセキュリティ設定はノーセキュアになっているためチェックは通りますがその後の内部フラッシュメモリ固有のセキュリティ設定はセキュアになっていますこの状態で何が起きるかを体験するのが演習一の目的です演習用プロジェクトTKY.zipをhtm32cubefarmware.lgoバージョン1.3.0の指定の場所に回答します回答した後スライドが示すディレクトリ構造になっているか確認しますなっていなければディレクトリ構造を調整してくださいこのディレクトリパスのトラストゾン対応ファーメアサンプルを使いますEW armディレクトリにあるワークスペースファイルproject.euwをiarewarmで開きますトラストゾン対応ファーメアプロジェクトはセキュアファーメアプロジェクトとノーマルファーメアプロジェクトの2つのプロジェクトで構成されますどちらを先にビルドするか順序がありますまずセキュアファーメアをビルドして次にノーマルファーメアの順にビルドしますこの順序でビルドしないとノーマルファーメアのビルドでリンクエラーが発生しますセキュアファーメアをビルドするとセキュアファーメアバイナリの他にインポートリーブというものが生成されノーマルファーメアのビルド時にインポートリーブがノーマルファーメアとリンクされますインポートリーブにはノーマルファーメアからセキュアファーメアの関数を呼び出す際の情報が入っています以上の手順を毎回繰り返してノーマルファーメアとセキュアファーメアを書き込むのは大変なのでもっと便利な方法を使いますバッチビルドを使うとセキュアファーメアとノーマルファーメアを一括でビルドできますプロジェクトオプションを調整してダウンロードしてデバッグを実行するとノーマルファーメアとセキュアファーメアを一括してダウンロードしてデバッグを開始できますセキュアファーメアプロジェクトのオプションを調整しますセキュアファーメアプロジェクトを右クリックしてポップアップを表示しますポップアップメニューの一番上にあるオプションズを選んでくださいデバッグカーカテゴリーのイメージタブを選んでくださいダウンロードイクストライイメージにチェックを入れてファステキストボックスにノーマルファーメアのドットアウトファイルの場所を入力しますプロジェDIR環境変数を使うとプロジェクトドットEWWファイルがある場所を参照できますオフセットはゼロにしてデバッグインフォンオンリーのチェックを外しますこのオプション設定にした後セキュアファーメアがアクティブなプロジェクトの状態でダウンロードしてデバッグを実行しますセキュアファーメアとノーマルファーメアがターゲットマイコンに一括でダウンロードされた後デバッグは開始しますダウンロードしてデバッグを実行するには白抜き矢印に緑色の円のこのアイコンをクリックしますダウンロードが終わったらF5キーを押すかこのアイコンをクリックしてプログラムを実行します演習1の答えです内部フラッシュメモリバンク2がセキュアに設定されている状態でトラストノーン対応サンプルファーメアを実行するとセキュアファーメアで起動してノーマルファーメアにジャンプした時点でセキュアフォールと例外が発生しますこれはノーマルファーメアが内部フラッシュメモリバンク2にアクセスしようとしてもバンク2はセキュアに設定されているため不正なアクセスと判定された結果になりますコアテックスM23の場合はセキュアフォールと例外がなくハードフォールと例外で処理することになりますこのスライドで何が起きているか説明しますリセット後セキュアファーメアでSUを設定しフラッシュメモリバンク2をアドレス空間上でノーセキュア領域にしますこの設定によりノーマルファーメアからフラッシュメモリバンク2にアクセスするとSAUとIDAUのチェックをパスしますしかし内部フラッシュメモリ固有のセキュリティ設定ではフラッシュメモリバンク2がセキュア領域になっているため実際にはフラッシュメモリバンク2にはアクセスできず例外が発生しますフラッシュメモリバンク2のウォーターマークベース保護を変更してノーセキュアにするとこのファーメアが正常に動作するようになります内部フラッシュメモリ固有のセキュリティ設定は2種類あります1つ目はウォーターマーク保護ですこの保護はリセットがかかったり電源オフになっても維持されますSTM32にはオプションバイトと呼ばれる吹き発生設定領域がありこのオプションバイトで内部フラッシュメモリのウォーターマーク保護を設定します吹き発生領域なのでオプションバイトを一度設定するとリセットがかかったり電源オフになっても設定が維持されます2つ目はブロックベース保護ですこの保護はリセットがかかったり電源オフになるとなくなりますマイコン起動後にフラッシュメモリレジスターを設定してウォーターマーク保護がかかっていないフラッシュメモリ領域を保護する仕組みですこのスライドは内部フラッシュメモリ固有のセキュリティ設定をまとめていますウォーターマーク保護の場合はフラッシュメモリの開始ページ番号と終了ページ番号で保護する領域の大きさを設定しますウォーターマーク保護はオプションバイトで設定しますリセットがかかってもその設定は消えません開始ページ番号が終了ページ番号より大きい場合はフラッシュメモリのすべての領域がノンセキュアの保護されていない状態になりますブロックベース保護の場合はページ単位でどのページをノンセキュア領域からセキュア領域に変更するか設定しますブロックベース保護はセキュアステートでないと設定できませんデバイスレジスターで設定するためリセットがかかると設定が消えますウォーターマーク保護でセキュアになっている領域をブロックベース保護でノンセキュアに変更できませんフラッシュメモリのページの大きさはデュアルバンク設定の場合はページ1さたり2キロバイトですシングルバンク設定の場合はページ1さたり4キロバイトですこのスライドは内部フラッシュメモリのウォーターマーク保護について詳しくまとめていますフラッシュウォーターマーク保護はフラッシュメモリ上で保護をかけたい領域の初めと終わりをページ番号で指定しますフラッシュウォーターマーク保護開始ページと終了ページを設定するオプションバイトがフラッシュバンク1と2それぞれに対して個別に設定できるようになっていますシングルバンク設定の場合はフラッシュバンク1向けの設定しか使えません開始ページ番号と終了ページ番号の設定の仕方が3パターンあります開始ページ番号が終了ページ番号よりも大きい場合フラッシュメモリの全ての領域が保護のないノーセキュアな領域になります開始ページ番号と終了ページ番号が同じ場合その番号のページ領域の見保護されます開始ページ番号が終了ページ番号より小さい場合開始ページから終了ページまでが保護されます開始ページと終了ページの領域も保護対象になりますトラストゾーンを有効にした直後は開始ページ番号が0X00で終了ページ番号が0X7Fになっていますトラストゾーン対応サンプルファーメアが正常動作するには内部フラッシュメモリバンク2のウォーターマーク保護がノーセキュアになっていることが必要です内部フラッシュメモリバンク2のウォーターマーク保護の設定を変更するにはオプションバイトの設定を変更しますウォーターマーク保護は内部フラッシュメモリのページ領域単位で設定でき、デュアルバンク設定の場合はページ1つあたり2キロバイトですオプションビットTZENを1にしてトラストゾーンを有効にした直後は開始ページ番号が0X00で終了ページ番号が0X7Fになっていますこの設定ではフラッシュメモリバンク2全体がセキュアになっていますノーマルファームエアを内部フラッシュメモリバンク2に書き込んであるのでフラッシュバンク2をウォーターマーク保護なしに設定しますフラッシュバンク2全体を保護なしにするには開始ページ番号を終了ページ番号よりも大きな値にしますSTM32キューブプログラマーでオプションバイト設定を調整しましょうキューブプログラマーを起動してターゲットマイコンに接続してくださいキューブプログラマーを起動してターゲットマイコンに接続できたら左サイトメニューのOBIコンをクリックしますオプションバイト設定画面に切り替わったら下から二列目のセキュアエリア2を展開しますセキュアエリア2という文字の左横にある三角形をクリックすると展開しますセクションウォーターマークにページスタートの値を0X01に設定します次にセクションウォーターマークにページエンドの値を0X00にします値を変更できたらアプライボタンをクリックします以上でフラッシュメモリバンク2がウォーターマーク保護なしになりますキューブプログラマーを閉じてEWアームに戻りますトラストノン対応サンプルファームウェアをもう一緒動作させてみましょうEWアームのプロジェクトメニューからダウンロードしてデバッグを選んでEWアームとターゲットマイコンを接続してデバッグを開始しますダウンロードが終わったらF5キーオスカこの再生アイコンをクリックしてプログラムを実行します緑色のLEDが1秒前に点滅を継続しますトラストノン対応サンプルファームウェアの動作を追跡するためEWアームでマイコンをリセットしてブレークポイントを設置してからサイドを実行します一時停止アイコンをクリックしてプログラムの実行を止めますリセットアイコンをクリックしてマイコンにリセットをかけますブレークポイントをどこに設置するか分かりやすくするためEWアームのテキストエディターで行番号を表示しますツールズメニューからオプションを選びますIDオプション画面の左サイドベニューでエディターを選んで行番号を表示にチェックを入れますセキュアファームウェアのメイン.cの153行目にブレークポイントを設置しますワークスペースウィンドウでセキュアファームウェアプロジェクトを展開してアプリケーションフォルダセキュアフォルダの順に展開していきますメイン.cをダブルクリックするとソースビューにメイン.cのソースコードが表示されますソースビューの左端に行番号が表示されますので153行目を探してそこにブレークポイントを設置しますソースウィンドウの行番号の左横にグレーの余白がありますここをマイコンでクリックするとブレークポイントを設置できますノーマルファームウェアのメイン.cの124行目にブレークポイントを設置しますワークスペースウィンドウでノーマルファームウェアプロジェクトを展開してアプリケーションフォルダのセキュアフォルダの順に展開していきますメイン.cをダブルクリックするとソースビューにメイン.cのソースコードが表示されるのでセキュアファームウェアの時と同じ容量で124行目を探してブレークポイントを設置しますブレークポイントを設置できたらプログラムを実行しましょうセキュアファームウェアとノーマルファームウェアそれぞれに設置したブレークポイントでプログラムの実行が止まることを確認できたら編集には終了ですパートさんではトラストゾーン対応ファームウェアプロジェクトを扱う知識とスキルを修得しました次のステップでペリフェラルと割り込みのセキュリティ設定の仕方を修得しトラストゾーンでアイソレーションしたリソースにアクセスするための方法であるARMV8Mトラストゾーンセキュア予備出しを修得しますパート用に続きますご視聴いただきましてありがとうございました