@@ -679,6 +679,15 @@ int emv_tlv_get_info(
679
679
info -> format = EMV_FORMAT_AN ;
680
680
return emv_tlv_value_get_string (tlv , info -> format , 8 , value_str , value_str_len );
681
681
682
+ case EMV_TAG_9F1D_TERMINAL_RISK_MANAGEMENT_DATA :
683
+ info -> tag_name = "Terminal Risk Management Data" ;
684
+ info -> tag_desc =
685
+ "Application-specific value used by the contactless card or "
686
+ "payment device for risk management purposes. All RFU bits "
687
+ "must be set to zero." ;
688
+ info -> format = EMV_FORMAT_B ;
689
+ return emv_terminal_risk_management_data_get_string_list (tlv -> value , tlv -> length , value_str , value_str_len );
690
+
682
691
case EMV_TAG_9F1E_IFD_SERIAL_NUMBER :
683
692
info -> tag_name = "Interface Device (IFD) Serial Number" ;
684
693
info -> tag_desc =
@@ -4433,6 +4442,135 @@ int emv_iad_get_string_list(
4433
4442
}
4434
4443
}
4435
4444
4445
+ int emv_terminal_risk_management_data_get_string_list (
4446
+ const uint8_t * trmd ,
4447
+ size_t trmd_len ,
4448
+ char * str ,
4449
+ size_t str_len
4450
+ )
4451
+ {
4452
+ struct str_itr_t itr ;
4453
+
4454
+ if (!trmd || !trmd_len ) {
4455
+ return -1 ;
4456
+ }
4457
+
4458
+ if (!str || !str_len ) {
4459
+ // Caller didn't want the value string
4460
+ return 0 ;
4461
+ }
4462
+
4463
+ if (trmd_len != 8 ) {
4464
+ // Terminal Risk Management Data (field 9F1D) must be 8 bytes
4465
+ return 1 ;
4466
+ }
4467
+
4468
+ emv_str_list_init (& itr , str , str_len );
4469
+
4470
+ // Terminal Risk Management Data (field 9F1D) byte 1
4471
+ // See EMV Contactless Book C-2 v2.11, Annex A.1.161
4472
+ // See M/Chip Requirements for Contact and Contactless, 28 November 2023, Chapter 5, Terminal Risk Management Data
4473
+ if (trmd [0 ] & EMV_TRMD_BYTE1_RESTART_SUPPORTED ) {
4474
+ // NOTE: EMV Contactless Book C-8 v1.1, Annex A.1.129 does not define
4475
+ // this bit and it avoids confusion if no string is provided when this
4476
+ // bit is unset
4477
+ emv_str_list_add (& itr , "Restart supported" );
4478
+ }
4479
+ if (trmd [0 ] & EMV_TRMD_BYTE1_ENCIPHERED_PIN_ONLINE_CONTACTLESS ) {
4480
+ emv_str_list_add (& itr , "Enciphered PIN verified online (Contactless)" );
4481
+ }
4482
+ if (trmd [0 ] & EMV_TRMD_BYTE1_SIGNATURE_CONTACTLESS ) {
4483
+ emv_str_list_add (& itr , "Signature (paper) (Contactless)" );
4484
+ }
4485
+ if (trmd [0 ] & EMV_TRMD_BYTE1_ENCIPHERED_PIN_OFFLINE_CONTACTLESS ) {
4486
+ emv_str_list_add (& itr , "Enciphered PIN verification performed by ICC (Contactless)" );
4487
+ }
4488
+ if (trmd [0 ] & EMV_TRMD_BYTE1_NO_CVM_CONTACTLESS ) {
4489
+ emv_str_list_add (& itr , "No CVM required (Contactless)" );
4490
+ }
4491
+ if (trmd [0 ] & EMV_TRMD_BYTE1_CDCVM_CONTACTLESS ) {
4492
+ emv_str_list_add (& itr , "CDCVM (Contactless)" );
4493
+ }
4494
+ if (trmd [0 ] & EMV_TRMD_BYTE1_PLAINTEXT_PIN_OFFLINE_CONTACTLESS ) {
4495
+ emv_str_list_add (& itr , "Plaintext PIN verification performed by ICC (Contactless)" );
4496
+ }
4497
+ if (trmd [0 ] & EMV_TRMD_BYTE1_PRESENT_AND_HOLD_SUPPORTED ) {
4498
+ // NOTE: EMV Contactless Book C-8 v1.1, Annex A.1.129 does not define
4499
+ // this bit and it avoids confusion if no string is provided when this
4500
+ // bit is unset
4501
+ emv_str_list_add (& itr , "Present and Hold supported" );
4502
+ }
4503
+
4504
+ // Terminal Risk Management Data (field 9F1D) byte 2
4505
+ // See EMV Contactless Book C-2 v2.11, Annex A.1.161
4506
+ // See EMV Contactless Book C-8 v1.1, Annex A.1.129
4507
+ // See M/Chip Requirements for Contact and Contactless, 28 November 2023, Chapter 5, Terminal Risk Management Data
4508
+ if (trmd [1 ] & EMV_TRMD_BYTE2_CVM_LIMIT_EXCEEDED ) {
4509
+ emv_str_list_add (& itr , "CVM Limit exceeded" );
4510
+ }
4511
+ if (trmd [1 ] & EMV_TRMD_BYTE2_ENCIPHERED_PIN_ONLINE_CONTACT ) {
4512
+ emv_str_list_add (& itr , "Enciphered PIN verified online (Contact)" );
4513
+ }
4514
+ if (trmd [1 ] & EMV_TRMD_BYTE2_SIGNATURE_CONTACT ) {
4515
+ emv_str_list_add (& itr , "Signature (paper) (Contact)" );
4516
+ }
4517
+ if (trmd [1 ] & EMV_TRMD_BYTE2_ENCIPHERED_PIN_OFFLINE_CONTACT ) {
4518
+ emv_str_list_add (& itr , "Enciphered PIN verification performed by ICC (Contact)" );
4519
+ }
4520
+ if (trmd [1 ] & EMV_TRMD_BYTE2_NO_CVM_CONTACT ) {
4521
+ emv_str_list_add (& itr , "No CVM required (Contact)" );
4522
+ }
4523
+ if (trmd [1 ] & EMV_TRMD_BYTE2_CDCVM_CONTACT ) {
4524
+ emv_str_list_add (& itr , "CDCVM (Contact)" );
4525
+ }
4526
+ if (trmd [1 ] & EMV_TRMD_BYTE2_PLAINTEXT_PIN_OFFLINE_CONTACT ) {
4527
+ emv_str_list_add (& itr , "Plaintext PIN verification performed by ICC (Contact)" );
4528
+ }
4529
+
4530
+ // Terminal Risk Management Data (field 9F1D) byte 3
4531
+ // See EMV Contactless Book C-2 v2.11, Annex A.1.161
4532
+ // See M/Chip Requirements for Contact and Contactless, 28 November 2023, Chapter 5, Terminal Risk Management Data
4533
+ if (trmd [2 ] & EMV_TRMD_BYTE3_MAGSTRIPE_MODE_CONTACTLESS_NOT_SUPPORTED ) {
4534
+ // NOTE: EMV Contactless Book C-8 v1.1, Annex A.1.129 does not define
4535
+ // this bit and it avoids confusion if no string is provided when this
4536
+ // bit is unset
4537
+ emv_str_list_add (& itr , "Mag-stripe mode contactless transactions not supported" );
4538
+ }
4539
+ if (trmd [2 ] & EMV_TRMD_BYTE3_EMV_MODE_CONTACTLESS_NOT_SUPPORTED ) {
4540
+ // NOTE: EMV Contactless Book C-8 v1.1, Annex A.1.129 does not define
4541
+ // this bit and it avoids confusion if no string is provided when this
4542
+ // bit is unset
4543
+ emv_str_list_add (& itr , "EMV mode contactless transactions not supported" );
4544
+ }
4545
+ if (trmd [2 ] & EMV_TRMD_BYTE3_CDCVM_WITHOUT_CDA_SUPPORTED ) {
4546
+ // NOTE: EMV Contactless Book C-8 v1.1, Annex A.1.129 does not define
4547
+ // this bit and it avoids confusion if no string is provided when this
4548
+ // bit is unset
4549
+ emv_str_list_add (& itr , "CDCVM without CDA supported" );
4550
+ }
4551
+
4552
+ // Terminal Risk Management Data (field 9F1D) byte 4
4553
+ // See EMV Contactless Book C-2 v2.11, Annex A.1.161
4554
+ // See EMV Contactless Book C-8 v1.1, Annex A.1.129
4555
+ if (trmd [3 ] & EMV_TRMD_BYTE4_CDCVM_BYPASS_REQUESTED ) {
4556
+ emv_str_list_add (& itr , "CDCVM bypass requested" );
4557
+ }
4558
+ if (trmd [3 ] & EMV_TRMD_BYTE4_SCA_EXEMPT ) {
4559
+ emv_str_list_add (& itr , "SCA exempt" );
4560
+ }
4561
+
4562
+ // Terminal Risk Management Data (field 9F1D) RFU bits
4563
+ if ((trmd [1 ] & EMV_TRMD_BYTE2_RFU ) ||
4564
+ (trmd [2 ] & EMV_TRMD_BYTE3_RFU ) ||
4565
+ (trmd [3 ] & EMV_TRMD_BYTE4_RFU ) ||
4566
+ trmd [4 ] || trmd [5 ] || trmd [6 ] || trmd [7 ]
4567
+ ) {
4568
+ emv_str_list_add (& itr , "RFU" );
4569
+ }
4570
+
4571
+ return 0 ;
4572
+ }
4573
+
4436
4574
int emv_ttq_get_string_list (
4437
4575
const uint8_t * ttq ,
4438
4576
size_t ttq_len ,
0 commit comments