BS2DeviceCapabilities capa; if (!CommonControl.getDeviceCapabilities(sdkContext, deviceID, out capa)) return; if (!Convert.ToBoolean(capa.functionExSupported & (byte)BS2CapabilityFunctionExSupport.FUNCTIONEX_SUPPORT_CUSTOMSMARTCARD)) { Console.WriteLine("Not supported function."); return; } BS2CustomCardConfig config; Console.WriteLine("Try to get CustomCardConfig"); BS2ErrorCode result = (BS2ErrorCode)API.BS2_GetCustomCardConfig(sdkContext, deviceID, out config); if (BS2ErrorCode.BS_SDK_SUCCESS != result) return; Util.HighlightLine("Please enter a data type of cards. (0: Binary, 1: ASCII, 2: UTF16, 3: BCS)", "data type"); Console.Write(">>>> "); config.dataType = Util.GetInput((byte)0); Util.HighlightLine("Do you want to use secondary key?", "use secondary key"); Console.Write(">>>> "); bool useSecondaryKey = Util.IsYes(); config.useSecondaryKey = Convert.ToByte(useSecondaryKey); Util.HighlightLine("Do you want to change mifare custom card settings? [Y/n]", "mifare custom card"); Console.Write(">>>> "); if (Util.IsYes()) { int sizeOfKey = config.mifare.primaryKey.Length; Array.Clear(config.mifare.primaryKey, 0, sizeOfKey); string tempStr = String.Format("Please enter the hexadecimal {0}-bytes primary key for mifare card. [KEY1-KEY2-...-KEY6]", sizeOfKey); Util.HighlightLineMulti(tempStr, "primary key", "mifare card"); Console.Write(">>>> "); enterSmartcardKey(config.mifare.primaryKey); if (useSecondaryKey) { sizeOfKey = config.mifare.secondaryKey.Length; Array.Clear(config.mifare.secondaryKey, 0, sizeOfKey); tempStr = String.Format("Please enter the hexadecimal {0}-bytes secondary key for mifare card. [KEY1-KEY2-...-KEY6]", sizeOfKey); Util.HighlightLineMulti(tempStr, "secondary key", "mifare card"); Console.Write(">>>> "); enterSmartcardKey(config.mifare.secondaryKey); } Util.HighlightLineMulti("Please enter the start block index of mifare card.", "start block index", "mifare card"); Console.Write(">>>> "); config.mifare.startBlockIndex = Util.GetInput((UInt16)0); Util.HighlightLineMulti("Please enter the card data size of mifare card.", "card data size", "mifare card"); Console.Write(">>>> "); config.mifare.dataSize = Util.GetInput((byte)0); Util.HighlightLineMulti("Please enter the skip bytes of mifare card.", "skip bytes", "mifare card"); Console.Write(">>>> "); config.mifare.skipBytes = Util.GetInput((byte)0); } Util.HighlightLine("Do you want to change desfire custom card settings? [Y/n]", "desfire custom card"); Console.Write(">>>> "); if (Util.IsYes()) { Util.HighlightLineMulti("Please enter a operationMode of desfire card. (0: Legacy, 1: Advanced(AppLevelKey))", "operationMode", "desfire card"); Console.Write(">>>> "); config.desfire.operationMode = Util.GetInput((byte)0); string tempStr; int sizeOfKey; if (config.desfire.operationMode == Convert.ToByte(BS2DesfireCardOperation.BS2_DESFIRECARD_OPERATION_MODE_LEGACY)) { sizeOfKey = config.desfire.primaryKey.Length; Array.Clear(config.desfire.primaryKey, 0, sizeOfKey); tempStr = String.Format("Please enter the hexadecimal {0}-bytes primary key for desfire card. [KEY1-KEY2-...-KEY6]", sizeOfKey); Util.HighlightLineMulti(tempStr, "primary key", "desfire card"); Console.Write(">>>> "); enterSmartcardKey(config.desfire.primaryKey); if (useSecondaryKey) { sizeOfKey = config.desfire.secondaryKey.Length; Array.Clear(config.desfire.secondaryKey, 0, sizeOfKey); tempStr = String.Format("Please enter the hexadecimal {0}-bytes secondary key for desfire card. [KEY1-KEY2-...-KEY6]", sizeOfKey); Util.HighlightLineMulti(tempStr, "secondary key", "desfire card"); Console.Write(">>>> "); enterSmartcardKey(config.desfire.secondaryKey); } } else // BS2DesfireCardOperation.BS2_DESFIRECARD_OPERATION_MODE_APPLEVELKEY { int sizeOfAppMasterKey = config.desfire.desfireAppKey.appMasterKey.Length; int sizeOfFileReadKey = config.desfire.desfireAppKey.fileReadKey.Length; int sizeOfFileWriteKey = config.desfire.desfireAppKey.fileWriteKey.Length; Array.Clear(config.desfire.desfireAppKey.appMasterKey, 0, sizeOfAppMasterKey); Array.Clear(config.desfire.desfireAppKey.fileReadKey, 0, sizeOfFileReadKey); Array.Clear(config.desfire.desfireAppKey.fileWriteKey, 0, sizeOfFileWriteKey); tempStr = String.Format("Please enter the hexadecimal {0}-bytes appMasterKey for desfire card. [KEY1-KEY2-...-KEY16]", sizeOfAppMasterKey); Util.HighlightLineMulti(tempStr, "appMasterKey", "desfire card"); Console.Write(">>>> "); enterSmartcardKey(config.desfire.desfireAppKey.appMasterKey); tempStr = String.Format("Please enter the hexadecimal {0}-bytes fileReadKey for desfire card. [KEY1-KEY2-...-KEY16]", sizeOfFileReadKey); Util.HighlightLineMulti(tempStr, "fileReadKey", "desfire card"); Console.Write(">>>> "); enterSmartcardKey(config.desfire.desfireAppKey.fileReadKey); Util.HighlightLineMulti("Please enter the fileReadKeyNumber of desfire card.", "fileReadKeyNumber", "desfire card"); Console.Write(">>>> "); config.desfire.desfireAppKey.fileReadKeyNumber = Util.GetInput((byte)0); } sizeOfKey = config.desfire.appID.Length; Array.Clear(config.desfire.appID, 0, sizeOfKey); tempStr = String.Format("Please enter the hexadecimal {0}-bytes appID for desfire card. [KEY1-KEY2-...-KEY6]", sizeOfKey); Util.HighlightLineMulti(tempStr, "appID", "desfire card"); Console.Write(">>>> "); enterSmartcardKey(config.desfire.appID); Util.HighlightLineMulti("Please enter the fileID of desfire card.", "fileID", "desfire card"); Console.Write(">>>> "); config.desfire.fileID = Util.GetInput((byte)0); Util.HighlightLineMulti("Please enter a encryptionType of desfire card. (0: DES/3DES, 1: AES)", "encryptionType", "desfire card"); Console.Write(">>>> "); config.desfire.encryptionType = Util.GetInput((byte)0); Util.HighlightLineMulti("Please enter the card data size of desfire card.", "card data size", "desfire card"); Console.Write(">>>> "); config.desfire.dataSize = Util.GetInput((byte)0); Util.HighlightLineMulti("Please enter the skip bytes of desfire card.", "skip bytes", "desfire card"); Console.Write(">>>> "); config.desfire.skipBytes = Util.GetInput((byte)0); } Util.HighlightLine("Please enter a smart card byte order. (0: MSB, 1: LSB)", "smart card byte order"); Console.Write(">>>> "); config.smartCardByteOrder = Util.GetInput((byte)0); Util.HighlightLine("Please enter a formatID.", "formatID"); Console.Write(">>>> "); config.formatID = Util.GetInput((UInt32)0); Console.WriteLine("Trying to set CustomCardConfig."); result = (BS2ErrorCode)API.BS2_SetCustomCardConfig(sdkContext, deviceID, ref config); if (result != BS2ErrorCode.BS_SDK_SUCCESS) Console.WriteLine("Got error({0}).", result); else Console.WriteLine("Card config set success"); Util.HighlightLineMulti("To use the custom smart card function, you must turn off the Suprema smart card function. Do you want to change the card operation mode? [Y/n]", "turn off the Suprema smart card function", "change the card operation mode?"); Console.Write(">>>> "); if (Util.IsYes()) { BS2SystemConfig sysConfig; result = (BS2ErrorCode)API.BS2_GetSystemConfig(sdkContext, deviceID, out sysConfig); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Got error({0}).", result); } UInt32 preMask = sysConfig.useCardOperationMask; // Turn off Suprema smart card sysConfig.useCardOperationMask &= ~(UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_MASK_CLASSIC_PLUS; sysConfig.useCardOperationMask &= ~(UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_MASK_DESFIRE_EV1; sysConfig.useCardOperationMask &= ~(UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_MASK_SR_SE; sysConfig.useCardOperationMask &= ~(UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_MASK_SEOS; // Turn on Custom smart card sysConfig.useCardOperationMask |= (UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_MASK_CUSTOM_CLASSIC_PLUS; sysConfig.useCardOperationMask |= (UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_MASK_CUSTOM_DESFIRE_EV1; // Apply sysConfig.useCardOperationMask |= (UInt32)BS2SystemConfigCardOperationMask.CARD_OPERATION_USE; result = (BS2ErrorCode)API.BS2_SetSystemConfig(sdkContext, deviceID, ref sysConfig); if (result != BS2ErrorCode.BS_SDK_SUCCESS) Console.WriteLine("Card operation mode update failed ({0}).", result); else Console.WriteLine("Card operation mode was changed 0x{0:x8} => 0x{1:x8}", preMask, sysConfig.useCardOperationMask); }