public void writeCard(IntPtr sdkContext, UInt32 deviceID, bool isMasterDevice) { BS2SimpleDeviceInfo deviceInfo; BS2SmartCardData smartCard = Util.AllocateStructure <BS2SmartCardData>(); BS2ErrorCode result = (BS2ErrorCode)API.BS2_GetDeviceInfo(sdkContext, deviceID, out deviceInfo); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Can't get device information(errorCode : {0}).", result); return; } Console.WriteLine("choose the format for the card: [2: SecureCredential(default), 3: AccessOn]"); Console.Write(">>>> "); smartCard.header.cardType = Util.GetInput((byte)BS2CardTypeEnum.SECURE); if (Convert.ToBoolean(deviceInfo.pinSupported)) { Console.WriteLine("Do you want to set pin code? [y/N]"); Console.Write(">>>> "); if (!Util.IsNo()) { Console.WriteLine("Enter the pin code which you want to set"); Console.Write(">>>> "); string pinCodeStr = Console.ReadLine(); IntPtr pinChar = Marshal.StringToHGlobalAnsi(pinCodeStr); IntPtr pinCode = Marshal.AllocHGlobal(BS2Environment.BS2_PIN_HASH_SIZE); //result = (BS2ErrorCode)API.BS2_MakePinCode(sdkContext, pinCodeStr, pinCode); result = (BS2ErrorCode)API.BS2_MakePinCode(sdkContext, pinChar, pinCode); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Got error({0}).", result); Marshal.FreeHGlobal(pinCode); return; } Marshal.Copy(pinCode, smartCard.credentials.pin, 0, BS2Environment.BS2_PIN_HASH_SIZE); Marshal.FreeHGlobal(pinChar); Marshal.FreeHGlobal(pinCode); } } if (Convert.ToBoolean(deviceInfo.fingerSupported)) { Console.WriteLine("How many fingerprint templates do you want to set? [0(default)-{0}]", BS2Environment.BS2_SMART_CARD_MAX_TEMPLATE_COUNT); Console.Write(">>>> "); smartCard.header.numOfTemplate = Util.GetInput((byte)0); } else { smartCard.header.numOfTemplate = 0; } Array.Clear(smartCard.credentials.templateData, 0, BS2Environment.BS2_SMART_CARD_MAX_TEMPLATE_COUNT * BS2Environment.BS2_FINGER_TEMPLATE_SIZE); if (smartCard.header.numOfTemplate > 0) { Console.WriteLine("Enter the size of template which you want to set. [{0}(default)-{1}]", BS2Environment.BS2_SMART_CARD_MIN_TEMPLATE_SIZE, BS2Environment.BS2_FINGER_TEMPLATE_SIZE); Console.Write(">>>> "); smartCard.header.templateSize = Util.GetInput((UInt16)BS2Environment.BS2_SMART_CARD_MIN_TEMPLATE_SIZE); BS2Fingerprint fingerprint = Util.AllocateStructure <BS2Fingerprint>(); fingerprint.index = 0; UInt32 outquality; for (byte idx = 0; idx < smartCard.header.numOfTemplate; ++idx) { Console.WriteLine("Place your finger on the device for fingerprint template[{0}] extraction", idx); result = (BS2ErrorCode)API.BS2_ScanFingerprintEx(sdkContext, deviceID, ref fingerprint, 0, (UInt32)BS2FingerprintQualityEnum.QUALITY_STANDARD, (byte)BS2FingerprintTemplateFormatEnum.FORMAT_SUPREMA, out outquality, null); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { if (result == BS2ErrorCode.BS_SDK_ERROR_EXTRACTION_LOW_QUALITY || result == BS2ErrorCode.BS_SDK_ERROR_CAPTURE_LOW_QUALITY) { Console.WriteLine("Bad fingerprint quality. Tty agin."); continue; } else { Console.WriteLine("Got error({0}).", result); return; } } // Fixes a problem when issuing AOC cards. //Array.Copy(fingerprint.data, 0, smartCard.credentials.templateData, idx*smartCard.header.templateSize, smartCard.header.templateSize); Array.Copy(fingerprint.data, 0, smartCard.credentials.templateData, idx * BS2Environment.BS2_FINGER_TEMPLATE_SIZE, BS2Environment.BS2_FINGER_TEMPLATE_SIZE); } Console.WriteLine("Is it duress finger? [0 : Normal(default), 1 : Duress]"); Console.Write(">>>> "); smartCard.header.duressMask = Util.GetInput((byte)BS2FingerprintFlagEnum.NORMAL); } else { smartCard.header.templateSize = (UInt16)BS2Environment.BS2_SMART_CARD_MIN_TEMPLATE_SIZE; smartCard.header.duressMask = (byte)BS2FingerprintFlagEnum.NORMAL; } Console.WriteLine("Enter the issue count which you want to set"); Console.Write(">>>> "); smartCard.header.issueCount = (UInt16)Util.GetInput(); Console.WriteLine("Enter the card id which you want to write on the card"); Console.Write(">>>> "); UInt64 cardID = 0; string cardIDStr = Console.ReadLine(); if (cardIDStr.Length > BS2Environment.BS2_CARD_DATA_SIZE) { Console.WriteLine("Card id should less than {0} words.", BS2Environment.BS2_CARD_DATA_SIZE); return; } else if (!UInt64.TryParse(cardIDStr, out cardID) || cardID == 0) { Console.WriteLine("Invalid card id"); return; } else { byte[] cardIDArray = BitConverter.GetBytes(cardID); if (!BitConverter.IsLittleEndian) { Array.Reverse(cardIDArray); } Array.Clear(smartCard.cardID, 0, BS2Environment.BS2_CARD_DATA_SIZE); for (int idx = 0; idx < cardIDArray.Length; ++idx) { smartCard.cardID[BS2Environment.BS2_CARD_DATA_SIZE - idx - 1] = cardIDArray[idx]; } } if ((BS2CardTypeEnum)smartCard.header.cardType == BS2CardTypeEnum.ACCESS) { Console.WriteLine("Enter the ID of the access group which you want to remove: [ID_1,ID_2 ...]"); Console.Write(">>>> "); char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string[] accessGroupIDs = Console.ReadLine().Split(delimiterChars); int idx = 0; Array.Clear(smartCard.accessOnData.accessGroupID, 0, BS2Environment.BS2_SMART_CARD_MAX_ACCESS_GROUP_COUNT); foreach (string accessGroupID in accessGroupIDs) { if (accessGroupID.Length > 0) { UInt16 item; if (UInt16.TryParse(accessGroupID, out item)) { smartCard.accessOnData.accessGroupID[idx++] = item; if (idx >= BS2Environment.BS2_SMART_CARD_MAX_ACCESS_GROUP_COUNT) { break; } } } } Console.WriteLine("Enter start time which you want to set. [default(Today), yyyy-MM-dd HH:mm:ss]"); Console.Write(">>>> "); if (!Util.GetTimestamp("yyyy-MM-dd HH:mm:ss", 0, out smartCard.accessOnData.startTime)) { return; } Console.WriteLine("Enter end time which you want to set. [default(Today), yyyy-MM-dd HH:mm:ss]"); Console.Write(">>>> "); if (!Util.GetTimestamp("yyyy-MM-dd HH:mm:ss", 0, out smartCard.accessOnData.endTime)) { return; } // card auth mode //Console.WriteLine("Enter card authentication mode which you want to set:"); //Console.WriteLine(" [2: Card only, 3: Card+Biometric, 4: Card+PIN, 5: Card+Biometric/PIN, 6: Card+Biometric+PIN]"); //Console.Write(">>>> "); //smartCard.header.cardAuthMode = Util.GetInput((byte)BS2CardAuthModeEnum.NONE); } result = computeCRC(smartCard, out smartCard.header.hdrCRC, out smartCard.header.cardCRC); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Can't compute CRC16({0})", result); } else { Console.WriteLine("Trying to write card."); result = (BS2ErrorCode)API.BS2_WriteCard(sdkContext, deviceID, ref smartCard); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Got error({0}).", result); } } }
extern public static int BS2_VerifyFingerprint(IntPtr context, UInt32 deviceId, ref BS2Fingerprint finger);
public void run() { const int MAX_TEMPLATE_SIZE = 384; UFS_STATUS ufs_res; UFScannerManager ScannerManager; int nScannerNumber; ScannerManager = new UFScannerManager(null); ufs_res = ScannerManager.Init(); nScannerNumber = ScannerManager.Scanners.Count; UFScanner Scanner = null; Scanner = ScannerManager.Scanners[0]; //Scanner.Timeout = 7000; //Scanner.TemplateSize = MAX_TEMPLATE_SIZE; //Scanner.DetectCore = false; //byte[] Template = new byte[MAX_TEMPLATE_SIZE]; byte[] Template0 = new byte[MAX_TEMPLATE_SIZE]; byte[] Template1 = new byte[MAX_TEMPLATE_SIZE]; int TemplateSize; int EnrollQuality; IntPtr versionPtr = API.BS2_Version(); Console.WriteLine("SDK version : {0}", Marshal.PtrToStringAnsi(versionPtr)); IntPtr sdkContext = IntPtr.Zero; sdkContext = API.BS2_AllocateContext(); if (sdkContext == IntPtr.Zero) { Console.WriteLine("BS2_AllocateContext Failed."); return; } BS2ErrorCode result = (BS2ErrorCode)API.BS2_Initialize(sdkContext); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("BS2_Initialize failed. Error : {0}", result); API.BS2_ReleaseContext(sdkContext); return; } // Connect to via Device IP address string ipAddress = "192.168.16.224"; ushort port = 51211; uint deviceId = 0; //ADD------ BS_SDK_ERROR_CANNOT_CONNECT_SOCKET error test IntPtr ptrIPAddr = Marshal.StringToHGlobalAnsi(ipAddress); //result = (BS2ErrorCode)API.BS2_ConnectDeviceViaIP(context, ipAddress, port, out deviceId); result = (BS2ErrorCode)API.BS2_ConnectDeviceViaIP(sdkContext, ptrIPAddr, port, out deviceId); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Connecting to device failed : {0}", result); return; } Marshal.FreeHGlobal(ptrIPAddr); Console.WriteLine("Connected"); BS2SimpleDeviceInfo deviceInfo; result = (BS2ErrorCode)API.BS2_GetDeviceInfo(sdkContext, deviceId, out deviceInfo); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("BS2_GetDeviceInfo failed. Error : {0}", result); return; } BS2FingerprintTemplateFormatEnum templateFormat = BS2FingerprintTemplateFormatEnum.FORMAT_SUPREMA; SortedSet <BS2CardAuthModeEnum> privateCardAuthMode = new SortedSet <BS2CardAuthModeEnum>(); SortedSet <BS2FingerAuthModeEnum> privateFingerAuthMode = new SortedSet <BS2FingerAuthModeEnum>(); SortedSet <BS2IDAuthModeEnum> privateIDAuthMode = new SortedSet <BS2IDAuthModeEnum>(); bool cardSupported = Convert.ToBoolean(deviceInfo.cardSupported); bool fingerSupported = Convert.ToBoolean(deviceInfo.fingerSupported); bool pinSupported = Convert.ToBoolean(deviceInfo.pinSupported); privateIDAuthMode.Add(BS2IDAuthModeEnum.PROHIBITED); if (cardSupported) { privateCardAuthMode.Add(BS2CardAuthModeEnum.PROHIBITED); privateCardAuthMode.Add(BS2CardAuthModeEnum.CARD_ONLY); if (pinSupported) { privateCardAuthMode.Add(BS2CardAuthModeEnum.CARD_PIN); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_PIN); if (fingerSupported) { privateCardAuthMode.Add(BS2CardAuthModeEnum.CARD_BIOMETRIC_OR_PIN); privateCardAuthMode.Add(BS2CardAuthModeEnum.CARD_BIOMETRIC_PIN); privateFingerAuthMode.Add(BS2FingerAuthModeEnum.BIOMETRIC_PIN); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_BIOMETRIC_OR_PIN); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_BIOMETRIC_PIN); } } if (fingerSupported) { privateCardAuthMode.Add(BS2CardAuthModeEnum.CARD_BIOMETRIC); privateFingerAuthMode.Add(BS2FingerAuthModeEnum.BIOMETRIC_ONLY); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_BIOMETRIC); } } else if (fingerSupported) { if (pinSupported) { privateFingerAuthMode.Add(BS2FingerAuthModeEnum.BIOMETRIC_PIN); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_BIOMETRIC_OR_PIN); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_BIOMETRIC_PIN); } privateFingerAuthMode.Add(BS2FingerAuthModeEnum.BIOMETRIC_ONLY); privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_BIOMETRIC); } else if (pinSupported) { privateIDAuthMode.Add(BS2IDAuthModeEnum.ID_PIN); } BS2UserBlob[] userBlob = Util.AllocateStructureArray <BS2UserBlob>(1); userBlob[0].user.version = 0; userBlob[0].user.formatVersion = 0; userBlob[0].user.faceChecksum = 0; userBlob[0].user.fingerChecksum = 0; userBlob[0].user.numCards = 0; userBlob[0].user.numFingers = 0; userBlob[0].user.numFaces = 0; userBlob[0].cardObjs = IntPtr.Zero; userBlob[0].fingerObjs = IntPtr.Zero; userBlob[0].faceObjs = IntPtr.Zero; Console.WriteLine("Enter the ID for the User which you want to enroll"); Console.Write(">>>> "); string userID = Console.ReadLine(); if (userID.Length == 0) { Console.WriteLine("The user id can not be empty."); return; } else if (userID.Length > BS2Environment.BS2_USER_ID_SIZE) { Console.WriteLine("The user id should less than {0} words.", BS2Environment.BS2_USER_ID_SIZE); return; } else { //TODO Alphabet user id is not implemented yet. UInt32 uid; if (!UInt32.TryParse(userID, out uid)) { Console.WriteLine("The user id should be a numeric."); return; } byte[] userIDArray = Encoding.UTF8.GetBytes(userID); Array.Clear(userBlob[0].user.userID, 0, BS2Environment.BS2_USER_ID_SIZE); Array.Copy(userIDArray, userBlob[0].user.userID, userIDArray.Length); } Console.WriteLine("When is this user valid from? [default(Today), yyyy-MM-dd HH:mm:ss]"); Console.Write(">>>> "); //if (!Util.GetTimestamp("yyyy-MM-dd HH:mm:ss", 0, out userBlob[0].setting.startTime)) //{ // return; //} userBlob[0].setting.startTime = 1262307661; //2010-01-01 01:01:01 Console.WriteLine("When is this user valid to? [default(Today), yyyy-MM-dd HH:mm:ss]"); Console.Write(">>>> "); //if (!Util.GetTimestamp("yyyy-MM-dd HH:mm:ss", 0, out userBlob[0].setting.endTime)) //{ // return; //} userBlob[0].setting.endTime = 1893459661; //2030-01-01 01:01:01 if (fingerSupported) { Console.WriteLine("Enter the security level for this user: [{0}: {1}, {2}: {3}, {4}: {5}(default), {6}: {7}, {8}: {9}]", (byte)BS2UserSecurityLevelEnum.LOWER, BS2UserSecurityLevelEnum.LOWER, (byte)BS2UserSecurityLevelEnum.LOW, BS2UserSecurityLevelEnum.LOW, (byte)BS2UserSecurityLevelEnum.NORMAL, BS2UserSecurityLevelEnum.NORMAL, (byte)BS2UserSecurityLevelEnum.HIGH, BS2UserSecurityLevelEnum.HIGH, (byte)BS2UserSecurityLevelEnum.HIGHER, BS2UserSecurityLevelEnum.HIGHER); Console.Write(">>>> "); userBlob[0].setting.securityLevel = Util.GetInput((byte)BS2UserSecurityLevelEnum.NORMAL); userBlob[0].setting.fingerAuthMode = (byte)BS2FingerAuthModeEnum.NONE; Array.Clear(userBlob[0].name, 0, BS2Environment.BS2_USER_NAME_LEN); userBlob[0].photo.size = 0; Array.Clear(userBlob[0].photo.data, 0, BS2Environment.BS2_USER_PHOTO_SIZE); Array.Clear(userBlob[0].pin, 0, BS2Environment.BS2_PIN_HASH_SIZE); if (fingerSupported) { Console.WriteLine("How many fingerprints do you want to register? [1(default) - {0}]", BS2Environment.BS2_MAX_NUM_OF_FINGER_PER_USER); Console.Write(">>>> "); userBlob[0].user.numFingers = Util.GetInput((byte)1); if (userBlob[0].user.numFingers > 0) { BS2FingerprintConfig fingerprintConfig; Console.WriteLine("Trying to get fingerprint config"); result = (BS2ErrorCode)API.BS2_GetFingerprintConfig(sdkContext, deviceId, out fingerprintConfig); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Got error({0}).", result); return; } else { templateFormat = (BS2FingerprintTemplateFormatEnum)fingerprintConfig.templateFormat; } int structSize = Marshal.SizeOf(typeof(BS2Fingerprint)); BS2Fingerprint fingerprint = Util.AllocateStructure <BS2Fingerprint>(); userBlob[0].fingerObjs = Marshal.AllocHGlobal(structSize * userBlob[0].user.numFingers); IntPtr curFingerObjs = userBlob[0].fingerObjs; /* * Console.WriteLine("Place your finger"); * ufs_res = Scanner.ClearCaptureImageBuffer(); * ufs_res = Scanner.CaptureSingleImage(); * ufs_res = Scanner.ExtractEx(MAX_TEMPLATE_SIZE, Template, out TemplateSize, out EnrollQuality); * byte[] template0 = Template; * * Console.WriteLine("Place your finger once more"); * ufs_res = Scanner.ClearCaptureImageBuffer(); * ufs_res = Scanner.CaptureSingleImage(); * ufs_res = Scanner.ExtractEx(MAX_TEMPLATE_SIZE, Template, out TemplateSize, out EnrollQuality); * byte[] template1 = Template; * * System.Buffer.BlockCopy(template0, 0, fingerprint.data, 0, template0.Length); * System.Buffer.BlockCopy(template1, 0, fingerprint.data, template0.Length, template1.Length); */ Console.WriteLine("Place your finger"); ufs_res = Scanner.ClearCaptureImageBuffer(); ufs_res = Scanner.CaptureSingleImage(); if (ufs_res == UFS_STATUS.OK) { Console.WriteLine("1st capturing succeeded"); } else { Console.WriteLine("1st capturing failed"); return; } ufs_res = Scanner.ExtractEx(MAX_TEMPLATE_SIZE, Template0, out TemplateSize, out EnrollQuality); if (ufs_res == UFS_STATUS.OK) { Console.WriteLine("1st extraction succeeded"); } else { Console.WriteLine("1st extraction failed"); return; } Console.WriteLine("Place your finger once more"); ufs_res = Scanner.ClearCaptureImageBuffer(); ufs_res = Scanner.CaptureSingleImage(); if (ufs_res == UFS_STATUS.OK) { Console.WriteLine("2nd capturing succeeded"); } else { Console.WriteLine("2nd capturing failed"); return; } ufs_res = Scanner.ExtractEx(MAX_TEMPLATE_SIZE, Template1, out TemplateSize, out EnrollQuality); if (ufs_res == UFS_STATUS.OK) { Console.WriteLine("2nd extraction succeeded"); } else { Console.WriteLine("2nd extraction failed"); return; } System.Buffer.BlockCopy(Template0, 0, fingerprint.data, 0, Template0.Length); System.Buffer.BlockCopy(Template1, 0, fingerprint.data, Template0.Length, Template1.Length); fingerprint.flag = 0; //Not Duress Finger fingerprint.index = 0; //1st Finger Array.Clear(userBlob[0].accessGroupId, 0, BS2Environment.BS2_MAX_ACCESS_GROUP_PER_USER); Console.WriteLine("Which access groups does this user belongs to? [ex. ID_1 ID_2 ...]"); Console.Write(">>>> "); int accessGroupIdIndex = 0; char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string[] accessGroupIDs = Console.ReadLine().Split(delimiterChars); foreach (string accessGroupID in accessGroupIDs) { if (accessGroupID.Length > 0) { UInt32 item; if (UInt32.TryParse(accessGroupID, out item)) { userBlob[0].accessGroupId[accessGroupIdIndex++] = item; } } } Marshal.StructureToPtr(fingerprint, curFingerObjs, false); curFingerObjs += structSize; result = (BS2ErrorCode)API.BS2_EnrolUser(sdkContext, deviceId, userBlob, 1, 1); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Failed : {0}", result); return; } } } } }
extern public static int BS2_ScanFingerprint(IntPtr context, UInt32 deviceId, ref BS2Fingerprint finger, UInt32 templateIndex, UInt32 quality, byte templateFormat, OnReadyToScan cbReadyToScan);