親愛なるサポート、
顧客は、SE05X モジュールを使用して Ed25519 (EdDSA) キーのインポートおよび署名検証テストを実行したときに次の問題が発生したため、次の確認を求めています。
1. Ed25519 の署名/検証に使用する正しいアルゴリズム ID (0xA0 または 0xA3) は何ですか?
2. 署名のバイト順序(逆にする必要がありますか)?
3. 署名 TLV とタグ番号の順序は解析に影響しますか?
4. 「6A80」エラー コードの正確な定義は何ですか?
5. メッセージ入力は生データにすべきか、ハッシュにすべきか?
詳細なテスト結果は次のとおりです。
### 🧾 I. テスト環境
* マイコン: **STM32L476RET6**
ツールチェーン: **STM32CubeIDE**
* インターフェース: **I²C**
* SE05Xファームウェア: **v1.8.0**
* ローカル比較ライブラリ: **libsodium (Ed25519-pure)**
---
###
| 操作 | APDU コマンド | SW | 結果 |
| ---- | ----------------- | ---- | -- |
| 秘密鍵のインポート | WRITE_ED25519_KEY | 9000 | 成功 |
| 公開キーの読み取り | READ_ED25519_PUB | 9000 | 成功 |
| 署名 | ED25519_SIGN | 9000 | 成功 |
| 検証 | ED25519_VERIFY | 6A80 | 失敗 |
ローカル署名検証 | libsodium verify | PASS | 成功 |
### 🧩 I. 問題の概要
顧客は、STM32L476 プラットフォーム上の APDU コマンドを使用して SE05X と通信します。
現在、**Ed25519 キーのインポートと署名操作はどちらも成功しています (SW=9000)** が、**Ed25519 署名検証コマンドは SW=6A80 を返します**。
ログによると:
* インポート時の SW=9000
* 署名時のSW=9000
* 検証中のSW=6A80
ローカル ライブラリ (libsodium) は、同じメッセージと署名を使用して成功を確認します。
したがって、顧客は問題が**アルゴリズム ID、署名バイト順序、または TLV 形式の順序**にあると疑っています。
---
### 🧠 II. メーカーの確認が必要な重要な質問
#### **
Ed25519 のアルゴリズム ID に使用する値を確認してください。
* ドキュメントでは `0xA0` (Ed25519-PURE) と説明されています。
顧客の現在のコードは `0xA3` (Ed25519ph/ctx) を使用します。
SE05X 署名検証は、アルゴリズム ID の不一致により 6A80 を返しますか?
```c
// 現在使用中
uint8_t アルゴ = 0xA3; // Ed25519 アルゴリズム ID
tlv_put(ペイロード、sizeof(ペイロード)、&poff、TAG_2、&algo、1);
「」
---
#### **
SE05X によって返される署名は R||S (64 バイト) です。
R と S の両方でバイト反転が必要かどうかを確認してください。
顧客のテストにより次のことが明らかになりました:
* **反転なし** → SE05X 検証失敗 (6A80)
* **取り消し** → ローカルビザの検証は成功しましたが、SE05Xビザの検証は依然として失敗しました。
```c
// 現在の処理ロジック
extract_sig64_from_rapdu(rapdu、rlen、sig64);
逆バイト(sig64, 32);
逆バイト(sig64 + 32, 32);
memcpy(署名, sig64, 64);
「」
顧客は、SE05X の Ed25519 署名を **そのまま** 使用すべきかどうかを確認したいと考えています。
---
#### **
Ed25519 検証の TLV パラメータの順序を確認してください。
顧客は現在次のシーケンスを使用しています。
「」
TAG_1(キーID)
TAG_2(アルゴリズム)
TAG_4(署名)
TAG_3(メッセージ)
「」
ただし、一部の文書では次のように記載されています。
「」
TAG_1(キーID)
TAG_2(アルゴリズム)
TAG_5(署名)
TAG_3(メッセージ)
「」
シーケンスまたはタグ ID が正しくない場合、エラー 6A80 が発生しますか?
```c
tlv_put(ペイロード、sizeof(ペイロード)、&poff、TAG_1、key_id、4);
tlv_put(ペイロード、sizeof(ペイロード)、&poff、TAG_2、&algo、1);
tlv_put(ペイロード、sizeof(ペイロード)、&poff、TAG_4、署名、64);
tlv_put(ペイロード、sizeof(ペイロード)、&poff、TAG_3、メッセージ、msg_len);
「」
---
#### **
`SW=6A80` の SE05X の具体的な意味を教えてください。
このエラーは次のことを示していますか?
* 署名の不一致(検証失敗)、または
* APDU構造/TLV長さ/パラメータエラー?
顧客は、さらなるデバッグのために EdDSA 操作のエラー コードのリストを希望しています。
---
#### **
Ed25519-PURE モードでは、事前ハッシュ (SHA512) データの代わりに **生のメッセージ** を渡す必要がありますか?
現在、顧客は次のように元のメッセージを直接送信しています。
```c
// 現在の署名入力
tlv_put(ペイロード、sizeof(ペイロード)、&poff、TAG_3、msg、msg_len);
「」
SE05X が内部で SHA512 計算を実行しているかどうかを確認してください。
ご返信をお待ちしております!
こんにちは@Nancy_LAN 、
弊社のMWは、これらの関数を既に実装したデモ「ex_eddsa」を提供しています。まずはお客様のボードでこのデモをテストし、正しく動作するか確認してから、お客様が作成したコードと比較して違いを確認することができます。「x6a80」は「データフィールドのパラメータが正しくありません」という意味です。
すてきな一日を!
カン
---------------------------------------------------------------------------------
注記:
- この投稿があなたの質問への回答である場合は、「正解としてマーク」ボタンをクリックしてください。ありがとう!
- スレッドは最後の投稿から7週間フォローされます。それ以降の返信は無視されます。
後ほど関連する質問がある場合は、新しいスレッドを開いて、閉じたスレッドを参照してください。
---------------------------------------------------------------------------------