PN7462を使用してMifare Ultralight Cを利用可能に <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
ご存知かもしれませんが、こんにちはNFCコミュニティPN7462ファミリは、高性能と低消費電力を提供する32ビットArm® Cortex-M0®ベースのNFCマイクロコントローラで構成されています。シンプルな命令セットとメモリアドレス指定があり、既存のアーキテクチャと比較してコードサイズが小さくなっています。PN7462ファミリは、NFCなどの機能、すべてのNFCフォーラムモードをサポートするオールインワンソリューション、マイクロコントローラ、オプションの接触式スマートカードリーダー、およびソフトウェアを1つのチップで提供します。最大 20 MHz の CPU 周波数で動作します。 MIFARE® Ultralightベースのチケットは、公共交通機関、ポイントカード、イベントチケットなどの低コストで大量のアプリケーションに最適なソリューションを提供します。これらは、磁気ストライプ、バーコード、またはQRコードシステムの完全な非接触代替品として機能します。使用制限のあるアプリケーション向けの非接触MIFARE Ultralight® ICの導入により、システムの設置および保守コストを削減できます。ご存知かもしれませんが、MIFAREファミリには、3DES暗号化をサポートする非接触ICであるUltralight Cタグがあり、主にスマートチケットなどの限定使用アプリケーションで使用され、このタグはISO 14443-3タイプAに準拠し、タイプ2タグとして定義されています。 このドキュメントでは、NXP Reader Libraryで提供されている例を変更して、パーソナライズされていないMifare Ultralight Cに認証し、読み取り操作を実行する方法を示します。 原材料: PN7462 または PNEV7462 (これはNXPの評価ボードです) PN7462リーダーライブラリ Mifare ウルトラライトC Mifare Ultralight C データシート MCUXpresso まず、NfcrdlibEx4_MIFAREClassic.cに行きます。コード内のコメントでできるだけ多くのことを説明し、いくつかの情報を追加します ここでは、次のものを追加します。 #define MFULC_READ_DATA_SIZE 16 /* Number of bytes that is read by MIFARE Ultralight Read command */
#define MFULC_USER_MEMORY_BEGIN 0x04 /* Number of bytes that is read by MIFARE Ultralight Read command */
#define MFULC_PAGE_SIZE 0x04 /* Size of page of MIFARE Ultralight card */
#define KEYCOUNT 0x7FU /* number of keys */
#define KEYVERSIONS 0x01U /* number of key versions */
#define RAND_KEY_2K3DES_ADDRESS 0x01U /* Random 2K3DES key address in keystore */
#define RAND_KEY_2K3DES_VERSION 0x00U /* Random 2K3DES key version in keystore */
#define UL_C_KEY_ADDRESS 0x02U /* Ultralight C key address in keystore */
#define UL_C_KEY_VERSION 0x00U /* Ultralight C key version in keystore */
#define KEY_POSITION 0x00U /* Key position */
この後、グローバル変数宣言セクションで、以下を追加する必要があります。 phCryptoSym_Sw_DataParams_t cryptoEnc; /* CryptoSym parameter structure for ENC */
phCryptoSym_Sw_DataParams_t cryptoSymRng; /* CryptoSym parameter structure for SymRng */
phCryptoRng_Sw_DataParams_t cryptoRng; /* CryptoRng parameter structure for Rng */
phKeyStore_Sw_DataParams_t keyStore; /* KeyStore parameter structure */
static uint8_t gaUlcKey[] = {0x49, 0x45, 0x4D, 0x4B, 0x41, 0x45, 0x52, 0x42, 0x21, 0x4E, 0x41, 0x43, 0x55, 0x4F, 0x59, 0x46};
phacDiscLoop_Sw_DataParams_t * pDiscLoop; /* Discovery loop component */
void *psKeyStore;
void *psalMFUL;
void *ppalMifare; 変数 static uint8_t gaUlcKey[] = {0x49, 0x45, 0x4D, 0x4B, 0x41, 0x45, 0x52, 0x42, 0x21, 0x4E, 0x41, 0x43, 0x55, 0x4F, 0x59, 0x46};これは、データシートのセクション7.5.6に記載されているように、Mifare Ultralight cのデフォルトのキーであり、これは使用する必要があるキーの参照です。 次に、PAL変数を変更します /*PAL variables*/
phKeyStore_Sw_KeyEntry_t aKeyEntry[KEYCOUNT];
phKeyStore_Sw_KeyVersionPair_t aKeyVersion[KEYCOUNT * KEYVERSIONS];
phKeyStore_Sw_KUCEntry_t aKeyUsageCounter[KEYCOUNT];
uint8_t bDataBuffer[DATA_BUFFER_LEN]; /* universal data buffer */
uint8_t bSak; /* SAK card type information */
uint16_t wAtqa; /* ATQA card type information */
次に、これを131行目で変更します psalMFC = phNfcLib_GetDataParams(PH_COMP_AL_MFC); ~ psalMFUL = phNfcLib_GetDataParams(PH_COMP_AL_MFUL); したがって、これはMIFARE超軽量ALコンポーネントを取得し、この行の後に追加します ppalMifare = phNfcLib_GetDataParams(PH_COMP_PAL_MIFARE); 次に、Mifare classicがフィールドに存在しないことによるエラーを回避するために、Mifareクラシック機能を消去します。さらに、以下を追加します。 まず、認証の部分を進めます。API phalMful_UlcAuthenticate(pDataParams, wKeyNumber, wKeyVersion) を使用します。 最初のパラメータは、discoveryloop によってアクティブ化されたタグを指す構造体で、次にキー アドレス、最後にキーのバージョンを示します。ご覧のとおり、キーを送信せず、キーが保存されている場所と更新された場合はバージョンをタグに伝えるだけです。通信の機密性を確保するため。 /* Authenticate with the Key even if no memory of Ultralight Card is restricted by Authentication access Authentication with correct key provides access to any part of the memory (beside key storage) . */
/* Send authentication for entire Ultralight C */
status = phalMful_UlcAuthenticate(psalMFUL, UL_C_KEY_ADDRESS, UL_C_KEY_VERSION);
/* Check for Status */
if ((status & PH_ERR_MASK) != PH_ERR_SUCCESS)
{
/* Print Error info */
DEBUG_PRINTF("\nAuthentication Failed!!!");
DEBUG_PRINTF("\nPlease correct the used key");
DEBUG_PRINTF("\nExecution aborted!!!\n");
break;
}
DEBUG_PRINTF("\nAuthentication Successful");
/* この後、ステータスはOKでエラーは見つかりませんでしたが、これにエラーがある場合は、使用しているカードが以前に改ざんされておらず、キーを変更したか、ディストリビューターが設定されたキーを配信した場合は、正しいキーを使用してください。 次に、読み取り操作に進みます。 phalMful_Read(pDataParams, bAddress, pData) ご覧のとおり、最初のパラメータは認証と同じです。なぜなら、私たちはまだ同じタグと話しているので、その値MFULC_USER_MEMORY_BEGINは04です。これは、データシートのセクション7.5メモリ構成で見ることができるように、ユーザーメモリは4ページ目から39ページ目で終わるため、タグの最初のページとbDataBuffer 変数は受信した情報を格納します。 /* *************** READ operation ****************************** */
/* Empty the bDataBuffer */
memset(bDataBuffer, '\0', DATA_BUFFER_LEN);
DEBUG_PRINTF("\n\nRead data from page %d, %d, %d, %d", MFULC_USER_MEMORY_BEGIN, MFULC_USER_MEMORY_BEGIN + 1, MFULC_USER_MEMORY_BEGIN + 2, MFULC_USER_MEMORY_BEGIN + 3);
/* Read data from custom */
status = phalMful_Read(psalMFUL, MFULC_USER_MEMORY_BEGIN, bDataBuffer);
/* Check for Status */
if (status != PH_ERR_SUCCESS)
{
/* Print Error info */
DEBUG_PRINTF("\nRead operation failed!!!\n");
DEBUG_PRINTF("\nExecution aborted!!!\n\n");
break; /* Break from the loop*/
}
DEBUG_PRINTF("\nRead Success");
DEBUG_PRINTF("\nThe content of page %d is:\n", MFULC_USER_MEMORY_BEGIN);
phApp_Print_Buff(&bDataBuffer[0], MFULC_READ_DATA_SIZE); これは単純なプロジェクトですが、PN7462を使用してMifare Ultralight Cの使用方法を多くの人々が理解し、このプロジェクトに基づいてより複雑な例を開始するのに役立ちます。PEGODAリーダーを使用してMifare Ultralight c製品を構成する方法を知りたい場合は、私が投稿した「Mifare Ultralight C-デフォルトのパスワードの変更とページアドレスの保護」というドキュメントを確認してください。ご不明な点がございましたら、お知らせください。 BR ジョナサン
查看全文