以下のコードが計測時間内に実行されることが想定されているのか、それとも設定に何か問題があって実行が非常に遅くなっているのかを突き止めようとしています。このコードは、kCASPER_ECC_P256を使用して指定された秘密鍵から公開鍵を生成する関数の一部です。
以下のコードは、GPIOトグルを使用して実行時間を計測します。Set および Clear GPIO 呼び出しの間には 337 ミリ秒かかります。これは、この演算におけるハードウェアアクセラレーションによる計算処理としては遅いように思われる。これは想定内のことでしょうか?私のMCUのコアクロックは148MHzです。CASPERエンジンのクロックソースを選択して処理速度を向上させる方法はありますか?
/* Base Generator Point G(x, y) for secp256r1 in 32-bit Little-Endian word arrays */
static const uint32_t G_x_le[8] = {
0xD898C296, 0xF4A13945, 0x2DEB33A0, 0x77037D81,
0x63A440F2, 0xF8BCE6E5, 0xE12C4247, 0x6B17D1F2
};
static const uint32_t G_y_le[8] = {
0x37BF51F5, 0xCBB64068, 0x6B315ECE, 0x2BCE3357,
0x7C0F9E16, 0x8EE7EB4A, 0xFE1A7F9B, 0x4FE342E2
};
uint32_t scalar_le[8];
uint32_t Q_x_le[8];
uint32_t Q_y_le[8];
/* Copy Big-Endian private scalar and convert to Little-Endian for CASPER */
memcpy(scalar_le, key_buffer, 32);
swap_endian_32((uint8_t *)scalar_le);
/* 1. Initialize CASPER coprocessor */
CASPER_Init(CASPER);
CASPER_ecc_init(kCASPER_ECC_P256);
HW_DB_PinSet();
/* 2. Compute Q = d * G using CASPER hardware */
CASPER_ECC_SECP256R1_Mul(
CASPER,
Q_x_le, Q_y_le,
G_x_le, G_y_le,
scalar_le
);
HW_DB_PinClear();こんにちは、 @guitardenver
同じ操作を、150MHzで動作するLPC55S28 EVK上でMCUXpresso SDK CASPER例を用いて測定しました。CASPER_ECC_SECP256R1_Mul() を 1 回呼び出すのに約 2410 万 CPU サイクルが必要で、これは約 160 ミリ秒の実行時間に相当します。
この結果に基づくと、アプリケーションで測定された337msは、特に追加のキーフォーマット、データ変換、初期化、デバッグビルドのオーバーヘッドが含まれれば、不合理とは思えません。
CASPERは、ユーザーが設定可能な別のクロックソースを提供していません。実行時間は主にCASPARアクセラレータを利用したECCソフトウェア実装によって決定されます。
BR
ハリー
できることがいくつかあります。しかし、このMCUでCASPERエンジンのクロック設定オプションは見当たりません。
1. 速度向上のためにO2最適化を使用する
2.フラッシュアクセラレータのプリフェッチと待機状態の最適化を有効にしてください。