UniKey API Reference for C Language: Difference between revisions
No edit summary |
Added lock and unlock functions |
||
| (147 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
[[category:UniKey | [[category:UniKey API]] | ||
== UniKey API Reference | == UniKey API Reference == | ||
A WORD is defined to be a 16-bit unsigned integer, while a DWORD is a 32-bit unsigned integer. These should be defined as types of that size regardless of platform. | |||
=== Find a UniKey dongle === | === Find a UniKey dongle === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Find(WORD* pHandle, DWORD* pSetting1, DWORD* pSetting2);</code> | <code>long UniKey_Find(WORD* pHandle, DWORD* pSetting1, DWORD* pSetting2);</code> | ||
'''Description''' | '''Description''' | ||
Check if a specific UniKey is attached to the USB port. This is the first API to start a UniKey session. | |||
Check if a specific UniKey is attached to the USB port. This is the first API used to start a UniKey session. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 22: | Line 27: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSetting1</td> | <td rowspan="2">*pSetting1</td> | ||
<td> | <td>[in] Working mode (UniKey PRO only), useless for UniKey STD</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Hardware ID</td> | <td>[out] Hardware ID</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSetting2</td> | <td rowspan="2">*pSetting2</td> | ||
<td> | <td>[in] Access mode (UniKey PRO only), useless for UniKey STD</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Number of dongles attached, useless for UniKey STD</td> | |||
<td>[out] Number of | |||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 52: | Line 56: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_NOT_FOUND</td> | ||
<td>200</td> | <td>200</td> | ||
<td>No UniKey dongle</td> | <td>No UniKey dongle</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
For UniKey PRO (Network UniKey), *pSetting specifies the working mode. If you do not specify the value in *lp1, the working mode will be read from the NetUniKey.ini. | |||
---- | |||
<br> | <br> | ||
=== Find the Next UniKey dongle | === Find the Next UniKey dongle === | ||
'''API Prototype''' | |||
<code>long UniKey_Find_Next(WORD* pHandle, DWORD* pSetting1, DWORD* pSetting2);</code> | <code>long UniKey_Find_Next(WORD* pHandle, DWORD* pSetting1, DWORD* pSetting2);</code> | ||
'''Description''' | '''Description''' | ||
Check if another UniKey is attached to the USB port. | Check if another UniKey is attached to the USB port. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 79: | Line 91: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSetting1</td> | <td rowspan="2">*pSetting1</td> | ||
<td> | <td>[in] Working Mode (UniKey PRO only), useless for UniKey STD</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Hardware ID</td> | <td>[out] Hardware ID</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSetting2</td> | <td rowspan="2">*pSetting2</td> | ||
<td> | <td>[in] Access Mode (UniKey PRO only), useless for UniKey STD</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Number of dongles attached , useless for UniKey STD</td> | |||
<td>[out] Number of | |||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Meaning</th> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>SUCCESS</td> | <td>SUCCESS</td> | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NOMORE</td> | <td>ERROR_UNIKEY_NOMORE</td> | ||
<td>214</td> | <td>214</td> | ||
<td>No more dongles found</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_FIND</td> | <td>ERROR_UNIKEY_NEED_FIND</td> | ||
<td>215</td> | <td>215</td> | ||
<td>Find needs to be called before Find_Next</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 118: | Line 133: | ||
<br> | <br> | ||
=== | === Log on to UniKey Dongle === | ||
'''API Prototype''' | |||
<code>long UniKey_User_Logon(WORD* pHandle, WORD* pPassword1, WORD* pPassword2);</code> | <code>long UniKey_User_Logon(WORD* pHandle, WORD* pPassword1, WORD* pPassword2);</code> | ||
For UniKey Drive, the API Prototype is | For UniKey Drive, the API Prototype is | ||
<code>UniKey_User_Logon (WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2);</code> | |||
<code>UniKey_User_Logon(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2);</code> | |||
'''Description''' | |||
Log in to a UniKey dongle with specified passwords. This API should be called in the commercial software in order to improve security. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
</tr> | |||
<tr> | |||
<td>*pHandle</td> | |||
<td>[out] Dongle handle</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword1</td> | <td>*pPassword1</td> | ||
<td>[in]Password 1</td> | <td>[in] Password 1</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword2</td> | <td>*pPassword2</td> | ||
<td>[in]Password 2 | <td>[in] Password 2</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 169: | Line 189: | ||
<td>ERROR_UNIKEY_INVALID_PASSWORD</td> | <td>ERROR_UNIKEY_INVALID_PASSWORD</td> | ||
<td>201</td> | <td>201</td> | ||
<td>UniKey dongle | <td>Found UniKey dongle, but basic passwords (password 1 and 2) are incorrect</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 180: | Line 200: | ||
<br> | <br> | ||
=== | === Log on to UniKey Dongle in vendor mode === | ||
'''API Prototype''' | |||
<code>long UniKey_Vender_Logon(WORD* pHandle, WORD* pPassword1, WORD* pPassword2, WORD* pPassword3, WORD* pPassword4);</code> | <code>long UniKey_Vender_Logon(WORD* pHandle, WORD* pPassword1, WORD* pPassword2, WORD* pPassword3, WORD* pPassword4);</code> | ||
For UniKey Drive, the API Prototype is | |||
For UniKey Drive, the API Prototype is | |||
<code>UniKey_Vender_Logon(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2, DWORD* pPassword3, DWORD* pPassword4);</code> | <code>UniKey_Vender_Logon(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2, DWORD* pPassword3, DWORD* pPassword4);</code> | ||
'''Description''' | '''Description''' | ||
Log in to a UniKey dongle in vendor mode with specified passwords. This API helps software vendors to log in to the UniKey dongle in vendor mode, and get full permissions to the UniKey dongle. | |||
---- | |||
We do NOT advise you to enclose this API in the final released software. This API is only for software vendor’s usage. | We do NOT advise you to enclose this API in the final released software. This API is only for software vendor’s usage. | ||
---- | |||
---- | |||
If password 3 or 4 is wrong, while password 1 and 2 is correct, the dongle is then logged on in user mode automatically. | |||
---- | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
</tr> | |||
<tr> | |||
<td>*pHandle</td> | |||
<td>[out] Dongle handle</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword1</td> | <td>*pPassword1</td> | ||
<td>[in]Password 1</td> | <td>[in] Password 1</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword2</td> | <td>*pPassword2</td> | ||
<td>[in]Password 2</td> | <td>[in] Password 2</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword3</td> | <td>*pPassword3</td> | ||
<td>[in]Password 3</td> | <td>[in] Password 3</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword4</td> | <td>*pPassword4</td> | ||
<td>[in]Password 4 | <td>[in] Password 4</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 249: | Line 275: | ||
<td>ERROR_UNIKEY_INVALID_PASSWORD</td> | <td>ERROR_UNIKEY_INVALID_PASSWORD</td> | ||
<td>201</td> | <td>201</td> | ||
<td>Found UniKey dongle, but | <td>Found UniKey dongle, but basic passwords (password 1 and 2) are incorrect</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 260: | Line 286: | ||
<br> | <br> | ||
=== | === Log off the UniKey dongle === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Logoff(WORD* pHandle);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
Log off a UniKey dongle with a specific handle; this API should be called at the end of a UniKey session. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 280: | Line 309: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 300: | Line 330: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 306: | Line 336: | ||
<br> | <br> | ||
=== Get the UniKey | === Get the UniKey Dongle's Type === | ||
'''API Prototype''' | |||
<code>long UniKey_Get_Type(WORD* pHandle, DWORD* type);</code> | <code>long UniKey_Get_Type(WORD* pHandle, DWORD* type);</code> | ||
'''Description'''< | '''Description''' | ||
UniKey_Get_Type can help you get the type of the UniKey dongle.<br> | |||
<code>UniKey_Get_Type</code> can help you get the type of the UniKey dongle.<br> | |||
< | This functions return value will help to indicate the type of the UniKey dongle. | ||
<table class="wikitable"> | |||
<tr> | |||
<th>Type</th> | |||
<th>Code</th> | |||
</tr> | |||
<tr> | <tr> | ||
<td>UNIKEY_TYPE_TIME</td> | <td>UNIKEY_TYPE_TIME</td> | ||
| Line 329: | Line 366: | ||
</table> | </table> | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 345: | Line 383: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 358: | Line 397: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_GET_TYPE</td> | ||
<td> | <td>256</td> | ||
<td>UniKey Get Type Error</td> | <td>UniKey Get Type Error</td> | ||
</tr> | </tr> | ||
| Line 368: | Line 407: | ||
=== Read UniKey dongle memory === | === Read UniKey dongle memory === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Read_Memory(WORD* pHandle, WORD* pStartAddress, WORD* pBufferLength, BYTE* pBuffer);</code> | <code>long UniKey_Read_Memory(WORD* pHandle, WORD* pStartAddress, WORD* pBufferLength, BYTE* pBuffer);</code> | ||
'''Description''' | '''Description''' | ||
Read the contents of | |||
Read the contents of memory; this API needs to be called after logging in to a UniKey dongle. | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 381: | Line 423: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>*pHandle</td> | ||
<td>[in] Dongle handle</td> | <td>[in] Dongle handle</td> | ||
</tr> | </tr> | ||
| Line 389: | Line 431: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pBufferLength</td> | ||
<td>[in] Number of bytes to read</td> | <td>[in] Number of bytes to read</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>*pBuffer</td> | ||
<td>[out] Pointer to the buffer containing the data to be read</td> | <td>[out] Pointer to the buffer containing the data to be read</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 413: | Line 456: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 423: | Line 466: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 436: | Line 474: | ||
=== Write to UniKey dongle memory === | === Write to UniKey dongle memory === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Write_Memory(WORD* pHandle, WORD* pStartAddress, WORD* pBufferLength, BYTE* pBuffer);</code> | <code>long UniKey_Write_Memory(WORD* pHandle, WORD* pStartAddress, WORD* pBufferLength, BYTE* pBuffer);</code> | ||
'''Description''' | '''Description''' | ||
Write data into | |||
Write data into memory; this API needs to be called after logging on to a UniKey dongle. | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 449: | Line 490: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>*pHandle</td> | ||
<td>[in] Dongle handle</td> | <td>[in] Dongle handle</td> | ||
</tr> | </tr> | ||
| Line 461: | Line 502: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>*pBuffer</td> | ||
<td>[in] Pointer to the buffer containing the data to be written</td> | <td>[in] Pointer to the buffer containing the data to be written</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 481: | Line 523: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 491: | Line 533: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_VERIFY_ADV_PASSWORD</td> | <td>ERROR_UNIKEY_VERIFY_ADV_PASSWORD</td> | ||
<td>223</td> | <td>223</td> | ||
<td>Advanced passwords ( | <td>Advanced passwords (password 3 and 4) not verified</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
UniKey_Read_Memory and UniKey_Write_Memory provide basic reading and writing functions to the dongle. You can store general information via such functions. And various levels of security can be applied too. | To write the last 2k memory (for 2048 – 4096), you need to verify all 4 passwords (vendor mode) to obtain the requisite permission. | ||
---- | |||
---- | |||
<code>UniKey_Read_Memory</code> and <code>UniKey_Write_Memory</code> provide basic reading and writing functions to the dongle. You can store general information via such functions. And various levels of security can be applied too. | |||
---- | |||
<br> | <br> | ||
| Line 512: | Line 556: | ||
=== Generate a Random Number === | === Generate a Random Number === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Random(WORD* pHandle, WORD* pReturn1, WORD* pReturn2, WORD* pReturn3, WORD* pReturn4);</code> | <code>long UniKey_Random(WORD* pHandle, WORD* pReturn1, WORD* pReturn2, WORD* pReturn3, WORD* pReturn4);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Generates random numbers from the dongle. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 546: | Line 593: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 557: | Line 605: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_RANDOM</td> | |||
<td>209</td> | |||
<td>Random number error</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
<code>UniKey_Random</code> is used to generate a random number inside the dongle. The UniKey dongle computation engine generates the number and the hardware of the dongle is the seed for the random number. | |||
---- | |||
<br> | <br> | ||
=== Generate Seed Code Return Values | === Generate Seed Code Return Values === | ||
'''API Prototype''' | |||
<code>long UniKey_Seed(WORD* pHandle, DWORD* pSeed, WORD* pReturn1, WORD* pReturn2, WORD* pReturn3, WORD* pReturn4);</code> | <code>long UniKey_Seed(WORD* pHandle, DWORD* pSeed, WORD* pReturn1, WORD* pReturn2, WORD* pReturn3, WORD* pReturn4);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Get return codes from the input of a seed code; this API return for values which are related to pSeed and the UniKey dongle’s password. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 596: | Line 648: | ||
<tr> | <tr> | ||
<td>*pSeed</td> | <td>*pSeed</td> | ||
<td>[in] Seed | <td>[in] Seed code</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pReturn1</td> | <td>*pReturn1</td> | ||
<td>[out] Return | <td>[out] Return code 1</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pReturn2</td> | <td>*pReturn2</td> | ||
<td>[out] Return | <td>[out] Return code 2</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pReturn3</td> | <td>*pReturn3</td> | ||
<td>[out] Return | <td>[out] Return code 3</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pReturn4</td> | <td>*pReturn4</td> | ||
<td>[out] Return | <td>[out] Return code 4</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 627: | Line 680: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_SEED</td> | |||
<td>210</td> | |||
<td>Seed code error</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
UniKey_Seed generate a set of seed codes | ---- | ||
<code>UniKey_Seed</code> generate a set of seed codes; all of these seed codes are based on the password. providing another method to verify passwords and check if a dongle has been inserted. Apart from this, the seed codes can be used in other computations, for example, you can use the seed returned as a 64-bit encryption key. | |||
---- | |||
<br> | <br> | ||
=== Write | === Write Software ID === | ||
'''API Prototype''' | |||
<code>long UniKey_Write_SoftID(WORD* pHandle, DWORD* pSoftID);</code> | <code>long UniKey_Write_SoftID(WORD* pHandle, DWORD* pSoftID);</code> | ||
'''Description''' | '''Description''' | ||
Write the vendor defined | |||
Write the vendor-defined software ID. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 666: | Line 723: | ||
<tr> | <tr> | ||
<td>*pSoftID</td> | <td>*pSoftID</td> | ||
<td>[in] | <td>[in] Software ID</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 681: | Line 739: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_SET_SOFTID</td> | |||
<td>203</td> | |||
<td>Set software ID error</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
You need to verify all 4 passwords (vendor mode) to write the | ---- | ||
You need to verify all 4 passwords (vendor mode) to write the software ID to the dongle. | |||
---- | |||
<br> | <br> | ||
=== Read | === Read Software ID === | ||
'''API Prototype''' | |||
<code>long UniKey_Read_SoftID(WORD* pHandle, DWORD* pSoftID);</code> | <code>long UniKey_Read_SoftID(WORD* pHandle, DWORD* pSoftID);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Read the user-defined software ID. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 720: | Line 782: | ||
<tr> | <tr> | ||
<td>*pSoftID</td> | <td>*pSoftID</td> | ||
<td>[out] | <td>[out] Software ID</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 739: | Line 802: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
UniKey_Write_SoftID and UniKey_Read_SoftID provide a means to make a soft (write-able) ID for each software. You can write different software ID for each software and call UNIKEY_READ_SOFTID to check if the software ID is correct. | ---- | ||
<code>UniKey_Write_SoftID</code> and <code>UniKey_Read_SoftID</code> provide a means to make a soft (write-able) ID for each software. You can write different software ID for each software and call <code>UNIKEY_READ_SOFTID</code> to check if the software ID is correct. | |||
---- | |||
<br> | <br> | ||
| Line 751: | Line 815: | ||
=== Set a UniKey License module === | === Set a UniKey License module === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Set_Module(WORD* pHandle, WORD* pModule, WORD* pValue, WORD* pDecrease);</code> | <code>long UniKey_Set_Module(WORD* pHandle, WORD* pModule, WORD* pValue, WORD* pDecrease);</code> | ||
'''Description''' | '''Description''' | ||
To write a value to a specific UniKey license module and set the Decrement attribute. | To write a value to a specific UniKey license module and set the Decrement attribute. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 769: | Line 836: | ||
<tr> | <tr> | ||
<td>*pModule</td> | <td>*pModule</td> | ||
<td>[in] License module | <td>[in] License module number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pValue</td> | <td>*pValue</td> | ||
<td>[in] License module | <td>[in] License module unit value</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pDecrease</td> | <td>*pDecrease</td> | ||
<td>[in] | <td>[in] Decrement attribute (1 = allowed, 0 = not allowed)</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 796: | Line 864: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>202</td> | <td>202</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 810: | Line 878: | ||
</table> | </table> | ||
---- | |||
You need verify 4 passwords (vendor mode) to set a module value successfully. | A successful operation will result in license module unit number *pModule storing value *pValue, and the Decrement attribute set to "0" or "1". | ||
---- | |||
---- | |||
You need to verify all 4 passwords (vendor mode) to set a module value successfully. | |||
---- | |||
<br> | <br> | ||
| Line 822: | Line 892: | ||
=== Get a UniKey License module === | === Get a UniKey License module === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Get_Module(WORD* pHandle, WORD* pModule, WORD* pValue);</code> | <code>long UniKey_Get_Module(WORD* pHandle, WORD* pModule, WORD* pValue);</code> | ||
'''Description''' | '''Description''' | ||
Get a value from a specific UniKey license module. | Get a value from a specific UniKey license module. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 848: | Line 921: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 863: | Line 937: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>202</td> | <td>202</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 877: | Line 951: | ||
</table> | </table> | ||
You need verify 2 passwords (user mode) to get a module value successfully. | ---- | ||
You need to verify 2 passwords (user mode) to get a module value successfully. | |||
---- | |||
<br> | <br> | ||
| Line 885: | Line 960: | ||
=== Check a UniKey License module === | === Check a UniKey License module === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Check_Module(WORD* pHandle, WORD* pModule, WORD* pValue, WORD* pDecrease);</code> | <code>long UniKey_Check_Module(WORD* pHandle, WORD* pModule, WORD* pValue, WORD* pDecrease);</code> | ||
'''Description''' | '''Description''' | ||
Read the attributes of a specific UniKey license module. | Read the attributes of a specific UniKey license module. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 903: | Line 981: | ||
<tr> | <tr> | ||
<td>*pModule</td> | <td>*pModule</td> | ||
<td>[in] License module | <td>[in] License module number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 915: | Line 993: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 930: | Line 1,009: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>202</td> | <td>202</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 944: | Line 1,023: | ||
</table> | </table> | ||
---- | |||
A successful operation will result in *pValue having value from Validity (1 = license module value is not zero), and *pDecrease having value from the Decrement attribute (1 = license module can be decreased). The value of a license module cannot be read directly, and it is invisible to end users. | |||
---- | |||
<br> | |||
---- | |||
<code>UniKey_Set_Module</code> and <code>UniKey_Check_Module</code> provide an easy way to implement software limitations. For example, if you want to set software to only be executed 3 times, you can call <code>UniKey_Set_Module</code> to set a license module (let us say license module 0) as 3. And, during each execution, we decrease the license module, if the license module is invalid (zero), we stop the software. Apart from this, we can implement a module-selling model with the help of license module functions. For example, the software has four function modules, A, B, C and D. And we can map the function modules to the license modules in the UniKey dongle. Let us say that function module A is mapped to license module 0, B to 1, C to 2 and D to 3. If a customer only buys function A and B, you only need to enable license module 0 and 1, and leave 2 and 3 as zero. So now only function module A and B can be executed. If the customer buys additional functions, you can use the UniKey Remote Updater tool to update the dongle as needed remotely. | |||
---- | |||
<br> | |||
=== Write Arithmetic === | === Write Arithmetic === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Write_Arithmetic(WORD* pHandle, WORD* pStartAddress, BYTE* pBuffer);</code> | <code>long UniKey_Write_Arithmetic(WORD* pHandle, WORD* pStartAddress, BYTE* pBuffer);</code> | ||
'''Description''' | '''Description''' | ||
Write user-defined mathematical algorithms. | Write user-defined mathematical algorithms. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 974: | Line 1,058: | ||
<tr> | <tr> | ||
<td>*pStartAddress</td> | <td>*pStartAddress</td> | ||
<td>[in] Offset of first instruction </td> | <td>[in] Offset of first instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 982: | Line 1,066: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 996: | Line 1,081: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | <td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | ||
<td>217</td> | <td>217</td> | ||
<td>Arithmetic instruction | <td>Arithmetic instruction error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | <td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | ||
<td>218</td> | <td>218</td> | ||
<td>Arithmetic operator | <td>Arithmetic operator error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_AR_WRONG_BEGIN</td> | ||
<td>219</td> | <td>219</td> | ||
<td> | <td>Constant numbers can't be used on first arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_WRONG_END</td> | <td>ERROR_UNIKEY_AR_WRONG_END</td> | ||
<td>220</td> | <td>220</td> | ||
<td> | <td>Constant numbers can't be used on last arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | <td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | ||
<td>221</td> | <td>221</td> | ||
<td> | <td>Constant numbers > 63 will cause an overflow</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
UniKey_Write_Arithmetic is called when you write a series of algorithms into the dongle. This function is only called | A successful operation will result in a user-defined algorithm containing the algorithm command string from the buffer. | ||
< | ---- | ||
---- | |||
<code>UniKey_Write_Arithmetic</code> is called when you write a series of algorithms into the dongle. This function is only called on the software vendor side. For example, if you have a serial number generator algorithm, and you want to perform this algorithm inside the dongle, you need to call <code>UniKey_Write_Arithmetic</code> | |||
---- | |||
<br> | <br> | ||
=== User- | === User-Defined Algorithm Calculate 1 === | ||
'''API Prototype''' | |||
<code>long UniKey_Calculate1(WORD* pHandle, DWORD* pStartAddress, DWORD* pModule, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);</code> | <code>long UniKey_Calculate1(WORD* pHandle, DWORD* pStartAddress, DWORD* pModule, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Return the results of a calculation performed in the UniKey, using input provided by the developer and the CALCULATE1 function. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,067: | Line 1,157: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegA</td> | ||
<td>[in, out] Register A</td> | <td>[in, out] Register A</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegB</td> | ||
<td>[in, out] Register B</td> | <td>[in, out] Register B</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegC</td> | ||
<td>[in, out] Register C</td> | <td>[in, out] Register C</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegD</td> | ||
<td>[in, out] Register D</td> | <td>[in, out] Register D</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,099: | Line 1,190: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | <td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | ||
<td>217</td> | <td>217</td> | ||
<td>Arithmetic instruction | <td>Arithmetic instruction error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | <td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | ||
<td>218</td> | <td>218</td> | ||
<td>Arithmetic operator | <td>Arithmetic operator error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_AR_WRONG_BEGIN</td> | ||
<td>219</td> | <td>219</td> | ||
<td> | <td>Constant numbers can't be used on first arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_WRONG_END</td> | <td>ERROR_UNIKEY_AR_WRONG_END</td> | ||
<td>220</td> | <td>220</td> | ||
<td> | <td>Constant numbers can't be used on last arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | <td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | ||
<td>221</td> | <td>221</td> | ||
<td> | <td>Constant numbers > 63 will cause an overflow</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<table | ---- | ||
When the calculation starts, the values of other internal registers are listed in the table below.<br>E and F is the bytewise reversed hardware ID. For example, if the hardware is 0x12345678 (in hex), then E will be 0x7856 and F will be 0x3412. | |||
---- | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Internal Register</th> | <th>Internal Register</th> | ||
| Line 1,144: | Line 1,237: | ||
<tr> | <tr> | ||
<td>E</td> | <td>E</td> | ||
<td> | <td>High-order byte of reversed hardware ID</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>F</td> | <td>F</td> | ||
<td> | <td>Low-order byte of reversed hardware ID</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,156: | Line 1,249: | ||
<tr> | <tr> | ||
<td>H</td> | <td>H</td> | ||
<td>Random number </td> | <td>Random number</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
Examples<br>If the internal algorithm is A = B + C, | ---- | ||
Examples: | |||
<br>If the internal algorithm is A = B + C, then the call result is *pRegA = *pRegB + *pRegC | |||
<br>The internal algorithm is A = A + G; if *pRegA = 0, then you may guess the result is the license module such that *pRegA = G = *pModule | |||
<br>Though you cannot read the content of modules directly, you can determine the content by an algorithm. If possible, it would be best to also check this content with an algorithm, and not only compare it in the program. | |||
---- | |||
<br> | <br> | ||
=== User- | === User-Defined Algorithm Calculate 2 === | ||
'''API Prototype''' | |||
<code>long UniKey_Calculate2(WORD* pHandle, DWORD* pStartAddress, DWORD* pSeed, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);</code> | <code>long UniKey_Calculate2(WORD* pHandle, DWORD* pStartAddress, DWORD* pSeed, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);</code> | ||
'''Description''' | '''Description''' | ||
Return the results of a calculation performed in UniKey, using input provided by the developer and the CALCULATE2 function. | |||
Return the results of a calculation performed in the UniKey, using input provided by the developer and the CALCULATE2 function. | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,190: | Line 1,290: | ||
<tr> | <tr> | ||
<td>*pSeed</td> | <td>*pSeed</td> | ||
<td>[in] Seed | <td>[in] Seed code (32-bit)</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegA</td> | ||
<td>[in, out] Register A</td> | <td>[in, out] Register A</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegB</td> | ||
<td>[in, out] Register B</td> | <td>[in, out] Register B</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegC</td> | ||
<td>[in, out] Register C</td> | <td>[in, out] Register C</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRegD</td> | ||
<td>[in, out] Register D</td> | <td>[in, out] Register D</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,225: | Line 1,326: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | <td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | ||
<td>217</td> | <td>217</td> | ||
<td>Arithmetic instruction | <td>Arithmetic instruction error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | <td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | ||
<td>218</td> | <td>218</td> | ||
<td>Arithmetic operator | <td>Arithmetic operator error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_WRON_GBEGIN</td> | <td>ERROR_UNIKEY_AR_WRON_GBEGIN</td> | ||
<td>219</td> | <td>219</td> | ||
<td> | <td>Constant numbers can't be used on first arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_WRONG_END</td> | <td>ERROR_UNIKEY_AR_WRONG_END</td> | ||
<td>220</td> | <td>220</td> | ||
<td> | <td>Constant numbers can't be used on last arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | <td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | ||
<td>221</td> | <td>221</td> | ||
<td> | <td>Constant numbers > 63 will cause an overflow</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<table | ---- | ||
When using calculate 2, the initial values of register E, F, G and H are the return values of seed code *pSeed, to make it simple, the UniKey calls function SEED with seed code *pSeed, and writes the return values to register E, F, G and H for the next operation. | |||
---- | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Internal Register</th> | <th>Internal Register</th> | ||
| Line 1,270: | Line 1,373: | ||
<tr> | <tr> | ||
<td>E</td> | <td>E</td> | ||
<td>Seed | <td>Seed result 1</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>F</td> | <td>F</td> | ||
<td>Seed | <td>Seed result 2</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>G</td> | <td>G</td> | ||
<td>Seed | <td>Seed result 3</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>H</td> | <td>H</td> | ||
<td>Seed | <td>Seed result 4</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 1,288: | Line 1,391: | ||
<br> | <br> | ||
=== User- | === User-Defined Algorithm Calculate 3 === | ||
'''API Prototype''' | |||
<code>long UniKey_Calculate3(WORD* pHandle, DWORD* pStartAddress, DWORD* pModule, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);</code> | <code>long UniKey_Calculate3(WORD* pHandle, DWORD* pStartAddress, DWORD* pModule, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);</code> | ||
'''Description''' | '''Description''' | ||
Return results of a calculation performed in UniKey, using input provided by the developer and the CALCULATE3 function. | |||
Return results of a calculation performed in the UniKey, using input provided by the developer and the CALCULATE3 function. | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,332: | Line 1,438: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,347: | Line 1,454: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | <td>ERROR_UNIKEY_AR_BAD_COMMAND</td> | ||
<td>217</td> | <td>217</td> | ||
<td>Arithmetic instruction | <td>Arithmetic instruction error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | <td>ERROR_UNIKEY_AR_UNKNOWN_OPCODE</td> | ||
<td>218</td> | <td>218</td> | ||
<td>Arithmetic operator | <td>Arithmetic operator error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_WRON_GBEGIN</td> | <td>ERROR_UNIKEY_AR_WRON_GBEGIN</td> | ||
<td>219</td> | <td>219</td> | ||
<td> | <td>Constant numbers can't be used on first arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_WRONG_END</td> | <td>ERROR_UNIKEY_AR_WRONG_END</td> | ||
<td>220</td> | <td>220</td> | ||
<td> | <td>Constant numbers can't be used on last arithmetic instruction</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | <td>ERROR_UNIKEY_AR_VALUE_OVERFLOW</td> | ||
<td>221</td> | <td>221</td> | ||
<td> | <td>Constant numbers > 63 will cause an overflow</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<table | ---- | ||
When using calculate 3, the initial values of register E, F, G and H are the content of license module *lp2 and *lp2 + 1/2/3. | |||
---- | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Internal Register</th> | <th>Internal Register</th> | ||
| Line 1,408: | Line 1,517: | ||
</table> | </table> | ||
---- | |||
UniKey_Calculate is called when you want to perform the algorithm you have written inside the UniKey dongle. For example, you have written a formula into the dongle, you can call UniKey_Calculate to perform the | Examples: | ||
<br>When calling calculation 3 with *pModule = 0, the initial values of register E, F, G and H are: | |||
<br>E = value of license module 0 | |||
<br>F = value of license module 1 | |||
<br>G = value of license module 2 | |||
<br>F = value of license module 3 | |||
<br>Note: The address will return to "0" when the license module address call exceeds 128. For example: Calculation 3 with *pModule = 126, the initial values of register E, F, G and H are: | |||
<br>E = value of license module 126 | |||
<br>F = value of license module 127 | |||
<br>G = value of license module 0 | |||
<br>H = value of license module 1 | |||
---- | |||
---- | |||
<code>UniKey_Calculate</code> is called when you want to perform the algorithm you have written inside the UniKey dongle. For example, you have written a formula into the dongle, you can call <code>UniKey_Calculate</code> to perform the algorithm and get the return value of the formula. | |||
---- | |||
<br> | <br> | ||
=== Decrease | === Decrease a License Module === | ||
'''API Prototype''' | |||
<code>long UniKey_Module_Decrease(WORD* pHandle, WORD* pModule);</code> | <code>long UniKey_Module_Decrease(WORD* pHandle, WORD* pModule);</code> | ||
'''Description''' | '''Description''' | ||
Decrease the value in a specified UniKey license module by "1". | Decrease the value in a specified UniKey license module by "1". | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,442: | Line 1,566: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,457: | Line 1,582: | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td>204</td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,471: | Line 1,596: | ||
</table> | </table> | ||
Please call UniKey_Check_Module to check if the license module is valid first. | ---- | ||
Please call <code>UniKey_Check_Module</code> to check if the license module is valid first. | |||
---- | |||
<br> | <br> | ||
| Line 1,479: | Line 1,605: | ||
=== Generate a New Password === | === Generate a New Password === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Generate_New_Password(WORD* pHandle, DWORD* pSeed, WORD* pPassword1, WORD* pPassword2, WORD* pPassword3, WORD* pPassword4);</code> | <code>long UniKey_Generate_New_Password(WORD* pHandle, DWORD* pSeed, WORD* pPassword1, WORD* pPassword2, WORD* pPassword3, WORD* pPassword4);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Generate a new password via a seed code; the mapping from the seed code to the password is a one-way function. Without the seed, you cannot generate the same password. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,497: | Line 1,626: | ||
<tr> | <tr> | ||
<td>*pSeed</td> | <td>*pSeed</td> | ||
<td>[in] Seed | <td>[in] Seed code (32-bit)</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,517: | Line 1,646: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,532: | Line 1,662: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_VERIFY_ADV_PASSWORD</td> | <td>ERROR_UNIKEY_VERIFY_ADV_PASSWORD</td> | ||
<td>223</td> | <td>223</td> | ||
<td>Advanced passwords ( | <td>Advanced passwords (passwords 3 and 4) not verified</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_GENERATE_NEW_PASSWORD</td> | <td>ERROR_UNIKEY_GENERATE_NEW_PASSWORD</td> | ||
<td>225</td> | <td>225</td> | ||
<td> | <td>Error generating new password</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
A file recording the new seed and passwords will be created in the working path, helping the software vendor to record everything. The passwords can be distributed to ordinary developers! | |||
---- | |||
---- | |||
# The dongle will automatically log off after a new set of passwords have been generated. | |||
# The dongle will be fully formatted when a new password is generated. | |||
# A file including the new passwords and seed will be created in the working directory. | |||
---- | |||
<br> | <br> | ||
| Line 1,558: | Line 1,692: | ||
=== Generate a New Encryption Key === | === Generate a New Encryption Key === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Generate_Key(WORD* pHandle, DWORD* pKeyNumber);</code> | <code>long UniKey_Generate_Key(WORD* pHandle, DWORD* pKeyNumber);</code> | ||
'''Description''' | '''Description''' | ||
Generate a new key in the specific key storage. | Generate a new key in the specific key storage. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,576: | Line 1,713: | ||
<tr> | <tr> | ||
<td>*pKeyNumber</td> | <td>*pKeyNumber</td> | ||
<td>[in] Key | <td>[in] Key storage number</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,595: | Line 1,733: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,604: | Line 1,742: | ||
</table> | </table> | ||
---- | |||
# This function will delete the original key in the key storage, and generate a new key. | |||
# The data encrypted by the old key cannot be decrypted by the new key. | |||
# Each key is 128-bits long. | |||
---- | |||
<br> | <br> | ||
=== Generate a New Encryption Key | === Generate a New Encryption Key via Seed === | ||
'''API Prototype''' | |||
<code>long UniKey_Generate_Key_Via_Seed(WORD* pHandle, DWORD* pKeyNumber, WORD pSeed1, WORD pSeed2, WORD pSeed3, WORD pSeed4);</code> | <code>long UniKey_Generate_Key_Via_Seed(WORD* pHandle, DWORD* pKeyNumber, WORD pSeed1, WORD pSeed2, WORD pSeed3, WORD pSeed4);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Generate a new key in the specific key storage via a seed. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,630: | Line 1,774: | ||
<tr> | <tr> | ||
<td>*pKeyNumber</td> | <td>*pKeyNumber</td> | ||
<td>[in] Key | <td>[in] Key storage number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSeed1</td> | <td>*pSeed1</td> | ||
<td>[in] | <td>[in] Seed 1</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSeed2</td> | <td>*pSeed2</td> | ||
<td>[in] | <td>[in] Seed 2</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSeed3</td> | <td>*pSeed3</td> | ||
<td>[in] | <td>[in] Seed 3</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSeed4</td> | <td>*pSeed4</td> | ||
<td>[in] | <td>[in] Seed 4</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,665: | Line 1,810: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,674: | Line 1,819: | ||
</table> | </table> | ||
---- | |||
# This function will delete the original key in the key storage, and generate a new key via seed. | |||
# The data encrypted by the old key cannot be decrypted by the new key. | |||
# Each key is 128-bit long. | |||
---- | |||
<br> | <br> | ||
| Line 1,682: | Line 1,830: | ||
=== Encrypt the Buffer with a Specific Encryption Key === | === Encrypt the Buffer with a Specific Encryption Key === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Encrypt(WORD* pHandle, DWORD* pBufferLength, DWORD* pKeyNumber, BYTE* pBuffer );</code> | |||
<code>long UniKey_Encrypt(WORD* pHandle, DWORD* pBufferLength, DWORD* pKeyNumber, BYTE* pBuffer);</code> | |||
'''Description''' | |||
Encrypt an amount of memory with a key. The length of data must be a multiple of 8. | Encrypt an amount of memory with a key. The length of data must be a multiple of 8. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,704: | Line 1,855: | ||
<tr> | <tr> | ||
<td>*pKeyNumber</td> | <td>*pKeyNumber</td> | ||
<td>[in] Key | <td>[in] Key storage number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pBuffer</td> | <td rowspan="2">*pBuffer</td> | ||
<td>[in] Pointer to the data to be encrypted</td> | <td>[in] Pointer to the data to be encrypted</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Pointer to the encrypted data</td> | <td>[out] Pointer to the encrypted data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,731: | Line 1,882: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,741: | Line 1,892: | ||
<td>ERROR_UNIKEY_ENCRYPT_FAILED</td> | <td>ERROR_UNIKEY_ENCRYPT_FAILED</td> | ||
<td>228</td> | <td>228</td> | ||
<td> | <td>Could not encrypt data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
This function only performs an encryption operation, no compression functions are involved. | This function only performs an encryption operation, no compression functions are involved. | ||
---- | |||
<br> | <br> | ||
| Line 1,753: | Line 1,905: | ||
=== Decrypt the Buffer with a Specific Encryption Key === | === Decrypt the Buffer with a Specific Encryption Key === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Decrypt(WORD* pHandle, DWORD* pBufferLength, DWORD* pKeyNumber, BYTE* pBuffer);</code> | <code>long UniKey_Decrypt(WORD* pHandle, DWORD* pBufferLength, DWORD* pKeyNumber, BYTE* pBuffer);</code> | ||
'''Description''' | '''Description''' | ||
Encrypt an amount of memory with a key. The length of data must be a multiple of 8. | Encrypt an amount of memory with a key. The length of data must be a multiple of 8. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,775: | Line 1,930: | ||
<tr> | <tr> | ||
<td>*pKeyNumber</td> | <td>*pKeyNumber</td> | ||
<td>[in] Key | <td>[in] Key storage number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pBuffer</td> | <td rowspan="2">*pBuffer</td> | ||
<td>[in] Pointer to the data to be decrypted</td> | <td>[in] Pointer to the data to be decrypted</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Pointer to the decrypted data</td> | <td>[out] Pointer to the decrypted data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,802: | Line 1,957: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,812: | Line 1,967: | ||
<td>ERROR_UNIKEY_DECRYPT_FAILED</td> | <td>ERROR_UNIKEY_DECRYPT_FAILED</td> | ||
<td>229</td> | <td>229</td> | ||
<td> | <td>Could not decrypt data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
UniKey_Encrypt and UniKey_Decrypt offer a basic 128-bit encryption/decryption operation based on UniKey’s hardware. You can call these functions when an encryption or decryption operation is needed. For better security, you can encrypt | Please use the key that was used to encrypt the data to decrypt the data, otherwise you cannot properly decrypt the data. | ||
---- | |||
---- | |||
<code>UniKey_Encrypt</code> and <code>UniKey_Decrypt</code> offer a basic 128-bit encryption/decryption operation based on UniKey’s hardware. You can call these functions when an encryption or decryption operation is needed. For better security, you can encrypt a credential before saving it into the UniKey’s memory. | |||
---- | |||
<br> | <br> | ||
=== Make an MD5 Digest for | === Make an MD5 Digest for Certain Content === | ||
'''API Prototype''' | |||
<code>long UniKey_MD5(WORD* pHandle, DWORD* pBufferLength, DWORD* pType, BYTE* pBuffer);</code> | <code>long UniKey_MD5(WORD* pHandle, DWORD* pBufferLength, DWORD* pType, BYTE* pBuffer);</code> | ||
'''Description''' | '''Description''' | ||
'''Parameters''' | Make an MD5 digest of content or data. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,849: | Line 2,009: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pBuffer</td> | <td rowspan="2">*pBuffer</td> | ||
<td>[in] Pointer to the data to be digested</td> | <td>[in] Pointer to the data to be digested</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>[out] Pointer to the digested data</td> | <td>[out] Pointer to the digested data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,873: | Line 2,033: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 1,881: | Line 2,041: | ||
=== Read UpdateTag === | === Read UpdateTag === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Read_UpdateTag(WORD* pHandle, DWORD* pUpdateTag);</code> | <code>long UniKey_Read_UpdateTag(WORD* pHandle, DWORD* pUpdateTag);</code> | ||
'''Description''' | '''Description''' | ||
Read UpdateTag from a specific dongle | Read UpdateTag from a specific dongle | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,903: | Line 2,066: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,918: | Line 2,082: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,931: | Line 2,095: | ||
=== Write UpdateTag === | === Write UpdateTag === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Write_UpdateTag(WORD* pHandle, DWORD* pUpdateTag);</code> | <code>long UniKey_Write_UpdateTag(WORD* pHandle, DWORD* pUpdateTag);</code> | ||
'''Description''' | '''Description''' | ||
Write UpdateTag into a specific dongle. | Write UpdateTag into a specific dongle. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 1,953: | Line 2,120: | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 1,968: | Line 2,136: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 1,977: | Line 2,145: | ||
</table> | </table> | ||
UniKey_Read_UpdateTag APIs give software vendors an easy method to identify if the UniKey dongle needs to be updated. When distributing | ---- | ||
<code>UniKey_Read_UpdateTag</code> APIs give software vendors an easy method to identify if the UniKey dongle needs to be updated. When distributing software, software vendors may use the UpdateTag as an ID which shows if the dongle needs to be updated or has been updated. You can also use this tag as a tracking ID for each update. | |||
---- | |||
<br> | <br> | ||
| Line 1,984: | Line 2,154: | ||
=== Get UniKey Library Version === | === Get UniKey Library Version === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Get_Version(WORD* pHandle, DWORD* pVersion);</code> | <code>long UniKey_Get_Version(WORD* pHandle, DWORD* pVersion);</code> | ||
'''Description''' | '''Description''' | ||
Get the current UniKey library version. | Get the current UniKey library version. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,008: | Line 2,181: | ||
<br> | <br> | ||
=== | ===Lock a UniKey Dongle=== | ||
'''API Prototype''' | |||
<code>long UniKey_Lock(WORD *pHandle)</code> | |||
'''Description''' | |||
Create a mutex to lock the UniKey dongle. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in] Dongle handle</td> | <td>[in] Dongle handle</td> | ||
</tr> | </tr> | ||
</table> | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
< | <th>Result</th> | ||
< | <th>Value</th> | ||
<th>Description</th> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>SUCCESS</td> | ||
<td> | <td>0</td> | ||
<td>Success</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_ALREADY_LOCKED</td> | ||
<td> | <td>236</td> | ||
<td>Dongle already locked (when attempting to lock twice, or open after locking a dongle)</td> | |||
</tr> | </tr> | ||
</table> | |||
<br> | |||
===Unlock a UniKey Dongle=== | |||
'''API Prototype''' | |||
<code>long UniKey_UnLock(WORD *pHandle)</code> | |||
'''Description''' | |||
Free the mutex to unlock the UniKey dongle. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
< | <th>Parameter</th> | ||
< | <th>Description</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[out] | <td>[out] Dongle handle</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,064: | Line 2,262: | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | </tr> | ||
</table> | |||
<br> | |||
< | |||
== UniKey Time API Reference == | |||
=== Get UniKey Time === | |||
'''API Prototype''' | |||
< | <code>long UniKey_Get_Time(WORD* pHandle, DWORD* pYear, DWORD* pMonth, WORD* pDay, WORD* pHour, WORD* pMinute, WORD* pSecond);</code> | ||
'''Description''' | |||
Get the time from the UniKey Time’s real-time clock. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,102: | Line 2,291: | ||
<tr> | <tr> | ||
<td>*pYear</td> | <td>*pYear</td> | ||
<td>[ | <td>[out] Year (input or output is 10, which refers to 2010)</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pMonth</td> | <td>*pMonth</td> | ||
<td>[ | <td>[out] Month</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pDay</td> | <td>*pDay</td> | ||
<td>[ | <td>[out] Day</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pHour</td> | <td>*pHour</td> | ||
<td>[ | <td>[out] Hour</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pMinute</td> | <td>*pMinute</td> | ||
<td>[ | <td>[out] Minute</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pSecond</td> | <td>*pSecond</td> | ||
<td>[ | <td>[out] Second</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,141: | Line 2,331: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 2,150: | Line 2,340: | ||
</table> | </table> | ||
---- | |||
Calling <code>UniKey_Check_Time</code> can check if the dongle is a UniKey Time model. If ERROR_UNIKEY_READ_TIME is returned, then the dongle is not a UniKey Time. | |||
---- | |||
<br> | <br> | ||
=== Set UniKey Time | === Set UniKey Time === | ||
'''API Prototype''' | |||
<code>long UniKey_Set_Time(WORD* pHandle, DWORD* pYear, DWORD* pMonth, WORD* pDay, WORD* pHour, WORD* pMinute, WORD* pSecond);</code> | |||
'''Description''' | |||
Set the time on the UniKey Time’s clock. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,173: | Line 2,367: | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in] Dongle handle</td> | <td>[in] Dongle handle</td> | ||
</tr> | |||
<tr> | |||
<td>*pYear</td> | |||
<td>[in] Year (input or output is 10, which refers to 2010)</td> | |||
</tr> | |||
<tr> | |||
<td>*pMonth</td> | |||
<td>[in] Month</td> | |||
</tr> | |||
<tr> | |||
<td>*pDay</td> | |||
<td>[in] Day</td> | |||
</tr> | |||
<tr> | |||
<td>*pHour</td> | |||
<td>[in] Hour</td> | |||
</tr> | |||
<tr> | |||
<td>*pMinute</td> | |||
<td>[in] Minute</td> | |||
</tr> | |||
<tr> | |||
<td>*pSecond</td> | |||
<td>[in] Second</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,191: | Line 2,410: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_READ_TIME</td> | ||
<td> | <td>230</td> | ||
<td> | <td>Get UniKey time error</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
You need to verify all 4 passwords (vendor mode) to set the time of the UniKey Time's internal clock. | |||
---- | |||
<br> | <br> | ||
=== | === Set UniKey Time by Host’s Clock === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Set_Time_Now(WORD* pHandle);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
<tr> | Set the time of the UniKey Time’s real-time clock to the host computer’s clock. | ||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,219: | Line 2,447: | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in] Dongle handle</td> | <td>[in] Dongle handle</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,241: | Line 2,466: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_WRITE_TIME</td> | <td>ERROR_UNIKEY_WRITE_TIME</td> | ||
<td>231</td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<br> | |||
< | === Erase Real Time Module === | ||
'''API Prototype''' | |||
<code>long UniKey_Erase_Time_Module(WORD* pHandle, DWORD* pModule);</code> | |||
'''Description''' | |||
Erase/Reset a real-time module, and all the information in the module will be erased including start, and end or duration. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,276: | Line 2,500: | ||
<tr> | <tr> | ||
<td>*pModule</td> | <td>*pModule</td> | ||
<td>[in] Real time module number (0-15) | <td>[in] Real-time module number (0-15)</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,311: | Line 2,520: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_WRITE_TIME</td> | ||
<td>231</td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | </tr> | ||
</table> | |||
---- | |||
You need to verify all 4 passwords (vendor mode) to reset a module. If a real-time module’s write-once flag is enabled, only the first START_TIME call works. Successive START_TIME calls will return an error until this module is reset. | |||
---- | |||
<br> | <br> | ||
=== Set a Real Time Module’s Start Time | === Set a Real Time Module’s Start Time === | ||
'''API Prototype''' | |||
<code>long UniKey_Set_Time_Module_Start_Time(WORD* pHandle, DWORD* pModule, WORD* pYear, WORD* pMonth, WORD* pDay, WORD* pHour);</code> | |||
<code>long | |||
'''Description''' | |||
Set a real-time module’s start time. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,351: | Line 2,559: | ||
<tr> | <tr> | ||
<td>*pModule</td> | <td>*pModule</td> | ||
<td>[in] Real time module number (0-15)</td> | <td>[in] Real-time module number (0-15)</td> | ||
</tr> | |||
<tr> | |||
<td>*pYear</td> | |||
<td>[in] Year (input or output is 10, which refers to 2010)</td> | |||
</tr> | |||
<tr> | |||
<td>*pMonth</td> | |||
<td>[in] Month</td> | |||
</tr> | |||
<tr> | |||
<td>*pDay</td> | |||
<td>[in] Day</td> | |||
</tr> | |||
<tr> | |||
<td>*pHour</td> | |||
<td>[in] Hour</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,370: | Line 2,595: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | <td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | ||
<td>231</td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_TIME_MODULE_NOT_NULL</td> | <td>ERROR_UNIKEY_TIME_MODULE_NOT_NULL</td> | ||
<td>234</td> | <td>234</td> | ||
<td>The real time module is not null, this error is returned when write once flag is set</td> | <td>The real-time module is not null, this error is returned when the 'write once' flag is set</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
The write-once flag is very useful for setting the start for a real-time module. If the write-once flag is set, only the first START_TIME call can set the start time for a module; all successive START_TIME calls will not work and return an ERROR_UNIKEY_TIME_MODULE_NOT_NULL. Software vendors may use this flag when the start for a module is not clear. | |||
---- | |||
<br> | <br> | ||
=== Set a Real Time Module’s Start Time by | === Set a Real Time Module’s Start Time by the UniKey's Internal Clock === | ||
'''API Prototype''' | |||
<code>long UniKey_Set_Time_Module_Start_Time_Now(WORD* pHandle, DWORD* pModule);</code> | |||
'''Description''' | |||
' | Set a real-time module’s start time as the current time in the UniKey's internal clock. | ||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,405: | Line 2,638: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pModule</td> | ||
<td>[in] Real time module number (0-15)</td> | <td>[in] Real-time module number (0-15)</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,425: | Line 2,659: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | <td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | ||
<td>231</td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_TIME_MODULE_NOT_NULL</td> | <td>ERROR_UNIKEY_TIME_MODULE_NOT_NULL</td> | ||
<td>234</td> | <td>234</td> | ||
<td>The real time module is not null, this error is returned when write once flag is set</td> | <td>The real-time module is not null, this error is returned when the 'write once' flag is set</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 2,441: | Line 2,675: | ||
<br> | <br> | ||
=== Set a Real Time Module’s | === Set a Real Time Module’s Start Time by Host’s Clock === | ||
'''API Prototype''' | |||
<code>long UniKey_Set_Time_Module_Start_Time_Now_PC(WORD* pHandle, DWORD* pModule);</code> | |||
'''Description''' | |||
Set a real time module’s start time as the current time of the host computer. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,460: | Line 2,697: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pModule</td> | ||
<td>[in] Real time module number (0-15) | <td>[in] Real-time module number (0-15)</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,496: | Line 2,718: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | <td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | ||
<td>231</td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_TIME_MODULE_NOT_NULL</td> | |||
<td>234</td> | |||
<td>The real-time module is not null, this error is returned when the 'write once' flag is set</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 2,507: | Line 2,734: | ||
<br> | <br> | ||
=== Set a Real Time Module’s | === Set a Real Time Module’s End Time === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Set_Time_Module_End_Time(WORD* pHandle, DWORD* pModule, WORD* pYear, WORD* pMonth, WORD* pDay, WORD* pHour);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
<tr> | Set a real-time module’s end time. | ||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,526: | Line 2,756: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle </td> | ||
<td>[in] Real time module number (0-15)</td> | <td>[in] Real-time module number (0-15)</td> | ||
</tr> | |||
<tr> | |||
<td>*pYear</td> | |||
<td>[in] Year (input or output is 10, which refers to 2010)</td> | |||
</tr> | |||
<tr> | |||
<td>*pMonth</td> | |||
<td>[in] Month</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pDay</td> | <td>*pDay</td> | ||
<td>[in] | <td>[in] Day</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pHour</td> | <td>*pHour</td> | ||
<td>[in] | <td>[in] Hour</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,554: | Line 2,793: | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td>Need | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | <td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | ||
<td>231</td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<br> | |||
< | === Set a Real Time Module’s Duration === | ||
'''API Prototype''' | |||
<code>long UniKey_Set_Time_Module_Duration(WORD* pHandle, DWORD* pModule, DWORD* pDay, WORD* pHour);</code> | |||
'''Description''' | |||
Set the duration for a specific real-time module. The total duration is (*pDay) * 24 + (*pHour) in hours. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,589: | Line 2,827: | ||
<tr> | <tr> | ||
<td>*pModule</td> | <td>*pModule</td> | ||
<td>[in] | <td>[in] Real-time module number (0-15)</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pDay</td> | ||
<td>[ | <td>[in] Number of days</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHour</td> | ||
<td>[in] | <td>[in] Number of hours</td> | ||
</tr> | </tr> | ||
</table> | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,624: | Line 2,851: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_WRITE_TIME_MODULE</td> | ||
<td> | <td>231</td> | ||
<td> | <td>Set UniKey time error</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
You need to verify all 4 passwords (vendor mode) to set the duration for a real-time module. | |||
---- | |||
<br> | <br> | ||
=== Check a UniKey Time License | === Check a UniKey Time License module === | ||
'''API Prototype''' | |||
<code>long UniKey_Check_Time_Module(WORD* pHandle, DWORD* pModule, DWORD* pRemainDays, WORD* pYear, WORD* pMonth, WORD* pDay, WORD* pHour);</code> | |||
<code>long | |||
'''Description''' | '''Description''' | ||
'''Parameters''' | Read the attributes of a specific UniKey Time license module. | ||
<table | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,672: | Line 2,898: | ||
<tr> | <tr> | ||
<td>*pRemainDays</td> | <td>*pRemainDays</td> | ||
<td>[out] | <td>[out] Days remaining</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pYear</td> | ||
<td>[ | <td>[in] Year (input or output is 10, which refers to 2010)</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<th> | <td>*pMonth</td> | ||
<th>Value</th> | <td>[in] Month</td> | ||
</tr> | |||
<tr> | |||
<td>*pDay</td> | |||
<td>[in] Day</td> | |||
</tr> | |||
<tr> | |||
<td>*pHour</td> | |||
<td>[in] Hour</td> | |||
</tr> | |||
</table> | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Result</th> | |||
<th>Value</th> | |||
<th>Description</th> | <th>Description</th> | ||
</tr> | </tr> | ||
| Line 2,694: | Line 2,933: | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 2,709: | Line 2,948: | ||
</table> | </table> | ||
A successful operation will result in | ---- | ||
A successful operation will result in *pValue having value from the validity of a license module (1 = license module value is not zero). | |||
The value of a license module cannot be read out directly and it is invisible to end users. | |||
---- | |||
<br> | <br> | ||
=== Check a UniKey Time License Module Now | === Check a UniKey Time License Module Now === | ||
'''API Prototype''' | |||
<code>long UniKey_Check_Time_Module_Now(WORD* pHandle, DWORD* pModule, DWORD* pRemainDays, WORD* pRemainHours);</code> | |||
'''Description''' | |||
Read the attributes of a specific UniKey Time license module Now. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,735: | Line 2,980: | ||
<tr> | <tr> | ||
<td>*pModule</td> | <td>*pModule</td> | ||
<td>[in] License module | <td>[in] License module number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pRemainDays</td> | <td>*pRemainDays</td> | ||
<td>[out] | <td>[out] Days remaining</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pRemainHours</td> | <td>*pRemainHours</td> | ||
<td>[out] | <td>[out] Hours remaining</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,761: | Line 3,007: | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td> | <td>204</td> | ||
<td>Read/Write address or length | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_NEED_OPEN</td> | <td>ERROR_UNIKEY_NEED_OPEN</td> | ||
<td>212</td> | <td>212</td> | ||
<td> | <td>Need to log on to a dongle before running</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 2,776: | Line 3,022: | ||
</table> | </table> | ||
---- | |||
A successful operation will result in *pValue having value from the validity (1 = license module value is not zero). | |||
The value of a license module cannot be read out directly and it is invisible to end users. | |||
---- | |||
<br> | |||
=== Check a UniKey Time License Module Now PC === | |||
''' | '''API Prototype''' | ||
'''Parameters''' | <code>long UniKey_Check_Time_Module_Now_PC(WORD* pHandle, DWORD* pModule, DWORD* pRemainDays, WORD* pRemainHours);</code> | ||
<table | |||
<tr> | '''Description''' | ||
Read the attributes of a specific UniKey Time license module Now PC. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,798: | Line 3,050: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in] | <td>[in] Dongle handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pModule</td> | ||
<td>[in] | <td>[in] License module number</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRemainDays</td> | ||
<td>[ | <td>[out] Days remaining</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pRemainHours</td> | ||
<td>[ | <td>[out] Hours remaining</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,831: | Line 3,080: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_INVALID_ADDR_OR_SIZE</td> | ||
<td> | <td>204</td> | ||
<td> | <td>Read/Write address is incorrect or invalid length</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_NEED_OPEN</td> | |||
<td>212</td> | |||
<td>Need to log on to a dongle before running</td> | |||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_MODULE</td> | |||
<td>216</td> | |||
<td>License module error</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
---- | |||
A successful operation will result in *pValue having value from the validity (1 = license module value is not zero). | |||
The value of a license module cannot be read out directly and it is invisible to end users. | |||
---- | |||
<br> | <br> | ||
== | == UniKey Drive API Reference == | ||
=== Initialize File System === | |||
''' | '''API Prototype''' | ||
<code>long UniKey_FS_Init(WORD* pHandle, DWORD* PW1, DWORD* PW2, DWORD* PW3, DWORD* PW4);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
<tr> | The user needs to call this function to initialize the file system before calling other file system related functions. The default password of the file system is "12345678", without quotations. | ||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | <th>Parameter</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,855: | Line 3,126: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | |||
<tr> | |||
<td>*PW1</td> | |||
<td>[in] Password 1</td> | |||
</tr> | |||
<tr> | |||
<td>*PW2</td> | |||
<td>[in] Password 2</td> | |||
</tr> | |||
<tr> | |||
<td>*PW3</td> | |||
<td>[in] Password 3</td> | |||
</tr> | |||
<tr> | |||
<td>*PW4</td> | |||
<td>[in] Password 4</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,872: | Line 3,160: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_INVALID_PASSWORD_OR_ID</td> | ||
<td> | <td>202</td> | ||
<td> | <td>Wrong password or UniKey HID</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<br> | |||
=== Format the File System === | |||
'''API Prototype''' | |||
< | <code>long UniKey_FS_Format(WORD* pHandle);</code> | ||
'''Description''' | |||
Format the file system. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,900: | Line 3,187: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,925: | Line 3,205: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_FS_FILE_EXIST</td> | ||
<td> | <td>245</td> | ||
<td> | <td>File already exists</td> | ||
</tr> | </tr> | ||
</table> | |||
---- | |||
Note: The user needs to initialize the file system successfully before calling other file system related functions. | |||
---- | |||
<br> | <br> | ||
=== | === Create Files === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_FS_CreateFile(WORD* pHandle, BYTE* filename);</code> | ||
'''Description''' | |||
Create files. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 2,959: | Line 3,237: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*filename</td> | <td>*filename</td> | ||
<td>[in/out]Input/Output file name</td> | <td>[in/out] Input/Output file name</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | |||
<table | ---- | ||
Note: a single backslash ("\") should be added before the name of the file. | |||
---- | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 2,978: | Line 3,263: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_FS_FILE_NAME</td> | |||
<td>240</td> | |||
<td>Wrong or invalid filename</td> | |||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_FS_FILE_EXIST</td> | |||
<td>245</td> | |||
<td>File already exists</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>ERROR_UNIKEY_FS_ERR_SYS_UNINIT</td> | <td>ERROR_UNIKEY_FS_ERR_SYS_UNINIT</td> | ||
<td>246</td> | <td>246</td> | ||
<td>The file is not | <td>The file system is not initialized</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 2,993: | Line 3,283: | ||
<br> | <br> | ||
=== | === Delete Files === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_FS_DeleteFile(WORD* pHandle, BYTE* filename);</code> | ||
'''Description''' | |||
'''Parameters''' | Delete files. | ||
<table | |||
<tr> | '''Parameters''' | ||
<th>Parameter</th> | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | |||
<th>Description</th> | <th>Description</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*filename</td> | <td>*filename</td> | ||
<td>[in]Input/Output file name</td> | <td>[in/out] Input/Output file name</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,032: | Line 3,326: | ||
<td>ERROR_UNIKEY_FS_NO_FILE</td> | <td>ERROR_UNIKEY_FS_NO_FILE</td> | ||
<td>241</td> | <td>241</td> | ||
<td>No such file | <td>No such filename</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_FS_ERR_SYS_UNINIT</td> | |||
<td>246</td> | |||
<td>The file system is not initialized</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,038: | Line 3,337: | ||
<br> | <br> | ||
=== | === Open Files === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_FS_File_Open(WORD* pHandle, BYTE* filename);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
Open files. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,054: | Line 3,356: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*filename</td> | ||
<td>[ | <td>[in] Input/Output file name</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,077: | Line 3,376: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_FS_NO_FILE</td> | |||
<td>241</td> | |||
<td>No such filename</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,082: | Line 3,386: | ||
<br> | <br> | ||
=== | === Get System Space === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_FS_Get_Free_Size(WORD* pHandle, DWORD* usedsize, DWORD* freesize);</code> | ||
'''Description''' | |||
Get occupied and free system space. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,098: | Line 3,405: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*usedsize</td> | ||
<td>[in | <td>[out] System memory that is in use</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*freesize</td> | ||
<td>[ | <td>[out] Free system memory</td> | ||
</tr> | </tr> | ||
</table> | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,125: | Line 3,429: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,140: | Line 3,434: | ||
<br> | <br> | ||
=== | === Modify File Data === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_FS_File_Modify_Data(WORD* pHandle, DWORD* offset, DWORD* len, BYTE* buffer);</code> | ||
'''Description''' | |||
Modify file data. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | <tr> | ||
<th>Parameter</th> | |||
<th>Description</th> | |||
</tr> | |||
<tr> | |||
<td>*pHandle</td> | |||
<td>[in] Device handle</td> | |||
</tr> | |||
<tr> | <tr> | ||
< | <td>*offset</td> | ||
< | <td>[in] Address to be modified</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>*len</td> | ||
<td> | <td>[in] Length of data to be modified</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>*buffer</td> | ||
<td> | <td>[in] Modified data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,180: | Line 3,483: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_FS_FILE_OFFSET</td> | ||
<td></td> | <td>242</td> | ||
<td> | <td>File offset error</td> | ||
<td> | </tr> | ||
<tr> | |||
<td>ERROR_UNIKEY_FS_ERR_OPEN_FILE</td> | |||
<td>247</td> | |||
<td>Failed to open file</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,189: | Line 3,496: | ||
<br> | <br> | ||
=== | === Append Data to the End-Of-File === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_FS_File_Append_Data(WORD* pHandle, DWORD* len, BYTE* buffer);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
Append data to the end-of-file. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
<th> | <th>Meaning</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*len</td> | <td>*len</td> | ||
<td>[in] | <td>[in] The length of the data to be appended</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*buffer</td> | <td>*buffer</td> | ||
<td>[ | <td>[in] Data to append</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th> | <th>Meaning</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 3,234: | Line 3,542: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_FS_NO_MEMORY</td> | ||
<td> | <td>244</td> | ||
<td> | <td>Not enough free memory</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,247: | Line 3,550: | ||
<br> | <br> | ||
=== | === Read File Data === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_FS_File_Read_Data(WORD* pHandle, DWORD* offset, DWORD* len, BYTE* buffer);</code> | ||
'''Description''' | |||
Read file data. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,263: | Line 3,569: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*offset</td> | ||
<td>[in] | <td>[in] Read address</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*len</td> | <td>*len</td> | ||
<td>[in] | <td>[in] Length of data to be read</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*buffer</td> | <td>*buffer</td> | ||
<td>[ | <td>[out] Read data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,290: | Line 3,597: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_FS_FILE_OFFSET</td> | |||
<td>242</td> | |||
<td>File offset error</td> | |||
</tr> | |||
<tr> | |||
<td>ERROR_UNIKEY_FS_ERR_OPEN_FILE</td> | |||
<td>247</td> | |||
<td>Failed to open file</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,295: | Line 3,612: | ||
<br> | <br> | ||
=== | === Close Files === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_FS_File_Close(WORD* pHandle, BYTE* filename);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
Close files. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,311: | Line 3,631: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*filename</td> | ||
<td>[ | <td>[in] Filename</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,339: | Line 3,656: | ||
<br> | <br> | ||
=== Get | === Get File List === | ||
'''API Prototype''' | |||
<code>long UniKey_FS_File_Get_List(WORD* pHandle, DWORD* filecount, BYTE* filelist);</code> | |||
'''Description''' | |||
Get list of files on the UniKey Drive. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,355: | Line 3,675: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | |||
<tr> | |||
<td>*filecount</td> | |||
<td>[out] The number of files</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*filelist</td> | ||
<td>[out] | <td>[out] File list</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,379: | Line 3,704: | ||
<br> | <br> | ||
=== | === Get File Size === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_FS_File_Get_Size(WORD* pHandle, DWORD* filesize);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
<tr> | Get the file size. | ||
<th>Parameter</th> | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | |||
<th>Description</th> | <th>Description</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*filesize</td> | ||
<td>[ | <td>[out] The size of the file</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,426: | Line 3,743: | ||
<td>0</td> | <td>0</td> | ||
<td>Success</td> | <td>Success</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
<br> | |||
< | === User Reset File System Password === | ||
'''API Prototype''' | |||
<code>long UniKey_FS_Set_Password(WORD* pHandle, DWORD* PW1, DWORD* PW2, DWORD* PW3, DWORD* PW4);</code> | |||
'''Description''' | |||
Allows a user to reset the file system password. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,456: | Line 3,767: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | |||
<tr> | |||
<td>*PW1</td> | |||
<td>[in] Password 1</td> | |||
</tr> | |||
<tr> | |||
<td>*PW2</td> | |||
<td>[in] Password 2</td> | |||
</tr> | |||
<tr> | |||
<td>*PW3</td> | |||
<td>[in] Password 3</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*PW4</td> | ||
<td>[in] | <td>[in] Password 4</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,477: | Line 3,801: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_GENERATE_NEW_PASSWORD</td> | ||
<td> | <td>225</td> | ||
<td> | <td>Error generating new password</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
=== Generate | ---- | ||
A password reset can only be successfully done after initializing the file system. | |||
---- | |||
<br> | |||
=== Generate RSA Key === | |||
'''API Prototype''' | |||
<code>long UniKey_RSA_Generate_Key(WORD* pHandle, WORD* KeyIndex);</code> | |||
'''Description''' | |||
UniKey Drive has encryption and decryption modules with 1024-bit RSA keys. Calling this function can generate a 1024-bit RSA key. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,501: | Line 3,833: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[ | <td>[out] Return the handle generated key</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,522: | Line 3,855: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td>239</td> | <td>239</td> | ||
<td>The handle of the key is invalid | <td>The handle of the key is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,530: | Line 3,863: | ||
<br> | <br> | ||
=== | === Generate a DES Key === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_DES_Generate_Key(WORD* pHandle, DWORD* KeyIndex);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
Calling this function can generate a DES key. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,545: | Line 3,881: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[out] | <td>[out] Return the handle generated key</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,567: | Line 3,904: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td>239</td> | <td>239</td> | ||
<td>The handle of the key is invalid | <td>The handle of the key is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,575: | Line 3,912: | ||
<br> | <br> | ||
=== | === RSA Get Number of Generated Keys === | ||
'''API Prototype''' | |||
<code>long UniKey_RSA_Get_Key_Counts(WORD* pHandle, DWORD* KeyIndexs);</code> | |||
'''Description''' | |||
Get the number of RSA keys that are generated. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,590: | Line 3,930: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[out] | <td>[out] Key count</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,612: | Line 3,953: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td>239</td> | <td>239</td> | ||
<td>The handle of the key is invalid | <td>The handle of the key is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,620: | Line 3,961: | ||
<br> | <br> | ||
=== | === DES Get Number of Generated Keys === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_DES_Get_Key_Counts(WORD* pHandle, DWORD* KeyIndexs);</code> | ||
'''Description''' | |||
Get the number of DES keys that are generated. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,635: | Line 3,979: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[ | <td>[out] Key count</td> | ||
</tr> | </tr> | ||
</table> | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Result</th> | |||
<th>Value</th> | |||
<th> | |||
<th>Value</th> | |||
<th>Description</th> | <th>Description</th> | ||
</tr> | </tr> | ||
| Line 3,665: | Line 4,002: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td> | <td>239</td> | ||
<td> | <td>The handle of the key is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,673: | Line 4,010: | ||
<br> | <br> | ||
=== RSA | === RSA Encryption === | ||
'''API Prototype''' | '''API Prototype''' | ||
'''Description''' | <code>long UniKey_RSA_Encrypt(WORD* pHandle, WORD* KeyIndex, DWORD* Encrypt_Len, BYTE* Buffer);</code> | ||
'''Description''' | |||
Encrypt data using RSA. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,688: | Line 4,028: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[in]Encrypt | <td>[in] Encrypt and decrypt using the key handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*Encrypt_Len</td> | ||
<td>[in] | <td>[in] Data length to be encrypted</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*Buffer</td> | <td>*Buffer</td> | ||
<td>[in/out]Input | <td>[in/out] Input plain text and output encrypted text</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,718: | Line 4,059: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_ENCRYPT_FAILED</td> | ||
<td> | <td>228</td> | ||
<td> | <td>Could not encrypt data</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,731: | Line 4,067: | ||
<br> | <br> | ||
=== | === RSA Decryption === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long | <code>long UniKey_RSA_Decrypt(WORD* pHandle, WORD* KeyIndex, DWORD* Decrypt_Len, BYTE* Buffer);</code> | ||
'''Description''' | |||
''' | Decrypt data using RSA. | ||
'''Parameters''' | |||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,750: | Line 4,085: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in]Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[in]Encrypt | <td>[in] Encrypt and decrypt using the key handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*Decrypt_Len</td> | ||
<td>[in] | <td>[in] Length of data to be decrypted</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*Buffer</td> | <td>*Buffer</td> | ||
<td>[in/out]Input encrypted text and output plain text.</td> | <td>[in/out] Input encrypted text and output plain text.</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,780: | Line 4,116: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_DECRYPT_FAILED</td> | ||
<td> | <td>229</td> | ||
<td> | <td>Could not decrypt data</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td> | <td>239</td> | ||
<td> | <td>The key handle is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,793: | Line 4,129: | ||
<br> | <br> | ||
=== DES | === DES Encryption === | ||
'''API Prototype''' | |||
<code> | |||
long UniKey_DES1_Encrypt(WORD* pHandle, WORD* EncryptMode, WORD* KeyIndex, DWORD* Len, BYTE* Buffer); | |||
long UniKey_DES2_Encrypt(WORD* pHandle, WORD* EncryptMode, WORD* KeyIndex, DWORD* Len, BYTE* Buffer); | |||
long UniKey_DES3_Encrypt(WORD* pHandle, WORD* EncryptMode, WORD* KeyIndex, DWORD* Len, BYTE* Buffer); | |||
</code> | |||
'''Description''' | |||
Encrypt data using DES. | Encrypt data using DES. | ||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,812: | Line 4,153: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | |||
<tr> | |||
<tr> | |||
<td>*EncryptMode</td> | |||
<td>[in] Block cipher mode of operation</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[in]Encrypt | <td>[in] Encrypt and decrypt using the key handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*Len</td> | <td>*Len</td> | ||
<td>[in] | <td>[in] Length of data to be encrypted</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*Buffer</td> | <td>*Buffer</td> | ||
<td>[in/out]Input | <td>[in/out] Input plain text and output encrypted text.</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,842: | Line 4,189: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_ENCRYPT_FAILED</td> | ||
<td> | <td>228</td> | ||
<td> | <td>Could not encrypt data</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td> | <td>239</td> | ||
<td> | <td>The key handle is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,855: | Line 4,202: | ||
<br> | <br> | ||
=== | === DES Decryption === | ||
'''API Prototype''' | |||
<code> | |||
long UniKey_DES1_Decrypt(WORD* pHandle, WORD* DecryptMode, WORD* KeyIndex, DWORD *Len, BYTE* Buffer); | |||
long UniKey_DES2_Decrypt(WORD* pHandle, WORD* DecryptMode, WORD* KeyIndex, DWORD *Len, BYTE* Buffer); | |||
long UniKey_DES3_Decrypt(WORD* pHandle, WORD* DecryptMode, WORD* KeyIndex, DWORD *Len, BYTE* Buffer); | |||
</code> | |||
''' | '''Description''' | ||
Encrypt data using DES. | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,871: | Line 4,227: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | |||
<tr> | |||
<tr> | |||
<td>*DecryptMode</td> | |||
<td>[in] Block cipher mode of operation</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[in] | <td>[in] Encrypt and decrypt using the key handle</td> | ||
</tr> | |||
<tr> | |||
<td>*Len</td> | |||
<td>[in] Length of data to be decrypted</td> | |||
</tr> | |||
<tr> | |||
<td>*Buffer</td> | |||
<td>[in/out] Input encrypted text and output plain text.</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th> | <th>Description</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 3,892: | Line 4,262: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_DECRYPT_FAILED</td> | ||
<td> | <td>229</td> | ||
<td> | <td>Could not decrypt data</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td></td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td></td> | <td>239</td> | ||
<td> | <td>The key handle is invalid</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,905: | Line 4,275: | ||
<br> | <br> | ||
=== Delete | === Delete RSA Key === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_RSA_Del_Key(WORD* pHandle, WORD* KeyIndex);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
Delete a RSA key. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,921: | Line 4,294: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*KeyIndex</td> | <td>*KeyIndex</td> | ||
<td>[in]The handle to be deleted</td> | <td>[in] The handle to be deleted</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th> | <th>Meaning</th> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
| Line 3,942: | Line 4,316: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td>239</td> | <td>239</td> | ||
<td>The key | <td>The handle of the key is invalid<br>0 > KeyIndex > 3</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 3,955: | Line 4,324: | ||
<br> | <br> | ||
=== | === Delete DES Key === | ||
'''API Prototype''' | |||
<code>long UniKey_DES_Del_Key(WORD* pHandle, WORD* KeyIndex);</code> | |||
''' | '''Description''' | ||
Delete a DES key. | |||
'''Parameters''' | '''Parameters''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 3,971: | Line 4,343: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>* | <td>*KeyIndex</td> | ||
<td>[in] | <td>[in] Key handle to be deleted</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 3,992: | Line 4,365: | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td> | <td>ERROR_UNIKEY_KEY_INDEX</td> | ||
<td>239</td> | <td>239</td> | ||
<td>The key | <td>The handle of the key is invalid<br>0 > KeyIndex > 14</td> | ||
</tr> | |||
</table> | |||
<br> | |||
=== Get User Counts === | |||
'''API Prototype''' | |||
<code>long UniKey_Get_UserCount(WORD* pHandle, WORD* Count);</code> | |||
'''Description''' | |||
UniKey Drive can enable 32 concurrent users to log in. This function can be called to get the number of users logged in. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Parameter</th> | |||
<th>Description</th> | |||
</tr> | |||
<tr> | |||
<td>*pHandle</td> | |||
<td>[in] Device handle</td> | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td></td> | <td>*Count </td> | ||
<td></td> | <td>[out] Number of users logged in</td> | ||
<td> | </tr> | ||
</table> | |||
'''Return values''' | |||
<table class="wikitable"> | |||
<tr> | |||
<th>Result</th> | |||
<th>Value</th> | |||
<th>Description</th> | |||
</tr> | |||
<tr> | |||
<td>SUCCESS</td> | |||
<td>0</td> | |||
<td>Success</td> | |||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 4,005: | Line 4,417: | ||
<br> | <br> | ||
=== Only | === Only Allow One User to Log in === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Logon_Single(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2, DWORD* pPassword3, DWORD* pPassword4);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
After calling this function, the UniKey Drive will only allow the active user to log in, other users will not be allowed to log in. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 4,021: | Line 4,436: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword1</td> | <td>*pPassword1</td> | ||
<td>[in]Password 1</td> | <td>[in] Password 1</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword2</td> | <td>*pPassword2</td> | ||
<td>[in]Password 2</td> | <td>[in] Password 2</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword3</td> | <td>*pPassword3</td> | ||
<td>[in]Password 3</td> | <td>[in] Password 3</td> | ||
</tr> | </tr> | ||
<tr> | <tr> | ||
<td>*pPassword4</td> | <td>*pPassword4</td> | ||
<td>[in]Password 4</td> | <td>[in] Password 4</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 4,056: | Line 4,472: | ||
<td>ERROR_UNIKEY_INVALID_PASSWORD_OR_ID</td> | <td>ERROR_UNIKEY_INVALID_PASSWORD_OR_ID</td> | ||
<td>202</td> | <td>202</td> | ||
<td> | <td>Wrong password or UniKey HID</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
| Line 4,062: | Line 4,478: | ||
<br> | <br> | ||
=== | === Log off the Active User === | ||
'''API Prototype''' | |||
<code>long UniKey_Logoff(WORD* pHandle);</code> | |||
'''Description''' | |||
After calling this function, the active user will be logged out, does not affect other users’ login status. | |||
''' | '''Parameters''' | ||
<table class="wikitable"> | |||
<table | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 4,078: | Line 4,497: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
| Line 4,098: | Line 4,518: | ||
<br> | <br> | ||
=== | === Log off all Users === | ||
'''API Prototype''' | '''API Prototype''' | ||
<code>long UniKey_Logoff_All(WORD* pHandle);</code> | |||
'''Parameters''' | '''Description''' | ||
<table | |||
After calling this function, all users will be logged off. | |||
'''Parameters''' | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th>Parameter</th> | <th>Parameter</th> | ||
| Line 4,114: | Line 4,537: | ||
<tr> | <tr> | ||
<td>*pHandle</td> | <td>*pHandle</td> | ||
<td>[in]Device handle</td> | <td>[in] Device handle</td> | ||
</tr> | </tr> | ||
</table> | </table> | ||
'''Return values''' | '''Return values''' | ||
<table | |||
<table class="wikitable"> | |||
<tr> | <tr> | ||
<th> | <th>Result</th> | ||
<th>Value</th> | <th>Value</th> | ||
<th>Description</th> | <th>Description</th> | ||
Latest revision as of 10:27, 2 August 2016
UniKey API Reference
A WORD is defined to be a 16-bit unsigned integer, while a DWORD is a 32-bit unsigned integer. These should be defined as types of that size regardless of platform.
Find a UniKey dongle
API Prototype
long UniKey_Find(WORD* pHandle, DWORD* pSetting1, DWORD* pSetting2);
Description
Check if a specific UniKey is attached to the USB port. This is the first API used to start a UniKey session.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [out] Dongle handle |
| *pSetting1 | [in] Working mode (UniKey PRO only), useless for UniKey STD |
| [out] Hardware ID | |
| *pSetting2 | [in] Access mode (UniKey PRO only), useless for UniKey STD |
| [out] Number of dongles attached, useless for UniKey STD |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NOT_FOUND | 200 | No UniKey dongle |
For UniKey PRO (Network UniKey), *pSetting specifies the working mode. If you do not specify the value in *lp1, the working mode will be read from the NetUniKey.ini.
Find the Next UniKey dongle
API Prototype
long UniKey_Find_Next(WORD* pHandle, DWORD* pSetting1, DWORD* pSetting2);
Description
Check if another UniKey is attached to the USB port.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [out] Dongle handle |
| *pSetting1 | [in] Working Mode (UniKey PRO only), useless for UniKey STD |
| [out] Hardware ID | |
| *pSetting2 | [in] Access Mode (UniKey PRO only), useless for UniKey STD |
| [out] Number of dongles attached , useless for UniKey STD |
Return values
| Result | Value | Meaning |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NOMORE | 214 | No more dongles found |
| ERROR_UNIKEY_NEED_FIND | 215 | Find needs to be called before Find_Next |
Log on to UniKey Dongle
API Prototype
long UniKey_User_Logon(WORD* pHandle, WORD* pPassword1, WORD* pPassword2);
For UniKey Drive, the API Prototype is
UniKey_User_Logon(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2);
Description
Log in to a UniKey dongle with specified passwords. This API should be called in the commercial software in order to improve security.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [out] Dongle handle |
| *pPassword1 | [in] Password 1 |
| *pPassword2 | [in] Password 2 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NOT_FOUND | 200 | No UniKey dongle |
| ERROR_UNIKEY_INVALID_PASSWORD | 201 | Found UniKey dongle, but basic passwords (password 1 and 2) are incorrect |
| ERROR_UNIKEY_INVALID_PASSWORD_OR_ID | 202 | Wrong password or UniKey HID |
Log on to UniKey Dongle in vendor mode
API Prototype
long UniKey_Vender_Logon(WORD* pHandle, WORD* pPassword1, WORD* pPassword2, WORD* pPassword3, WORD* pPassword4);
For UniKey Drive, the API Prototype is
UniKey_Vender_Logon(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2, DWORD* pPassword3, DWORD* pPassword4);
Description
Log in to a UniKey dongle in vendor mode with specified passwords. This API helps software vendors to log in to the UniKey dongle in vendor mode, and get full permissions to the UniKey dongle.
We do NOT advise you to enclose this API in the final released software. This API is only for software vendor’s usage.
If password 3 or 4 is wrong, while password 1 and 2 is correct, the dongle is then logged on in user mode automatically.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [out] Dongle handle |
| *pPassword1 | [in] Password 1 |
| *pPassword2 | [in] Password 2 |
| *pPassword3 | [in] Password 3 |
| *pPassword4 | [in] Password 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NOT_FOUND | 200 | No UniKey dongle |
| ERROR_UNIKEY_INVALID_PASSWORD | 201 | Found UniKey dongle, but basic passwords (password 1 and 2) are incorrect |
| ERROR_UNIKEY_INVALID_PASSWORD_OR_ID | 202 | Wrong password or UniKey HID |
Log off the UniKey dongle
API Prototype
long UniKey_Logoff(WORD* pHandle);
Description
Log off a UniKey dongle with a specific handle; this API should be called at the end of a UniKey session.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NOT_FOUND | 200 | No UniKey dongle |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
Get the UniKey Dongle's Type
API Prototype
long UniKey_Get_Type(WORD* pHandle, DWORD* type);
Description
UniKey_Get_Type can help you get the type of the UniKey dongle.
This functions return value will help to indicate the type of the UniKey dongle.
| Type | Code |
|---|---|
| UNIKEY_TYPE_TIME | 101 |
| UNIKEY_TYPE_PRO | 102 |
| UNIKEY_TYPE_STD | 103 |
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *type | [out] The value indicating the type of your UniKey dongle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_GET_TYPE | 256 | UniKey Get Type Error |
Read UniKey dongle memory
API Prototype
long UniKey_Read_Memory(WORD* pHandle, WORD* pStartAddress, WORD* pBufferLength, BYTE* pBuffer);
Description
Read the contents of memory; this API needs to be called after logging in to a UniKey dongle.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pStartAddress | [in] Offset of Memory |
| *pBufferLength | [in] Number of bytes to read |
| *pBuffer | [out] Pointer to the buffer containing the data to be read |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_READ_MEMORY | 207 | Read Error |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
Write to UniKey dongle memory
API Prototype
long UniKey_Write_Memory(WORD* pHandle, WORD* pStartAddress, WORD* pBufferLength, BYTE* pBuffer);
Description
Write data into memory; this API needs to be called after logging on to a UniKey dongle.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pStartAddress | [in] Offset of the memory |
| *pBufferLength | [in] Number of bytes to write |
| *pBuffer | [in] Pointer to the buffer containing the data to be written |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_WRITE_MEMORY | 207 | Write Error |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_VERIFY_ADV_PASSWORD | 223 | Advanced passwords (password 3 and 4) not verified |
To write the last 2k memory (for 2048 – 4096), you need to verify all 4 passwords (vendor mode) to obtain the requisite permission.
UniKey_Read_Memory and UniKey_Write_Memory provide basic reading and writing functions to the dongle. You can store general information via such functions. And various levels of security can be applied too.
Generate a Random Number
API Prototype
long UniKey_Random(WORD* pHandle, WORD* pReturn1, WORD* pReturn2, WORD* pReturn3, WORD* pReturn4);
Description
Generates random numbers from the dongle.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pReturn1 | [out] Random number |
| *pReturn2 | [out] Random number |
| *pReturn3 | [out] Random number |
| *pReturn4 | [out] Random number |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_RANDOM | 209 | Random number error |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
UniKey_Random is used to generate a random number inside the dongle. The UniKey dongle computation engine generates the number and the hardware of the dongle is the seed for the random number.
Generate Seed Code Return Values
API Prototype
long UniKey_Seed(WORD* pHandle, DWORD* pSeed, WORD* pReturn1, WORD* pReturn2, WORD* pReturn3, WORD* pReturn4);
Description
Get return codes from the input of a seed code; this API return for values which are related to pSeed and the UniKey dongle’s password.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pSeed | [in] Seed code |
| *pReturn1 | [out] Return code 1 |
| *pReturn2 | [out] Return code 2 |
| *pReturn3 | [out] Return code 3 |
| *pReturn4 | [out] Return code 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_SEED | 210 | Seed code error |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
UniKey_Seed generate a set of seed codes; all of these seed codes are based on the password. providing another method to verify passwords and check if a dongle has been inserted. Apart from this, the seed codes can be used in other computations, for example, you can use the seed returned as a 64-bit encryption key.
Write Software ID
API Prototype
long UniKey_Write_SoftID(WORD* pHandle, DWORD* pSoftID);
Description
Write the vendor-defined software ID.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pSoftID | [in] Software ID |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_SET_SOFTID | 203 | Set software ID error |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
You need to verify all 4 passwords (vendor mode) to write the software ID to the dongle.
Read Software ID
API Prototype
long UniKey_Read_SoftID(WORD* pHandle, DWORD* pSoftID);
Description
Read the user-defined software ID.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pSoftID | [out] Software ID |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
UniKey_Write_SoftID and UniKey_Read_SoftID provide a means to make a soft (write-able) ID for each software. You can write different software ID for each software and call UNIKEY_READ_SOFTID to check if the software ID is correct.
Set a UniKey License module
API Prototype
long UniKey_Set_Module(WORD* pHandle, WORD* pModule, WORD* pValue, WORD* pDecrease);
Description
To write a value to a specific UniKey license module and set the Decrement attribute.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] License module number |
| *pValue | [in] License module unit value |
| *pDecrease | [in] Decrement attribute (1 = allowed, 0 = not allowed) |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 202 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
A successful operation will result in license module unit number *pModule storing value *pValue, and the Decrement attribute set to "0" or "1".
You need to verify all 4 passwords (vendor mode) to set a module value successfully.
Get a UniKey License module
API Prototype
long UniKey_Get_Module(WORD* pHandle, WORD* pModule, WORD* pValue);
Description
Get a value from a specific UniKey license module.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] Module Number |
| *pValue | [out] Return the value in module |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 202 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
You need to verify 2 passwords (user mode) to get a module value successfully.
Check a UniKey License module
API Prototype
long UniKey_Check_Module(WORD* pHandle, WORD* pModule, WORD* pValue, WORD* pDecrease);
Description
Read the attributes of a specific UniKey license module.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] License module number |
| *pValue | [out] Validity (1 = license module value is not zero) |
| *pDecrease | [out] Decrement attribute (1 = license module can be decreased) |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 202 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
A successful operation will result in *pValue having value from Validity (1 = license module value is not zero), and *pDecrease having value from the Decrement attribute (1 = license module can be decreased). The value of a license module cannot be read directly, and it is invisible to end users.
UniKey_Set_Module and UniKey_Check_Module provide an easy way to implement software limitations. For example, if you want to set software to only be executed 3 times, you can call UniKey_Set_Module to set a license module (let us say license module 0) as 3. And, during each execution, we decrease the license module, if the license module is invalid (zero), we stop the software. Apart from this, we can implement a module-selling model with the help of license module functions. For example, the software has four function modules, A, B, C and D. And we can map the function modules to the license modules in the UniKey dongle. Let us say that function module A is mapped to license module 0, B to 1, C to 2 and D to 3. If a customer only buys function A and B, you only need to enable license module 0 and 1, and leave 2 and 3 as zero. So now only function module A and B can be executed. If the customer buys additional functions, you can use the UniKey Remote Updater tool to update the dongle as needed remotely.
Write Arithmetic
API Prototype
long UniKey_Write_Arithmetic(WORD* pHandle, WORD* pStartAddress, BYTE* pBuffer);
Description
Write user-defined mathematical algorithms.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pStartAddress | [in] Offset of first instruction |
| *pBuffer | [in] Pointer to the algorithm command string |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_AR_BAD_COMMAND | 217 | Arithmetic instruction error |
| ERROR_UNIKEY_AR_UNKNOWN_OPCODE | 218 | Arithmetic operator error |
| ERROR_UNIKEY_AR_WRONG_BEGIN | 219 | Constant numbers can't be used on first arithmetic instruction |
| ERROR_UNIKEY_AR_WRONG_END | 220 | Constant numbers can't be used on last arithmetic instruction |
| ERROR_UNIKEY_AR_VALUE_OVERFLOW | 221 | Constant numbers > 63 will cause an overflow |
A successful operation will result in a user-defined algorithm containing the algorithm command string from the buffer.
UniKey_Write_Arithmetic is called when you write a series of algorithms into the dongle. This function is only called on the software vendor side. For example, if you have a serial number generator algorithm, and you want to perform this algorithm inside the dongle, you need to call UniKey_Write_Arithmetic
User-Defined Algorithm Calculate 1
API Prototype
long UniKey_Calculate1(WORD* pHandle, DWORD* pStartAddress, DWORD* pModule, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);
Description
Return the results of a calculation performed in the UniKey, using input provided by the developer and the CALCULATE1 function.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pStartAddress | [in] Start point of calculation |
| *pModule | [in] License module number |
| *pRegA | [in, out] Register A |
| *pRegB | [in, out] Register B |
| *pRegC | [in, out] Register C |
| *pRegD | [in, out] Register D |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_AR_BAD_COMMAND | 217 | Arithmetic instruction error |
| ERROR_UNIKEY_AR_UNKNOWN_OPCODE | 218 | Arithmetic operator error |
| ERROR_UNIKEY_AR_WRONG_BEGIN | 219 | Constant numbers can't be used on first arithmetic instruction |
| ERROR_UNIKEY_AR_WRONG_END | 220 | Constant numbers can't be used on last arithmetic instruction |
| ERROR_UNIKEY_AR_VALUE_OVERFLOW | 221 | Constant numbers > 63 will cause an overflow |
When the calculation starts, the values of other internal registers are listed in the table below.
E and F is the bytewise reversed hardware ID. For example, if the hardware is 0x12345678 (in hex), then E will be 0x7856 and F will be 0x3412.
| Internal Register | Description |
|---|---|
| E | High-order byte of reversed hardware ID |
| F | Low-order byte of reversed hardware ID |
| G | Value stored in license module *pModule |
| H | Random number |
Examples:
If the internal algorithm is A = B + C, then the call result is *pRegA = *pRegB + *pRegC
The internal algorithm is A = A + G; if *pRegA = 0, then you may guess the result is the license module such that *pRegA = G = *pModule
Though you cannot read the content of modules directly, you can determine the content by an algorithm. If possible, it would be best to also check this content with an algorithm, and not only compare it in the program.
User-Defined Algorithm Calculate 2
API Prototype
long UniKey_Calculate2(WORD* pHandle, DWORD* pStartAddress, DWORD* pSeed, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);
Description
Return the results of a calculation performed in the UniKey, using input provided by the developer and the CALCULATE2 function.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pStartAddress | [in] Start point of calculation |
| *pSeed | [in] Seed code (32-bit) |
| *pRegA | [in, out] Register A |
| *pRegB | [in, out] Register B |
| *pRegC | [in, out] Register C |
| *pRegD | [in, out] Register D |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_AR_BAD_COMMAND | 217 | Arithmetic instruction error |
| ERROR_UNIKEY_AR_UNKNOWN_OPCODE | 218 | Arithmetic operator error |
| ERROR_UNIKEY_AR_WRON_GBEGIN | 219 | Constant numbers can't be used on first arithmetic instruction |
| ERROR_UNIKEY_AR_WRONG_END | 220 | Constant numbers can't be used on last arithmetic instruction |
| ERROR_UNIKEY_AR_VALUE_OVERFLOW | 221 | Constant numbers > 63 will cause an overflow |
When using calculate 2, the initial values of register E, F, G and H are the return values of seed code *pSeed, to make it simple, the UniKey calls function SEED with seed code *pSeed, and writes the return values to register E, F, G and H for the next operation.
| Internal Register | Description |
|---|---|
| E | Seed result 1 |
| F | Seed result 2 |
| G | Seed result 3 |
| H | Seed result 4 |
User-Defined Algorithm Calculate 3
API Prototype
long UniKey_Calculate3(WORD* pHandle, DWORD* pStartAddress, DWORD* pModule, WORD* pRegA, WORD* pRegB, WORD* pRegC, WORD* pRegD);
Description
Return results of a calculation performed in the UniKey, using input provided by the developer and the CALCULATE3 function.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pStartAddress | [in] Start point of calculation |
| *pModule | [in] License module number |
| *pRegA | [in, out] Register A |
| *pRegB | [in, out] Register B |
| *pRegC | [in, out] Register C |
| *pRegD | [in, out] Register D |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_AR_BAD_COMMAND | 217 | Arithmetic instruction error |
| ERROR_UNIKEY_AR_UNKNOWN_OPCODE | 218 | Arithmetic operator error |
| ERROR_UNIKEY_AR_WRON_GBEGIN | 219 | Constant numbers can't be used on first arithmetic instruction |
| ERROR_UNIKEY_AR_WRONG_END | 220 | Constant numbers can't be used on last arithmetic instruction |
| ERROR_UNIKEY_AR_VALUE_OVERFLOW | 221 | Constant numbers > 63 will cause an overflow |
When using calculate 3, the initial values of register E, F, G and H are the content of license module *lp2 and *lp2 + 1/2/3.
| Internal Register | Description |
|---|---|
| E | Value in license module *lp2 |
| F | Value in license module (*lp2 + 1) |
| G | Value in license module (*lp2 + 2) |
| H | Value in license module (*lp2 + 3) |
Examples:
When calling calculation 3 with *pModule = 0, the initial values of register E, F, G and H are:
E = value of license module 0
F = value of license module 1
G = value of license module 2
F = value of license module 3
Note: The address will return to "0" when the license module address call exceeds 128. For example: Calculation 3 with *pModule = 126, the initial values of register E, F, G and H are:
E = value of license module 126
F = value of license module 127
G = value of license module 0
H = value of license module 1
UniKey_Calculate is called when you want to perform the algorithm you have written inside the UniKey dongle. For example, you have written a formula into the dongle, you can call UniKey_Calculate to perform the algorithm and get the return value of the formula.
Decrease a License Module
API Prototype
long UniKey_Module_Decrease(WORD* pHandle, WORD* pModule);
Description
Decrease the value in a specified UniKey license module by "1".
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] License module number |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
Please call UniKey_Check_Module to check if the license module is valid first.
Generate a New Password
API Prototype
long UniKey_Generate_New_Password(WORD* pHandle, DWORD* pSeed, WORD* pPassword1, WORD* pPassword2, WORD* pPassword3, WORD* pPassword4);
Description
Generate a new password via a seed code; the mapping from the seed code to the password is a one-way function. Without the seed, you cannot generate the same password.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pSeed | [in] Seed code (32-bit) |
| *pPassword1 | [out] New password 1 |
| *pPassword2 | [out] New password 2 |
| *pPassword3 | [out] New password 3 |
| *pPassword4 | [out] New password 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_VERIFY_ADV_PASSWORD | 223 | Advanced passwords (passwords 3 and 4) not verified |
| ERROR_UNIKEY_GENERATE_NEW_PASSWORD | 225 | Error generating new password |
A file recording the new seed and passwords will be created in the working path, helping the software vendor to record everything. The passwords can be distributed to ordinary developers!
- The dongle will automatically log off after a new set of passwords have been generated.
- The dongle will be fully formatted when a new password is generated.
- A file including the new passwords and seed will be created in the working directory.
Generate a New Encryption Key
API Prototype
long UniKey_Generate_Key(WORD* pHandle, DWORD* pKeyNumber);
Description
Generate a new key in the specific key storage.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pKeyNumber | [in] Key storage number |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_INVALID_KEY_STORE | 224 | Wrong key storage number |
- This function will delete the original key in the key storage, and generate a new key.
- The data encrypted by the old key cannot be decrypted by the new key.
- Each key is 128-bits long.
Generate a New Encryption Key via Seed
API Prototype
long UniKey_Generate_Key_Via_Seed(WORD* pHandle, DWORD* pKeyNumber, WORD pSeed1, WORD pSeed2, WORD pSeed3, WORD pSeed4);
Description
Generate a new key in the specific key storage via a seed.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pKeyNumber | [in] Key storage number |
| *pSeed1 | [in] Seed 1 |
| *pSeed2 | [in] Seed 2 |
| *pSeed3 | [in] Seed 3 |
| *pSeed4 | [in] Seed 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_INVALID_KEY_STORE | 224 | Wrong key storage number |
- This function will delete the original key in the key storage, and generate a new key via seed.
- The data encrypted by the old key cannot be decrypted by the new key.
- Each key is 128-bit long.
Encrypt the Buffer with a Specific Encryption Key
API Prototype
long UniKey_Encrypt(WORD* pHandle, DWORD* pBufferLength, DWORD* pKeyNumber, BYTE* pBuffer);
Description
Encrypt an amount of memory with a key. The length of data must be a multiple of 8.
Parameters
| Parameter | Meaning |
|---|---|
| *pHandle | [in] Dongle handle |
| *pBufferLength | [in] Number of bytes to encrypt |
| *pKeyNumber | [in] Key storage number |
| *pBuffer | [in] Pointer to the data to be encrypted |
| [out] Pointer to the encrypted data |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_INVALID_KEY_STORE | 224 | Wrong key storage number |
| ERROR_UNIKEY_ENCRYPT_FAILED | 228 | Could not encrypt data |
This function only performs an encryption operation, no compression functions are involved.
Decrypt the Buffer with a Specific Encryption Key
API Prototype
long UniKey_Decrypt(WORD* pHandle, DWORD* pBufferLength, DWORD* pKeyNumber, BYTE* pBuffer);
Description
Encrypt an amount of memory with a key. The length of data must be a multiple of 8.
Parameters
| Parameter | Meaning |
|---|---|
| *pHandle | [in] Dongle handle |
| *pBufferLength | [in] Number of bytes to encrypt |
| *pKeyNumber | [in] Key storage number |
| *pBuffer | [in] Pointer to the data to be decrypted |
| [out] Pointer to the decrypted data |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_INVALID_KEY_STORE | 224 | Wrong key storage number |
| ERROR_UNIKEY_DECRYPT_FAILED | 229 | Could not decrypt data |
Please use the key that was used to encrypt the data to decrypt the data, otherwise you cannot properly decrypt the data.
UniKey_Encrypt and UniKey_Decrypt offer a basic 128-bit encryption/decryption operation based on UniKey’s hardware. You can call these functions when an encryption or decryption operation is needed. For better security, you can encrypt a credential before saving it into the UniKey’s memory.
Make an MD5 Digest for Certain Content
API Prototype
long UniKey_MD5(WORD* pHandle, DWORD* pBufferLength, DWORD* pType, BYTE* pBuffer);
Description
Make an MD5 digest of content or data.
Parameters
| Parameter | Meaning |
|---|---|
| *pHandle | [in] Dongle handle |
| *pBufferLength | [in] Number of bytes to MD5 |
| *pBuffer | [in] Pointer to the data to be digested |
| [out] Pointer to the digested data |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
Read UpdateTag
API Prototype
long UniKey_Read_UpdateTag(WORD* pHandle, DWORD* pUpdateTag);
Description
Read UpdateTag from a specific dongle
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pUpdateTag | [out] UpdateTag |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_READ_UPDATETAG | 226 | Read UpdateTag error |
Write UpdateTag
API Prototype
long UniKey_Write_UpdateTag(WORD* pHandle, DWORD* pUpdateTag);
Description
Write UpdateTag into a specific dongle.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pUpdateTag | [in] UpdateTag |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_UPDATETAG | 227 | Write UpdateTag error |
UniKey_Read_UpdateTag APIs give software vendors an easy method to identify if the UniKey dongle needs to be updated. When distributing software, software vendors may use the UpdateTag as an ID which shows if the dongle needs to be updated or has been updated. You can also use this tag as a tracking ID for each update.
Get UniKey Library Version
API Prototype
long UniKey_Get_Version(WORD* pHandle, DWORD* pVersion);
Description
Get the current UniKey library version.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pVersion | [out] UniKey library version |
Lock a UniKey Dongle
API Prototype
long UniKey_Lock(WORD *pHandle)
Description
Create a mutex to lock the UniKey dongle.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_ALREADY_LOCKED | 236 | Dongle already locked (when attempting to lock twice, or open after locking a dongle) |
Unlock a UniKey Dongle
API Prototype
long UniKey_UnLock(WORD *pHandle)
Description
Free the mutex to unlock the UniKey dongle.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [out] Dongle handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
UniKey Time API Reference
Get UniKey Time
API Prototype
long UniKey_Get_Time(WORD* pHandle, DWORD* pYear, DWORD* pMonth, WORD* pDay, WORD* pHour, WORD* pMinute, WORD* pSecond);
Description
Get the time from the UniKey Time’s real-time clock.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pYear | [out] Year (input or output is 10, which refers to 2010) |
| *pMonth | [out] Month |
| *pDay | [out] Day |
| *pHour | [out] Hour |
| *pMinute | [out] Minute |
| *pSecond | [out] Second |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_READ_TIME | 230 | Get UniKey time error |
Calling UniKey_Check_Time can check if the dongle is a UniKey Time model. If ERROR_UNIKEY_READ_TIME is returned, then the dongle is not a UniKey Time.
Set UniKey Time
API Prototype
long UniKey_Set_Time(WORD* pHandle, DWORD* pYear, DWORD* pMonth, WORD* pDay, WORD* pHour, WORD* pMinute, WORD* pSecond);
Description
Set the time on the UniKey Time’s clock.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pYear | [in] Year (input or output is 10, which refers to 2010) |
| *pMonth | [in] Month |
| *pDay | [in] Day |
| *pHour | [in] Hour |
| *pMinute | [in] Minute |
| *pSecond | [in] Second |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_READ_TIME | 230 | Get UniKey time error |
You need to verify all 4 passwords (vendor mode) to set the time of the UniKey Time's internal clock.
Set UniKey Time by Host’s Clock
API Prototype
long UniKey_Set_Time_Now(WORD* pHandle);
Description
Set the time of the UniKey Time’s real-time clock to the host computer’s clock.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME | 231 | Set UniKey time error |
Erase Real Time Module
API Prototype
long UniKey_Erase_Time_Module(WORD* pHandle, DWORD* pModule);
Description
Erase/Reset a real-time module, and all the information in the module will be erased including start, and end or duration.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] Real-time module number (0-15) |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME | 231 | Set UniKey time error |
You need to verify all 4 passwords (vendor mode) to reset a module. If a real-time module’s write-once flag is enabled, only the first START_TIME call works. Successive START_TIME calls will return an error until this module is reset.
Set a Real Time Module’s Start Time
API Prototype
long UniKey_Set_Time_Module_Start_Time(WORD* pHandle, DWORD* pModule, WORD* pYear, WORD* pMonth, WORD* pDay, WORD* pHour);
Description
Set a real-time module’s start time.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] Real-time module number (0-15) |
| *pYear | [in] Year (input or output is 10, which refers to 2010) |
| *pMonth | [in] Month |
| *pDay | [in] Day |
| *pHour | [in] Hour |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME_MODULE | 231 | Set UniKey time error |
| ERROR_UNIKEY_TIME_MODULE_NOT_NULL | 234 | The real-time module is not null, this error is returned when the 'write once' flag is set |
The write-once flag is very useful for setting the start for a real-time module. If the write-once flag is set, only the first START_TIME call can set the start time for a module; all successive START_TIME calls will not work and return an ERROR_UNIKEY_TIME_MODULE_NOT_NULL. Software vendors may use this flag when the start for a module is not clear.
Set a Real Time Module’s Start Time by the UniKey's Internal Clock
API Prototype
long UniKey_Set_Time_Module_Start_Time_Now(WORD* pHandle, DWORD* pModule);
Description
Set a real-time module’s start time as the current time in the UniKey's internal clock.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] Real-time module number (0-15) |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME_MODULE | 231 | Set UniKey time error |
| ERROR_UNIKEY_TIME_MODULE_NOT_NULL | 234 | The real-time module is not null, this error is returned when the 'write once' flag is set |
Set a Real Time Module’s Start Time by Host’s Clock
API Prototype
long UniKey_Set_Time_Module_Start_Time_Now_PC(WORD* pHandle, DWORD* pModule);
Description
Set a real time module’s start time as the current time of the host computer.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] Real-time module number (0-15) |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME_MODULE | 231 | Set UniKey time error |
| ERROR_UNIKEY_TIME_MODULE_NOT_NULL | 234 | The real-time module is not null, this error is returned when the 'write once' flag is set |
Set a Real Time Module’s End Time
API Prototype
long UniKey_Set_Time_Module_End_Time(WORD* pHandle, DWORD* pModule, WORD* pYear, WORD* pMonth, WORD* pDay, WORD* pHour);
Description
Set a real-time module’s end time.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pHandle | [in] Real-time module number (0-15) |
| *pYear | [in] Year (input or output is 10, which refers to 2010) |
| *pMonth | [in] Month |
| *pDay | [in] Day |
| *pHour | [in] Hour |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME_MODULE | 231 | Set UniKey time error |
Set a Real Time Module’s Duration
API Prototype
long UniKey_Set_Time_Module_Duration(WORD* pHandle, DWORD* pModule, DWORD* pDay, WORD* pHour);
Description
Set the duration for a specific real-time module. The total duration is (*pDay) * 24 + (*pHour) in hours.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] Real-time module number (0-15) |
| *pDay | [in] Number of days |
| *pHour | [in] Number of hours |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_WRITE_TIME_MODULE | 231 | Set UniKey time error |
You need to verify all 4 passwords (vendor mode) to set the duration for a real-time module.
Check a UniKey Time License module
API Prototype
long UniKey_Check_Time_Module(WORD* pHandle, DWORD* pModule, DWORD* pRemainDays, WORD* pYear, WORD* pMonth, WORD* pDay, WORD* pHour);
Description
Read the attributes of a specific UniKey Time license module.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] License module Number |
| *pRemainDays | [out] Days remaining |
| *pYear | [in] Year (input or output is 10, which refers to 2010) |
| *pMonth | [in] Month |
| *pDay | [in] Day |
| *pHour | [in] Hour |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
A successful operation will result in *pValue having value from the validity of a license module (1 = license module value is not zero).
The value of a license module cannot be read out directly and it is invisible to end users.
Check a UniKey Time License Module Now
API Prototype
long UniKey_Check_Time_Module_Now(WORD* pHandle, DWORD* pModule, DWORD* pRemainDays, WORD* pRemainHours);
Description
Read the attributes of a specific UniKey Time license module Now.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] License module number |
| *pRemainDays | [out] Days remaining |
| *pRemainHours | [out] Hours remaining |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
A successful operation will result in *pValue having value from the validity (1 = license module value is not zero).
The value of a license module cannot be read out directly and it is invisible to end users.
Check a UniKey Time License Module Now PC
API Prototype
long UniKey_Check_Time_Module_Now_PC(WORD* pHandle, DWORD* pModule, DWORD* pRemainDays, WORD* pRemainHours);
Description
Read the attributes of a specific UniKey Time license module Now PC.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Dongle handle |
| *pModule | [in] License module number |
| *pRemainDays | [out] Days remaining |
| *pRemainHours | [out] Hours remaining |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_ADDR_OR_SIZE | 204 | Read/Write address is incorrect or invalid length |
| ERROR_UNIKEY_NEED_OPEN | 212 | Need to log on to a dongle before running |
| ERROR_UNIKEY_MODULE | 216 | License module error |
A successful operation will result in *pValue having value from the validity (1 = license module value is not zero).
The value of a license module cannot be read out directly and it is invisible to end users.
UniKey Drive API Reference
Initialize File System
API Prototype
long UniKey_FS_Init(WORD* pHandle, DWORD* PW1, DWORD* PW2, DWORD* PW3, DWORD* PW4);
Description
The user needs to call this function to initialize the file system before calling other file system related functions. The default password of the file system is "12345678", without quotations.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *PW1 | [in] Password 1 |
| *PW2 | [in] Password 2 |
| *PW3 | [in] Password 3 |
| *PW4 | [in] Password 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_PASSWORD_OR_ID | 202 | Wrong password or UniKey HID |
Format the File System
API Prototype
long UniKey_FS_Format(WORD* pHandle);
Description
Format the file system.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_FILE_EXIST | 245 | File already exists |
Note: The user needs to initialize the file system successfully before calling other file system related functions.
Create Files
API Prototype
long UniKey_FS_CreateFile(WORD* pHandle, BYTE* filename);
Description
Create files.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *filename | [in/out] Input/Output file name |
Note: a single backslash ("\") should be added before the name of the file.
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_FILE_NAME | 240 | Wrong or invalid filename |
| ERROR_UNIKEY_FS_FILE_EXIST | 245 | File already exists |
| ERROR_UNIKEY_FS_ERR_SYS_UNINIT | 246 | The file system is not initialized |
Delete Files
API Prototype
long UniKey_FS_DeleteFile(WORD* pHandle, BYTE* filename);
Description
Delete files.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *filename | [in/out] Input/Output file name |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_NO_FILE | 241 | No such filename |
| ERROR_UNIKEY_FS_ERR_SYS_UNINIT | 246 | The file system is not initialized |
Open Files
API Prototype
long UniKey_FS_File_Open(WORD* pHandle, BYTE* filename);
Description
Open files.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *filename | [in] Input/Output file name |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_NO_FILE | 241 | No such filename |
Get System Space
API Prototype
long UniKey_FS_Get_Free_Size(WORD* pHandle, DWORD* usedsize, DWORD* freesize);
Description
Get occupied and free system space.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *usedsize | [out] System memory that is in use |
| *freesize | [out] Free system memory |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
Modify File Data
API Prototype
long UniKey_FS_File_Modify_Data(WORD* pHandle, DWORD* offset, DWORD* len, BYTE* buffer);
Description
Modify file data.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *offset | [in] Address to be modified |
| *len | [in] Length of data to be modified |
| *buffer | [in] Modified data |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_FILE_OFFSET | 242 | File offset error |
| ERROR_UNIKEY_FS_ERR_OPEN_FILE | 247 | Failed to open file |
Append Data to the End-Of-File
API Prototype
long UniKey_FS_File_Append_Data(WORD* pHandle, DWORD* len, BYTE* buffer);
Description
Append data to the end-of-file.
Parameters
| Parameter | Meaning |
|---|---|
| *pHandle | [in] Device handle |
| *len | [in] The length of the data to be appended |
| *buffer | [in] Data to append |
Return values
| Result | Value | Meaning |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_NO_MEMORY | 244 | Not enough free memory |
Read File Data
API Prototype
long UniKey_FS_File_Read_Data(WORD* pHandle, DWORD* offset, DWORD* len, BYTE* buffer);
Description
Read file data.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *offset | [in] Read address |
| *len | [in] Length of data to be read |
| *buffer | [out] Read data |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_FS_FILE_OFFSET | 242 | File offset error |
| ERROR_UNIKEY_FS_ERR_OPEN_FILE | 247 | Failed to open file |
Close Files
API Prototype
long UniKey_FS_File_Close(WORD* pHandle, BYTE* filename);
Description
Close files.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *filename | [in] Filename |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
Get File List
API Prototype
long UniKey_FS_File_Get_List(WORD* pHandle, DWORD* filecount, BYTE* filelist);
Description
Get list of files on the UniKey Drive.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *filecount | [out] The number of files |
| *filelist | [out] File list |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
Get File Size
API Prototype
long UniKey_FS_File_Get_Size(WORD* pHandle, DWORD* filesize);
Description
Get the file size.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *filesize | [out] The size of the file |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
User Reset File System Password
API Prototype
long UniKey_FS_Set_Password(WORD* pHandle, DWORD* PW1, DWORD* PW2, DWORD* PW3, DWORD* PW4);
Description
Allows a user to reset the file system password.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *PW1 | [in] Password 1 |
| *PW2 | [in] Password 2 |
| *PW3 | [in] Password 3 |
| *PW4 | [in] Password 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_GENERATE_NEW_PASSWORD | 225 | Error generating new password |
A password reset can only be successfully done after initializing the file system.
Generate RSA Key
API Prototype
long UniKey_RSA_Generate_Key(WORD* pHandle, WORD* KeyIndex);
Description
UniKey Drive has encryption and decryption modules with 1024-bit RSA keys. Calling this function can generate a 1024-bit RSA key.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [out] Return the handle generated key |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_KEY_INDEX | 239 | The handle of the key is invalid |
Generate a DES Key
API Prototype
long UniKey_DES_Generate_Key(WORD* pHandle, DWORD* KeyIndex);
Description
Calling this function can generate a DES key.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [out] Return the handle generated key |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_KEY_INDEX | 239 | The handle of the key is invalid |
RSA Get Number of Generated Keys
API Prototype
long UniKey_RSA_Get_Key_Counts(WORD* pHandle, DWORD* KeyIndexs);
Description
Get the number of RSA keys that are generated.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [out] Key count |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_KEY_INDEX | 239 | The handle of the key is invalid |
DES Get Number of Generated Keys
API Prototype
long UniKey_DES_Get_Key_Counts(WORD* pHandle, DWORD* KeyIndexs);
Description
Get the number of DES keys that are generated.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [out] Key count |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_KEY_INDEX | 239 | The handle of the key is invalid |
RSA Encryption
API Prototype
long UniKey_RSA_Encrypt(WORD* pHandle, WORD* KeyIndex, DWORD* Encrypt_Len, BYTE* Buffer);
Description
Encrypt data using RSA.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [in] Encrypt and decrypt using the key handle |
| *Encrypt_Len | [in] Data length to be encrypted |
| *Buffer | [in/out] Input plain text and output encrypted text |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_ENCRYPT_FAILED | 228 | Could not encrypt data |
RSA Decryption
API Prototype
long UniKey_RSA_Decrypt(WORD* pHandle, WORD* KeyIndex, DWORD* Decrypt_Len, BYTE* Buffer);
Description
Decrypt data using RSA.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in]Device handle |
| *KeyIndex | [in] Encrypt and decrypt using the key handle |
| *Decrypt_Len | [in] Length of data to be decrypted |
| *Buffer | [in/out] Input encrypted text and output plain text. |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_DECRYPT_FAILED | 229 | Could not decrypt data |
| ERROR_UNIKEY_KEY_INDEX | 239 | The key handle is invalid |
DES Encryption
API Prototype
long UniKey_DES1_Encrypt(WORD* pHandle, WORD* EncryptMode, WORD* KeyIndex, DWORD* Len, BYTE* Buffer);
long UniKey_DES2_Encrypt(WORD* pHandle, WORD* EncryptMode, WORD* KeyIndex, DWORD* Len, BYTE* Buffer);
long UniKey_DES3_Encrypt(WORD* pHandle, WORD* EncryptMode, WORD* KeyIndex, DWORD* Len, BYTE* Buffer);
Description
Encrypt data using DES.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *EncryptMode | [in] Block cipher mode of operation |
| *KeyIndex | [in] Encrypt and decrypt using the key handle |
| *Len | [in] Length of data to be encrypted |
| *Buffer | [in/out] Input plain text and output encrypted text. |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_ENCRYPT_FAILED | 228 | Could not encrypt data |
| ERROR_UNIKEY_KEY_INDEX | 239 | The key handle is invalid |
DES Decryption
API Prototype
long UniKey_DES1_Decrypt(WORD* pHandle, WORD* DecryptMode, WORD* KeyIndex, DWORD *Len, BYTE* Buffer);
long UniKey_DES2_Decrypt(WORD* pHandle, WORD* DecryptMode, WORD* KeyIndex, DWORD *Len, BYTE* Buffer);
long UniKey_DES3_Decrypt(WORD* pHandle, WORD* DecryptMode, WORD* KeyIndex, DWORD *Len, BYTE* Buffer);
Description
Encrypt data using DES.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *DecryptMode | [in] Block cipher mode of operation |
| *KeyIndex | [in] Encrypt and decrypt using the key handle |
| *Len | [in] Length of data to be decrypted |
| *Buffer | [in/out] Input encrypted text and output plain text. |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_DECRYPT_FAILED | 229 | Could not decrypt data |
| ERROR_UNIKEY_KEY_INDEX | 239 | The key handle is invalid |
Delete RSA Key
API Prototype
long UniKey_RSA_Del_Key(WORD* pHandle, WORD* KeyIndex);
Description
Delete a RSA key.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [in] The handle to be deleted |
Return values
| Result | Value | Meaning |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_KEY_INDEX | 239 | The handle of the key is invalid 0 > KeyIndex > 3 |
Delete DES Key
API Prototype
long UniKey_DES_Del_Key(WORD* pHandle, WORD* KeyIndex);
Description
Delete a DES key.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *KeyIndex | [in] Key handle to be deleted |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_KEY_INDEX | 239 | The handle of the key is invalid 0 > KeyIndex > 14 |
Get User Counts
API Prototype
long UniKey_Get_UserCount(WORD* pHandle, WORD* Count);
Description
UniKey Drive can enable 32 concurrent users to log in. This function can be called to get the number of users logged in.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *Count | [out] Number of users logged in |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
Only Allow One User to Log in
API Prototype
long UniKey_Logon_Single(WORD* pHandle, DWORD* pPassword1, DWORD* pPassword2, DWORD* pPassword3, DWORD* pPassword4);
Description
After calling this function, the UniKey Drive will only allow the active user to log in, other users will not be allowed to log in.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
| *pPassword1 | [in] Password 1 |
| *pPassword2 | [in] Password 2 |
| *pPassword3 | [in] Password 3 |
| *pPassword4 | [in] Password 4 |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
| ERROR_UNIKEY_INVALID_PASSWORD_OR_ID | 202 | Wrong password or UniKey HID |
Log off the Active User
API Prototype
long UniKey_Logoff(WORD* pHandle);
Description
After calling this function, the active user will be logged out, does not affect other users’ login status.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |
Log off all Users
API Prototype
long UniKey_Logoff_All(WORD* pHandle);
Description
After calling this function, all users will be logged off.
Parameters
| Parameter | Description |
|---|---|
| *pHandle | [in] Device handle |
Return values
| Result | Value | Description |
|---|---|---|
| SUCCESS | 0 | Success |