gitee.com/lh-her-team/common@v1.5.1/crypto/sdf/base/base.go (about) 1 package base 2 3 /* 4 #cgo windows CFLAGS: -DPACKED_STRUCTURES 5 #cgo linux LDFLAGS: -ldl 6 #cgo darwin LDFLAGS: -ldl 7 #include <stdlib.h> 8 #include <stdio.h> 9 #include <string.h> 10 #include <unistd.h> 11 #include <sdf.h> //GM-T0018 sdf header 12 13 14 typedef unsigned char SGD_UCHAR; 15 typedef unsigned char* SGD_UCHAR_PRT; 16 17 #ifdef _WIN32 18 #include<windows.h> 19 20 struct LibHandle { 21 HMODULE handle; 22 }; 23 24 struct LibHandle *NewLib(const char *iLibrary) 25 { 26 struct LibHandle *h = calloc(1,sizeof(struct LibHandle)); 27 h->handle = LoadLibrary(iLibrary); 28 if (h->handle == NULL) { 29 free(h); 30 return NULL; 31 } 32 return h; 33 } 34 35 void DestroyLib(struct LibHandle *h) 36 { 37 if(!h){ 38 return ; 39 } 40 if (h->handle == NULL) { 41 return; 42 } 43 free(h); 44 } 45 #else 46 #include <dlfcn.h> 47 48 struct LibHandle { 49 void *handle; 50 }; 51 52 struct LibHandle *NewLib(const char *iLibrary) 53 { 54 struct LibHandle *h = calloc(1,sizeof(struct LibHandle)); 55 h->handle = dlopen(iLibrary,1); 56 if(h->handle == NULL){ 57 free(h); 58 return NULL; 59 } 60 return h; 61 } 62 63 64 void DestroyLib(struct LibHandle *h) 65 { 66 if (!h) { 67 return; 68 } 69 if (h->handle == NULL) { 70 return; 71 } 72 if (dlclose(h->handle) < 0) { 73 return; 74 } 75 free(h); 76 } 77 #endif 78 79 //1. 打开设备 80 SGD_RV SDFOpenDevice(struct LibHandle * h,SGD_HANDLE *phDeviceHandle) 81 { 82 typedef SGD_RV (*FPTR)(SGD_HANDLE*); 83 #ifdef _WIN32 84 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_OpenDevice"); 85 return (*fptr)(phDeviceHandle); 86 #else 87 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_OpenDevice"); 88 return (*fptr)(phDeviceHandle); 89 #endif 90 } 91 //2. 关闭设备 92 SGD_RV SDFCloseDevice(struct LibHandle * h,SGD_HANDLE hDeviceHandle) 93 { 94 typedef SGD_RV (*FPTR)(SGD_HANDLE); 95 #ifdef _WIN32 96 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_CloseDevice"); 97 return (*fptr)(hDeviceHandle); 98 #else 99 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_CloseDevice"); 100 return (*fptr)(hDeviceHandle); 101 #endif 102 } 103 //3. 创建会话 104 SGD_RV SDFOpenSession(struct LibHandle * h,SGD_HANDLE hDeviceHandle, SGD_HANDLE *phSessionHandle) 105 { 106 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_HANDLE *); 107 #ifdef _WIN32 108 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_OpenSession"); 109 return (*fptr)(hDeviceHandle,phSessionHandle); 110 #else 111 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_OpenSession"); 112 return (*fptr)(hDeviceHandle,phSessionHandle); 113 #endif 114 } 115 //4. 关闭会话 116 SGD_RV SDFCloseSession(struct LibHandle * h,SGD_HANDLE hSessionHandle) 117 { 118 typedef SGD_RV (*FPTR)(SGD_HANDLE); 119 #ifdef _WIN32 120 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_CloseSession"); 121 return (*fptr)(hSessionHandle); 122 #else 123 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_CloseSession"); 124 return (*fptr)(hSessionHandle); 125 #endif 126 } 127 //5. 获取设备信息 128 SGD_RV SDFGetDeviceInfo(struct LibHandle * h,SGD_HANDLE hSessionHandle, DEVICEINFO *pstDeviceInfo) 129 { 130 typedef SGD_RV (*FPTR)(SGD_HANDLE,DEVICEINFO *); 131 #ifdef _WIN32 132 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GetDeviceInfo"); 133 return (*fptr)(hSessionHandle,pstDeviceInfo); 134 #else 135 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GetDeviceInfo"); 136 return (*fptr)(hSessionHandle,pstDeviceInfo); 137 #endif 138 } 139 //6. 产生随机数 140 SGD_RV SDFGenerateRandom(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiLength, SGD_UCHAR_PRT *pucRandom) 141 { 142 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UCHAR*); 143 *pucRandom = calloc(uiLength, sizeof(SGD_UCHAR)); 144 if (*pucRandom == NULL) { 145 return SGD_FALSE; 146 } 147 #ifdef _WIN32 148 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateRandom"); 149 return (*fptr)(hSessionHandle,uiLength,*pucRandom); 150 #else 151 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateRandom"); 152 return (*fptr)(hSessionHandle,uiLength,*pucRandom); 153 #endif 154 } 155 //7. 获取私钥使用权限 156 SGD_RV SDFGetPrivateKeyAccessRight(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,SGD_UCHAR_PRT pucPassword, SGD_UINT32 uiPwdLength) 157 { 158 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UCHAR*,SGD_UINT32); 159 #ifdef _WIN32 160 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GetPrivateKeyAccessRight"); 161 return (*fptr)(hSessionHandle,uiKeyIndex,pucPassword,uiPwdLength); 162 #else 163 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GetPrivateKeyAccessRight"); 164 return (*fptr)(hSessionHandle,uiKeyIndex,pucPassword,uiPwdLength); 165 #endif 166 } 167 //8. 释放私钥使用权限 168 SGD_RV SDFReleasePrivateKeyAccessRight(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex) 169 { 170 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32); 171 #ifdef _WIN32 172 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ReleasePrivateKeyAccessRight"); 173 return (*fptr)(hSessionHandle,uiKeyIndex); 174 #else 175 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ReleasePrivateKeyAccessRight"); 176 return (*fptr)(hSessionHandle,uiKeyIndex); 177 #endif 178 } 179 //9. 导出RSA签名公钥 180 SGD_RV SDFExportSignPublicKey_RSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,RSArefPublicKey *pucPublicKey) 181 { 182 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,RSArefPublicKey*); 183 #ifdef _WIN32 184 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExportSignPublicKey_RSA"); 185 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 186 #else 187 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExportSignPublicKey_RSA"); 188 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 189 #endif 190 } 191 //10. 导出RSA加密公钥 192 SGD_RV SDFExportEncPublicKey_RSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,RSArefPublicKey *pucPublicKey) 193 { 194 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,RSArefPublicKey*); 195 #ifdef _WIN32 196 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExportEncPublicKey_RSA"); 197 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 198 #else 199 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExportEncPublicKey_RSA"); 200 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 201 #endif 202 } 203 //11. 产生RSA非对称密钥对并输出 204 SGD_RV SDFGenerateKeyPair_RSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyBits,RSArefPublicKey *pucPublicKey,RSArefPrivateKey *pucPrivateKey) 205 { 206 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,RSArefPublicKey*,RSArefPrivateKey*); 207 #ifdef _WIN32 208 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyPair_RSA"); 209 return (*fptr)(hSessionHandle,uiKeyBits,pucPublicKey,pucPrivateKey); 210 #else 211 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyPair_RSA"); 212 return (*fptr)(hSessionHandle,uiKeyBits,pucPublicKey,pucPrivateKey); 213 #endif 214 } 215 //12. 生成会话密钥并用内部RSA公钥加密输出 216 SGD_RV SDFGenerateKeyWithIPK_RSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiIPKIndex,SGD_UINT32 uiKeyBits,SGD_UCHAR_PRT *pucKey,SGD_UINT32 *puiKeyLength,SGD_HANDLE *phKeyHandle) 217 { 218 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UINT32,SGD_UCHAR*,SGD_UINT32*,SGD_HANDLE*); 219 *pucKey = calloc(*puiKeyLength, sizeof(SGD_UCHAR)); 220 if (*pucKey == NULL) { 221 return SGD_FALSE; 222 } 223 #ifdef _WIN32 224 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyWithIPK_RSA"); 225 return (*fptr)(hSessionHandle,uiIPKIndex,uiKeyBits,*pucKey,puiKeyLength,phKeyHandle); 226 #else 227 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyWithIPK_RSA"); 228 return (*fptr)(hSessionHandle,uiIPKIndex,uiKeyBits,*pucKey,puiKeyLength,phKeyHandle); 229 #endif 230 } 231 //13. 生成会话密钥并用外部RSA公钥加密输出 232 SGD_RV SDFGenerateKeyWithEPK_RSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyBits,RSArefPublicKey *pucPublicKey,SGD_UCHAR_PRT *pucKey,SGD_UINT32 *puiKeyLength,SGD_HANDLE *phKeyHandle) 233 { 234 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,RSArefPublicKey*,SGD_UCHAR*,SGD_UINT32*,SGD_HANDLE*); 235 *pucKey = calloc(*puiKeyLength, sizeof(SGD_UCHAR)); 236 if (*pucKey == NULL) { 237 return SGD_FALSE; 238 } 239 #ifdef _WIN32 240 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyWithEPK_RSA"); 241 return (*fptr)(hSessionHandle,uiKeyBits,pucPublicKey,*pucKey,puiKeyLength,phKeyHandle); 242 #else 243 FPTR fptr = (FPTR)dlsym(h->handle,"SDF_GenerateKeyWithEPK_RSA"); 244 return (*fptr)(hSessionHandle,uiKeyBits,pucPublicKey,*pucKey,puiKeyLength,phKeyHandle); 245 #endif 246 } 247 //14. 导入会话密钥并用内部RSA私钥解密 248 SGD_RV SDFImportKeyWithISK_RSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiISKIndex,SGD_UCHAR_PRT pucKey,SGD_UINT32 uiKeyLength,SGD_HANDLE *phKeyHandle) 249 { 250 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UCHAR*,SGD_UINT32,SGD_HANDLE*); 251 #ifdef _WIN32 252 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ImportKeyWithISK_RSA"); 253 return (*fptr)(hSessionHandle,uiISKIndex,pucKey,uiKeyLength,phKeyHandle); 254 #else 255 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ImportKeyWithISK_RSA"); 256 return (*fptr)(hSessionHandle,uiISKIndex,pucKey,uiKeyLength,phKeyHandle); 257 #endif 258 } 259 //15. 基于RSA算法的数字信封转换 260 SGD_RV SDFExchangeDigitEnvelopeBaseOnRSA(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,RSArefPublicKey *pucPublicKey,SGD_UCHAR_PRT pucDEInput,SGD_UINT32 uiDELength,SGD_UCHAR_PRT *pucDEOutput,SGD_UINT32 *puiDELength) 261 { 262 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,RSArefPublicKey*,SGD_UCHAR*,SGD_UINT32,SGD_UCHAR*,SGD_UINT32*); 263 *pucDEOutput = calloc(*puiDELength, sizeof(SGD_UCHAR)); 264 if (*pucDEOutput == NULL) { 265 return SGD_FALSE; 266 } 267 #ifdef _WIN32 268 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExchangeDigitEnvelopeBaseOnRSA"); 269 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey,pucDEInput,uiDELength,*pucDEOutput,puiDELength); 270 #else 271 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExchangeDigitEnvelopeBaseOnRSA"); 272 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey,pucDEInput,uiDELength,*pucDEOutput,puiDELength); 273 #endif 274 } 275 //16. 导出ECC签名公钥 276 SGD_RV SDFExportSignPublicKey_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,ECCrefPublicKey *pucPublicKey) 277 { 278 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,ECCrefPublicKey*); 279 #ifdef _WIN32 280 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExportSignPublicKey_ECC"); 281 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 282 #else 283 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExportSignPublicKey_ECC"); 284 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 285 #endif 286 } 287 //17. 导出ECC加密公钥 288 SGD_RV SDFExportEncPublicKey_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,ECCrefPublicKey *pucPublicKey) 289 { 290 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,ECCrefPublicKey*); 291 #ifdef _WIN32 292 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExportEncPublicKey_ECC"); 293 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 294 #else 295 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExportEncPublicKey_ECC"); 296 return (*fptr)(hSessionHandle,uiKeyIndex,pucPublicKey); 297 #endif 298 } 299 //18. 产生ECC非对称密钥对并输出 300 SGD_RV SDFGenerateKeyPair_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiAlgID,SGD_UINT32 uiKeyBits,ECCrefPublicKey *pucPublicKey,ECCrefPrivateKey *pucPrivateKey) 301 { 302 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UINT32,ECCrefPublicKey*,ECCrefPrivateKey*); 303 #ifdef _WIN32 304 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyPair_ECC"); 305 return (*fptr)(hSessionHandle,uiAlgID,uiKeyBits,pucPublicKey,pucPrivateKey); 306 #else 307 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyPair_ECC"); 308 return (*fptr)(hSessionHandle,uiAlgID,uiKeyBits,pucPublicKey,pucPrivateKey); 309 #endif 310 } 311 //19. 生成会话密钥并用内部ECC公钥加密输出 312 SGD_RV SDFGenerateKeyWithIPK_ECC (struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiIPKIndex,SGD_UINT32 uiKeyBits,ECCCipher *pucKey,SGD_HANDLE *phKeyHandle) 313 { 314 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UINT32,ECCCipher*,SGD_HANDLE*); 315 #ifdef _WIN32 316 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyWithIPK_ECC"); 317 return (*fptr)(hSessionHandle,uiIPKIndex,uiKeyBits,pucKey,phKeyHandle); 318 #else 319 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyWithIPK_ECC"); 320 return (*fptr)(hSessionHandle,uiIPKIndex,uiKeyBits,pucKey,phKeyHandle); 321 #endif 322 } 323 //20. 生成会话密钥并用外部ECC公钥加密输出 324 SGD_RV SDFGenerateKeyWithEPK_ECC (struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyBits,SGD_UINT32 uiAlgID,ECCrefPublicKey *pucPublicKey,ECCCipher *pucKey,SGD_HANDLE *phKeyHandle) 325 { 326 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,SGD_UINT32,ECCrefPublicKey*,ECCCipher*,SGD_HANDLE*); 327 #ifdef _WIN32 328 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyWithEPK_ECC"); 329 return (*fptr)(hSessionHandle,uiKeyBits,uiAlgID,pucPublicKey,pucKey,phKeyHandle); 330 #else 331 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyWithEPK_ECC"); 332 return (*fptr)(hSessionHandle,uiKeyBits,uiAlgID,pucPublicKey,pucKey,phKeyHandle); 333 #endif 334 } 335 //21. 导入会话密钥并用内部ECC私钥解密 336 SGD_RV SDFImportKeyWithISK_ECC (struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiISKIndex,ECCCipher *pucKey,SGD_HANDLE *phKeyHandle) 337 { 338 typedef SGD_RV (*FPTR)(SGD_HANDLE,SGD_UINT32,ECCCipher*,SGD_HANDLE*); 339 #ifdef _WIN32 340 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ImportKeyWithISK_ECC"); 341 return (*fptr)(hSessionHandle,uiISKIndex,pucKey,phKeyHandle); 342 #else 343 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ImportKeyWithISK_ECC"); 344 return (*fptr)(hSessionHandle,uiISKIndex,pucKey,phKeyHandle); 345 #endif 346 } 347 //22. 生成密钥协商参数并输出 348 SGD_RV SDFGenerateAgreementDataWithECC (struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiISKIndex,SGD_UINT32 uiKeyBits,SGD_UCHAR_PRT pucSponsorID,SGD_UINT32 uiSponsorIDLength,ECCrefPublicKey *pucSponsorPublicKey,ECCrefPublicKey *pucSponsorTmpPublicKey,SGD_HANDLE *phAgreementHandle) 349 { 350 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 ,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 ,ECCrefPublicKey *,ECCrefPublicKey *,SGD_HANDLE *); 351 #ifdef _WIN32 352 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateAgreementDataWithECC"); 353 return (*fptr)(hSessionHandle, uiISKIndex, uiKeyBits, pucSponsorID, uiSponsorIDLength, pucSponsorPublicKey, pucSponsorTmpPublicKey, phAgreementHandle); 354 #else 355 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateAgreementDataWithECC"); 356 return (*fptr)(hSessionHandle, uiISKIndex, uiKeyBits, pucSponsorID, uiSponsorIDLength, pucSponsorPublicKey, pucSponsorTmpPublicKey, phAgreementHandle); 357 #endif 358 } 359 //23. 计算会话密钥 360 SGD_RV SDFGenerateKeyWithECC (struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UCHAR_PRT pucResponseID,SGD_UINT32 uiResponseIDLength,ECCrefPublicKey *pucResponsePublicKey,ECCrefPublicKey *pucResponseTmpPublicKey,SGD_HANDLE hAgreementHandle,SGD_HANDLE *phKeyHandle) 361 { 362 typedef SGD_RV (*FPTR)(SGD_HANDLE, SGD_UCHAR *,SGD_UINT32 ,ECCrefPublicKey *,ECCrefPublicKey *,SGD_HANDLE ,SGD_HANDLE *); 363 #ifdef _WIN32 364 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyWithECC"); 365 return (*fptr)(hSessionHandle,pucResponseID,uiResponseIDLength,pucResponsePublicKey,pucResponseTmpPublicKey,hAgreementHandle,phKeyHandle); 366 #else 367 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyWithECC"); 368 return (*fptr)(hSessionHandle,pucResponseID,uiResponseIDLength,pucResponsePublicKey,pucResponseTmpPublicKey,hAgreementHandle,phKeyHandle); 369 #endif 370 } 371 //24. 产生协商数据并计算会话密钥 372 SGD_RV SDFGenerateAgreementDataAndKeyWithECC (struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiISKIndex,SGD_UINT32 uiKeyBits,SGD_UCHAR_PRT pucResponseID,SGD_UINT32 uiResponseIDLength,SGD_UCHAR_PRT pucSponsorID,SGD_UINT32 uiSponsorIDLength,ECCrefPublicKey *pucSponsorPublicKey,ECCrefPublicKey *pucSponsorTmpPublicKey,ECCrefPublicKey *pucResponsePublicKey, ECCrefPublicKey *pucResponseTmpPublicKey,SGD_HANDLE *phKeyHandle) 373 { 374 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 ,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 ,ECCrefPublicKey *,ECCrefPublicKey *,ECCrefPublicKey *, ECCrefPublicKey *,SGD_HANDLE *); 375 #ifdef _WIN32 376 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateAgreementDataAndKeyWithECC"); 377 return (*fptr)(hSessionHandle, uiISKIndex, uiKeyBits, pucResponseID, uiResponseIDLength, pucSponsorID, uiSponsorIDLength, pucSponsorPublicKey, pucSponsorTmpPublicKey, pucResponsePublicKey, pucResponseTmpPublicKey, phKeyHandle); 378 #else 379 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateAgreementDataAndKeyWithECC"); 380 return (*fptr)(hSessionHandle, uiISKIndex, uiKeyBits, pucResponseID, uiResponseIDLength, pucSponsorID, uiSponsorIDLength, pucSponsorPublicKey, pucSponsorTmpPublicKey, pucResponsePublicKey, pucResponseTmpPublicKey, phKeyHandle); 381 #endif 382 } 383 //25. 基于 ECC算法的数字信封转换 384 SGD_RV SDFExchangeDigitEnvelopeBaseOnECC(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex,SGD_UINT32 uiAlgID,ECCrefPublicKey *pucPublicKey,ECCCipher *pucEncDataIn,ECCCipher *pucEncDataOut) 385 { 386 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 ,SGD_UINT32 ,ECCrefPublicKey *,ECCCipher *,ECCCipher *); 387 #ifdef _WIN32 388 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExchangeDigitEnvelopeBaseOnECC"); 389 return (*fptr)(hSessionHandle, uiKeyIndex, uiAlgID, pucPublicKey, pucEncDataIn, pucEncDataOut); 390 #else 391 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExchangeDigitEnvelopeBaseOnECC"); 392 return (*fptr)(hSessionHandle, uiKeyIndex, uiAlgID, pucPublicKey, pucEncDataIn, pucEncDataOut); 393 #endif 394 } 395 //26. 生成会话密钥并用密钥加密密钥加密输出 396 SGD_RV SDFGenerateKeyWithKEK(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyBits,SGD_UINT32 uiAlgID,SGD_UINT32 uiKEKIndex, SGD_UCHAR_PRT *pucKey, SGD_UINT32 *puiKeyLength, SGD_HANDLE *phKeyHandle) 397 { 398 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 ,SGD_UINT32 ,SGD_UINT32 , SGD_UCHAR *, SGD_UINT32 *, SGD_HANDLE *); 399 #ifdef _WIN32 400 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GenerateKeyWithKEK"); 401 return (*fptr)(hSessionHandle, uiKeyBits, uiAlgID, uiKEKIndex, *pucKey, puiKeyLength, phKeyHandle); 402 #else 403 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GenerateKeyWithKEK"); 404 return (*fptr)(hSessionHandle, uiKeyBits, uiAlgID, uiKEKIndex, *pucKey, puiKeyLength, phKeyHandle); 405 #endif 406 } 407 //27. 导入会话密钥并用密钥加密密钥解密 408 SGD_RV SDFImportKeyWithKEK(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiAlgID,SGD_UINT32 uiKEKIndex, SGD_UCHAR_PRT pucKey, SGD_UINT32 uiKeyLength, SGD_HANDLE *phKeyHandle) 409 { 410 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 ,SGD_UINT32 , SGD_UCHAR *, SGD_UINT32 , SGD_HANDLE *); 411 #ifdef _WIN32 412 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ImportKeyWithKEK"); 413 return (*fptr)(hSessionHandle, uiAlgID, uiKEKIndex, pucKey, uiKeyLength, phKeyHandle); 414 #else 415 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ImportKeyWithKEK"); 416 return (*fptr)(hSessionHandle, uiAlgID, uiKEKIndex, pucKey, uiKeyLength, phKeyHandle); 417 #endif 418 } 419 //28. 导入明文会话密钥 420 SGD_RV SDFImportKey(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UCHAR_PRT pucKey, SGD_UINT32 uiKeyLength,SGD_HANDLE *phKeyHandle) 421 { 422 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UCHAR *, SGD_UINT32 ,SGD_HANDLE *); 423 #ifdef _WIN32 424 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ImportKey"); 425 return (*fptr)(hSessionHandle, pucKey, uiKeyLength, phKeyHandle); 426 #else 427 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ImportKey"); 428 return (*fptr)(hSessionHandle, pucKey, uiKeyLength, phKeyHandle); 429 #endif 430 } 431 //29. 销毁会话密钥 432 SGD_RV SDFDestroyKey(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_HANDLE hKeyHandle) 433 { 434 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_HANDLE); 435 #ifdef _WIN32 436 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_DestroyKey"); 437 return (*fptr)(hSessionHandle, hKeyHandle); 438 #else 439 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_DestroyKey"); 440 return (*fptr)(hSessionHandle, hKeyHandle); 441 #endif 442 } 443 444 //34. 外部密钥ECC签名 445 SGD_RV SDFExternalSign_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiAlgID,ECCrefPrivateKey *pucPrivateKey,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength,ECCSignature *pucSignature) 446 { 447 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,ECCrefPrivateKey *,SGD_UCHAR *,SGD_UINT32 ,ECCSignature *); 448 #ifdef _WIN32 449 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExternalSign_ECC"); 450 return (*fptr)(hSessionHandle, uiAlgID, pucPrivateKey, pucData, uiDataLength, pucSignature); 451 #else 452 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExternalSign_ECC"); 453 return (*fptr)(hSessionHandle, uiAlgID, pucPrivateKey, pucData, uiDataLength, pucSignature); 454 #endif 455 } 456 //35. 外部密钥ECC验证 457 SGD_RV SDFExternalVerify_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiAlgID,ECCrefPublicKey *pucPublicKey,SGD_UCHAR_PRT pucDataInput,SGD_UINT32 uiInputLength,ECCSignature *pucSignature) 458 { 459 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,ECCrefPublicKey *,SGD_UCHAR *,SGD_UINT32 ,ECCSignature *); 460 #ifdef _WIN32 461 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExternalVerify_ECC"); 462 return (*fptr)(hSessionHandle, uiAlgID, pucPublicKey, pucDataInput, uiInputLength, pucSignature); 463 #else 464 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExternalVerify_ECC"); 465 return (*fptr)(hSessionHandle, uiAlgID, pucPublicKey, pucDataInput, uiInputLength, pucSignature); 466 #endif 467 } 468 //36. 内部密钥ECC签名 469 SGD_RV SDFInternalSign_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiISKIndex,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength,ECCSignature *pucSignature) 470 { 471 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 uiISKIndex,SGD_UCHAR *pucData,SGD_UINT32 uiDataLength,ECCSignature *pucSignature); 472 #ifdef _WIN32 473 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_InternalSign_ECC"); 474 return (*fptr)(hSessionHandle, uiISKIndex, pucData, uiDataLength, pucSignature); 475 #else 476 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_InternalSign_ECC"); 477 return (*fptr)(hSessionHandle, uiISKIndex, pucData, uiDataLength, pucSignature); 478 #endif 479 } 480 //37. 内部密钥ECC验证 481 SGD_RV SDFInternalVerify_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiISKIndex,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength,ECCSignature *pucSignature) 482 { 483 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 ,ECCSignature *); 484 #ifdef _WIN32 485 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_InternalVerify_ECC"); 486 return (*fptr)(hSessionHandle, uiISKIndex, pucData, uiDataLength, pucSignature); 487 #else 488 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_InternalVerify_ECC"); 489 return (*fptr)(hSessionHandle, uiISKIndex, pucData, uiDataLength, pucSignature); 490 #endif 491 } 492 //38. 外部密钥ECC加密 493 SGD_RV SDFExternalEncrypt_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiAlgID,ECCrefPublicKey *pucPublicKey,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength,ECCCipher *pucEncData) 494 { 495 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,ECCrefPublicKey *,SGD_UCHAR *,SGD_UINT32 ,ECCCipher *); 496 #ifdef _WIN32 497 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExternalEncrypt_ECC"); 498 return (*fptr)(hSessionHandle, uiAlgID, pucPublicKey, pucData, uiDataLength, pucEncData); 499 #else 500 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExternalEncrypt_ECC"); 501 return (*fptr)(hSessionHandle, uiAlgID, pucPublicKey, pucData, uiDataLength, pucEncData); 502 #endif 503 } 504 //39. 外部密钥ECC解密 505 SGD_RV SDFExternalDecrypt_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiAlgID,ECCrefPrivateKey *pucPrivateKey,ECCCipher *pucEncData,SGD_UCHAR_PRT *pucData,SGD_UINT32 *puiDataLength) 506 { 507 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,ECCrefPrivateKey *,ECCCipher *,SGD_UCHAR *,SGD_UINT32 *); 508 *pucData = calloc(*puiDataLength, sizeof(SGD_UCHAR)); 509 if (*pucData == NULL) { 510 return SGD_FALSE; 511 } 512 #ifdef _WIN32 513 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExternalDecrypt_ECC"); 514 return (*fptr)(hSessionHandle, uiAlgID, pucPrivateKey, pucEncData, *pucData, puiDataLength); 515 #else 516 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExternalDecrypt_ECC"); 517 return (*fptr)(hSessionHandle, uiAlgID, pucPrivateKey, pucEncData, *pucData, puiDataLength); 518 #endif 519 } 520 //40. 对称加密 521 SGD_RV SDFEncrypt(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_HANDLE hKeyHandle,SGD_UINT32 uiAlgID,SGD_UCHAR_PRT pucIV,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength,SGD_UCHAR_PRT *pucEncData,SGD_UINT32 *puiEncDataLength) 522 { 523 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_HANDLE ,SGD_UINT32 ,SGD_UCHAR *,SGD_UCHAR *,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 *); 524 *pucEncData = calloc(*puiEncDataLength, sizeof(SGD_UCHAR)); 525 if (*pucEncData == NULL) { 526 return SGD_FALSE; 527 } 528 #ifdef _WIN32 529 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_Encrypt"); 530 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucIV, pucData, uiDataLength, *pucEncData, puiEncDataLength); 531 #else 532 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_Encrypt"); 533 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucIV, pucData, uiDataLength, *pucEncData, puiEncDataLength); 534 #endif 535 } 536 //41. 对称解密 537 SGD_RV SDFDecrypt (struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_HANDLE hKeyHandle,SGD_UINT32 uiAlgID,SGD_UCHAR_PRT pucIV,SGD_UCHAR_PRT pucEncData,SGD_UINT32 uiEncDataLength,SGD_UCHAR_PRT *pucData,SGD_UINT32 *puiDataLength) 538 { 539 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_HANDLE ,SGD_UINT32 ,SGD_UCHAR *,SGD_UCHAR *,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 *); 540 *pucData = calloc(*puiDataLength, sizeof(SGD_UCHAR)); 541 if (*pucData == NULL) { 542 return SGD_FALSE; 543 } 544 #ifdef _WIN32 545 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_Decrypt"); 546 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucIV, pucEncData, uiEncDataLength, *pucData, puiDataLength); 547 #else 548 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_Decrypt"); 549 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucIV, pucEncData, uiEncDataLength, *pucData, puiDataLength); 550 #endif 551 } 552 //42. 计算MAC 553 SGD_RV SDFCalculateMAC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_HANDLE hKeyHandle,SGD_UINT32 uiAlgID,SGD_UCHAR_PRT pucIV,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength,SGD_UCHAR_PRT *pucMAC,SGD_UINT32 *puiMACLength) 554 { 555 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_HANDLE ,SGD_UINT32 ,SGD_UCHAR *,SGD_UCHAR *,SGD_UINT32 ,SGD_UCHAR *,SGD_UINT32 *); 556 *pucMAC = calloc(*puiMACLength, sizeof(SGD_UCHAR)); 557 if (*pucMAC == NULL) { 558 return SGD_FALSE; 559 } 560 #ifdef _WIN32 561 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_CalculateMAC"); 562 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucIV, pucData, uiDataLength, *pucMAC, puiMACLength); 563 #else 564 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_CalculateMAC"); 565 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucIV, pucData, uiDataLength, *pucMAC, puiMACLength); 566 #endif 567 } 568 //43. 杂凑运算初始化 569 SGD_RV SDFHashInit(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiAlgID,ECCrefPublicKey *pucPublicKey,SGD_UCHAR_PRT pucID,SGD_UINT32 uiIDLength) 570 { 571 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,ECCrefPublicKey *,SGD_UCHAR *,SGD_UINT32 ); 572 #ifdef _WIN32 573 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_HashInit"); 574 return (*fptr)(hSessionHandle, uiAlgID, pucPublicKey, pucID, uiIDLength); 575 #else 576 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_HashInit"); 577 return (*fptr)(hSessionHandle, uiAlgID, pucPublicKey, pucID, uiIDLength); 578 #endif 579 } 580 //44. 多包杂凑运算 581 SGD_RV SDFHashUpdate(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UCHAR_PRT pucData,SGD_UINT32 uiDataLength) 582 { 583 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UCHAR *,SGD_UINT32 ); 584 #ifdef _WIN32 585 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_HashUpdate"); 586 return (*fptr)(hSessionHandle, pucData, uiDataLength); 587 #else 588 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_HashUpdate"); 589 return (*fptr)(hSessionHandle, pucData, uiDataLength); 590 #endif 591 } 592 //45. 杂凑运算结束 593 SGD_RV SDFHashFinal(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UCHAR_PRT *pucHash,SGD_UINT32 *puiHashLength) 594 { 595 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UCHAR *,SGD_UINT32 *); 596 *pucHash = calloc(*puiHashLength, sizeof(SGD_UCHAR)); 597 if (*pucHash == NULL) { 598 return SGD_FALSE; 599 } 600 #ifdef _WIN32 601 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_HashFinal"); 602 return (*fptr)(hSessionHandle, *pucHash, puiHashLength); 603 #else 604 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_HashFinal"); 605 return (*fptr)(hSessionHandle, *pucHash, puiHashLength); 606 #endif 607 } 608 609 610 //50. 获取对称句柄 611 SGD_RV SDFGetSymmKeyHandle(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiKeyIndex, SGD_HANDLE *phKeyHandle) 612 { 613 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 , SGD_HANDLE *); 614 #ifdef _WIN32 615 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_GetSymmKeyHandle"); 616 return (*fptr)(hSessionHandle, uiKeyIndex, phKeyHandle); 617 #else 618 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_GetSymmKeyHandle"); 619 return (*fptr)(hSessionHandle, uiKeyIndex, phKeyHandle); 620 #endif 621 } 622 //51. ECC方式的加密 623 SGD_RV SDFInternalEncrypt_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_UINT32 uiISKIndex, SGD_UINT32 uiAlgID, SGD_UCHAR_PRT pucData, SGD_UINT32 uiDataLength, ECCCipher *pucEncData) 624 { 625 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_UINT32 , SGD_UINT32 , SGD_UCHAR *, SGD_UINT32 , ECCCipher *); 626 #ifdef _WIN32 627 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_InternalEncrypt_ECC"); 628 return (*fptr)(hSessionHandle, uiISKIndex, uiAlgID, pucData, uiDataLength, pucEncData); 629 #else 630 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_InternalEncrypt_ECC"); 631 return (*fptr)(hSessionHandle, uiISKIndex, uiAlgID, pucData, uiDataLength, pucEncData); 632 #endif 633 } 634 //52. ECC方式的解密 635 SGD_RV SDFInternalDecrypt_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle,SGD_UINT32 uiISKIndex,SGD_UINT32 uiAlgID,ECCCipher *pucEncData,SGD_UCHAR_PRT *pucData,SGD_UINT32 *puiDataLength) 636 { 637 typedef SGD_RV (*FPTR)(SGD_HANDLE ,SGD_UINT32 ,SGD_UINT32 ,ECCCipher *,SGD_UCHAR *,SGD_UINT32 *); 638 *pucData = calloc(*puiDataLength, sizeof(SGD_UCHAR)); 639 if (*pucData == NULL) { 640 return SGD_FALSE; 641 } 642 #ifdef _WIN32 643 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_InternalDecrypt_ECC"); 644 return (*fptr)(hSessionHandle, uiISKIndex, uiAlgID, pucEncData, *pucData, puiDataLength); 645 #else 646 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_InternalDecrypt_ECC"); 647 return (*fptr)(hSessionHandle, uiISKIndex, uiAlgID, pucEncData, *pucData, puiDataLength); 648 #endif 649 } 650 651 //54. EPK方式导出ECC密钥 652 SGD_RV SDFExportKeyWithEPK_ECC(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_HANDLE hKeyHandle, SGD_UINT32 uiAlgID, ECCrefPublicKey *pucPublicKey, ECCCipher *pucKey) 653 { 654 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_HANDLE , SGD_UINT32 , ECCrefPublicKey *, ECCCipher *); 655 #ifdef _WIN32 656 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExportKeyWithEPK_ECC"); 657 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucPublicKey, pucKey); 658 #else 659 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExportKeyWithEPK_ECC"); 660 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, pucPublicKey, pucKey); 661 #endif 662 } 663 //55. EPK方式导出密钥 664 SGD_RV SDFExportKeyWithKEK(struct LibHandle * h,SGD_HANDLE hSessionHandle, SGD_HANDLE hKeyHandle, SGD_UINT32 uiAlgID, SGD_UINT32 uiKEKIndex, SGD_UCHAR_PRT *pucKey, SGD_UINT32 *puiKeyLength) 665 { 666 typedef SGD_RV (*FPTR)(SGD_HANDLE , SGD_HANDLE , SGD_UINT32 , SGD_UINT32 , SGD_UCHAR *, SGD_UINT32 *); 667 #ifdef _WIN32 668 FPTR fptr = (FPTR)GetProcAddress(h->handle, "SDF_ExportKeyWithKEK"); 669 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, uiKEKIndex, *pucKey, puiKeyLength); 670 #else 671 FPTR fptr = (FPTR)dlsym(h->handle, "SDF_ExportKeyWithKEK"); 672 return (*fptr)(hSessionHandle, hKeyHandle, uiAlgID, uiKEKIndex, *pucKey, puiKeyLength); 673 #endif 674 } 675 */ 676 import "C" 677 import ( 678 "fmt" 679 "strings" 680 "unsafe" 681 ) 682 683 func ConvertToDeviceInfoGo(deviceInfo1 C.DEVICEINFO) (deviceInfo DeviceInfo) { 684 deviceInfo = DeviceInfo{ 685 IssuerName: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&deviceInfo1.IssuerName[0]), 40)), " "), 686 DeviceName: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&deviceInfo1.DeviceName[0]), 16)), " "), 687 DeviceSerial: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&deviceInfo1.DeviceSerial[0]), 16)), " "), 688 DeviceVersion: uint(deviceInfo1.DeviceVersion), 689 StandardVersion: uint(deviceInfo1.StandardVersion), 690 SymAlgAbility: uint(deviceInfo1.SymAlgAbility), 691 HashAlgAbility: uint(deviceInfo1.HashAlgAbility), 692 BufferSize: uint(deviceInfo1.BufferSize), 693 } 694 temp1 := C.GoBytes(unsafe.Pointer(&deviceInfo1.AsymAlgAbility[0]), 2) 695 temp2 := C.GoBytes(unsafe.Pointer(&deviceInfo1.AsymAlgAbility[1]), 2) 696 deviceInfo.AsymAlgAbility[0] = uint(temp1[0]) 697 deviceInfo.AsymAlgAbility[1] = uint(temp2[0]) 698 return deviceInfo 699 } 700 701 func ConvertToECCrefPublicKeyC(publicKey ECCrefPublicKey) (pucPublicKey C.ECCrefPublicKey) { 702 703 pucPublicKey.bits = C.SGD_UINT32(publicKey.Bits) 704 for i := 0; i < len(publicKey.X); i++ { 705 pucPublicKey.x[i] = C.SGD_UCHAR(publicKey.X[i]) 706 } 707 for i := 0; i < len(publicKey.Y); i++ { 708 pucPublicKey.y[i] = C.SGD_UCHAR(publicKey.Y[i]) 709 } 710 return pucPublicKey 711 } 712 713 func ConvertToECCrefPublicKeyGo(pucPublicKey C.ECCrefPublicKey) (publicKey ECCrefPublicKey) { 714 publicKey = ECCrefPublicKey{ 715 Bits: uint(pucPublicKey.bits), 716 X: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucPublicKey.x[0]), 64)), " "), 717 Y: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucPublicKey.y[0]), 64)), " "), 718 } 719 return publicKey 720 } 721 722 func ConvertToECCrefPrivateKeyC(privateKey ECCrefPrivateKey) (pucPrivateKey C.ECCrefPrivateKey) { 723 pucPrivateKey.bits = C.SGD_UINT32(privateKey.Bits) 724 for i := 0; i < len(privateKey.K); i++ { 725 pucPrivateKey.K[i] = C.SGD_UCHAR(privateKey.K[i]) 726 } 727 return pucPrivateKey 728 } 729 730 func ConvertToECCrefPrivateKeyGo(pucPrivateKey C.ECCrefPrivateKey) (privateKey ECCrefPrivateKey) { 731 privateKey = ECCrefPrivateKey{ 732 Bits: uint(pucPrivateKey.bits), 733 K: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucPrivateKey.K[0]), 64)), " "), 734 } 735 return privateKey 736 } 737 738 func ConvertToECCCipherC(encData ECCCipher) (pucEncData C.ECCCipher) { 739 for i := 0; i < len(encData.X); i++ { 740 pucEncData.x[i] = C.SGD_UCHAR(encData.X[i]) 741 } 742 for i := 0; i < len(encData.Y); i++ { 743 pucEncData.y[i] = C.SGD_UCHAR(encData.Y[i]) 744 } 745 for i := 0; i < len(encData.M); i++ { 746 pucEncData.M[i] = C.SGD_UCHAR(encData.M[i]) 747 } 748 pucEncData.L = C.SGD_UINT32(encData.L) 749 for i := 0; i < len(encData.C); i++ { 750 pucEncData.C[i] = C.SGD_UCHAR(encData.C[i]) 751 } 752 return pucEncData 753 } 754 func ConvertToECCCipherGo(pucKey C.ECCCipher) (key ECCCipher) { 755 key = ECCCipher{ 756 X: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucKey.x[0]), 64)), " "), 757 Y: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucKey.y[0]), 64)), " "), 758 M: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucKey.M[0]), 32)), " "), 759 L: uint(pucKey.L), 760 C: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucKey.C[0]), C.int(pucKey.L))), " "), 761 } 762 return key 763 } 764 765 func ConvertToECCSignatureC(signature ECCSignature) (pSignature C.ECCSignature) { 766 for i := 0; i < len(signature.R); i++ { 767 pSignature.r[i] = C.SGD_UCHAR(signature.R[i]) 768 } 769 for i := 0; i < len(signature.S); i++ { 770 pSignature.s[i] = C.SGD_UCHAR(signature.S[i]) 771 } 772 return pSignature 773 } 774 775 func ConvertToECCSignatureGo(pucSignature C.ECCSignature) (signature ECCSignature) { 776 signature = ECCSignature{ 777 R: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucSignature.r[0]), 64)), " "), 778 S: strings.TrimRight(string(C.GoBytes(unsafe.Pointer(&pucSignature.s[0]), 64)), " "), 779 } 780 781 return signature 782 } 783 784 func New(libPath string) *Ctx { 785 c := new(Ctx) 786 mod := C.CString(libPath) 787 defer C.free(unsafe.Pointer(mod)) 788 c.libHandle = C.NewLib(mod) 789 if c.libHandle == nil { 790 return nil 791 } 792 return c 793 } 794 795 func ToError(e C.SGD_RV) error { 796 if e == C.SDR_OK { 797 return nil 798 } 799 return fmt.Errorf("sdf: 0x%X", uint(e)) 800 } 801 802 func (c *Ctx) Destroy() { 803 if c == nil || c.libHandle == nil { 804 return 805 } 806 C.DestroyLib(c.libHandle) 807 c.libHandle = nil 808 } 809 810 type Ctx struct { 811 libHandle *C.struct_LibHandle 812 } 813 814 type SessionHandle C.SGD_HANDLE 815 816 var stubData = []byte{0} 817 818 func CMessage(data []byte) (dataPtr C.SGD_UCHAR_PRT) { 819 l := len(data) 820 if l == 0 { 821 data = stubData 822 } 823 dataPtr = C.SGD_UCHAR_PRT(unsafe.Pointer(&data[0])) 824 return dataPtr 825 } 826 827 // SDFOpenDevice 1.打开设备 828 func (c *Ctx) SDFOpenDevice() (deviceHandle SessionHandle, err error) { 829 var err1 C.SGD_RV 830 var dH C.SGD_HANDLE 831 err1 = C.SDFOpenDevice(c.libHandle, &dH) 832 err = ToError(err1) 833 deviceHandle = SessionHandle(dH) 834 return deviceHandle, err 835 } 836 837 // SDFCloseDevice 2.关闭设备 838 func (c *Ctx) SDFCloseDevice(deviceHandle SessionHandle) (err error) { 839 var err1 = C.SDFCloseDevice(c.libHandle, C.SGD_HANDLE(deviceHandle)) 840 return ToError(err1) 841 } 842 843 // SDFOpenSession 3.创建会话 844 func (c *Ctx) SDFOpenSession(deviceHandle SessionHandle) (SessionHandle, error) { 845 var s C.SGD_HANDLE 846 var err1 = C.SDFOpenSession(c.libHandle, C.SGD_HANDLE(deviceHandle), &s) 847 return SessionHandle(s), ToError(err1) 848 } 849 850 // SDFCloseSession 4.关闭会话 851 func (c *Ctx) SDFCloseSession(sessionHandle SessionHandle) (err error) { 852 var err1 = C.SDFCloseSession(c.libHandle, C.SGD_HANDLE(sessionHandle)) 853 return ToError(err1) 854 } 855 856 // SDFGetDeviceInfo 5.获取设备信息 857 func (c *Ctx) SDFGetDeviceInfo(sessionHandle SessionHandle) (deviceInfo DeviceInfo, err error) { 858 var deviceInfo1 C.DEVICEINFO 859 var err1 = C.SDFGetDeviceInfo(c.libHandle, C.SGD_HANDLE(sessionHandle), &deviceInfo1) 860 deviceInfo = ConvertToDeviceInfoGo(deviceInfo1) 861 err = ToError(err1) 862 return deviceInfo, err 863 } 864 865 // SDFGenerateRandom 6.产生随机数 866 func (c *Ctx) SDFGenerateRandom(sessionHandle SessionHandle, length uint) (randomData []byte, err error) { 867 var random C.SGD_UCHAR_PRT 868 var err1 = C.SDFGenerateRandom(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(length), &random) 869 err = ToError(err1) 870 randomData = C.GoBytes(unsafe.Pointer(random), C.int(length)) 871 C.free(unsafe.Pointer(random)) 872 return randomData, err 873 } 874 875 // SDFGetPrivateKeyAccessRight 7.获取私钥使用权限 876 func (c *Ctx) SDFGetPrivateKeyAccessRight(sessionHandle SessionHandle, keyIndex uint, password []byte, pwdLength uint) (err error) { 877 var err1 = C.SDFGetPrivateKeyAccessRight(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(keyIndex), CMessage(password), C.SGD_UINT32(pwdLength)) 878 err = ToError(err1) 879 return err 880 } 881 882 // SDFReleasePrivateKeyAccessRight 8.释放私钥使用权限 883 func (c *Ctx) SDFReleasePrivateKeyAccessRight(sessionHandle SessionHandle, keyIndex uint) (err error) { 884 var err1 = C.SDFReleasePrivateKeyAccessRight(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(keyIndex)) 885 err = ToError(err1) 886 return err 887 } 888 889 // SDFExportSignPublicKey_ECC 16.导出 ECC签名公钥 890 func (c *Ctx) SDFExportSignPublicKey_ECC(sessionHandle SessionHandle, uiKeyIndex uint) (publicKey ECCrefPublicKey, err error) { 891 var pucPublicKey C.ECCrefPublicKey 892 var err1 = C.SDFExportSignPublicKey_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiKeyIndex), &pucPublicKey) 893 publicKey = ConvertToECCrefPublicKeyGo(pucPublicKey) 894 err = ToError(err1) 895 return publicKey, err 896 } 897 898 // SDFExportEncPublicKey_ECC 17.导出 ECC加密公钥 899 func (c *Ctx) SDFExportEncPublicKey_ECC(sessionHandle SessionHandle, uiKeyIndex uint) (publicKey ECCrefPublicKey, err error) { 900 var err1 C.SGD_RV 901 var pucPublicKey C.ECCrefPublicKey 902 err1 = C.SDFExportEncPublicKey_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiKeyIndex), &pucPublicKey) 903 publicKey = ConvertToECCrefPublicKeyGo(pucPublicKey) 904 err = ToError(err1) 905 return publicKey, err 906 } 907 908 // SDFGenerateKeyPair_ECC 18.产生 ECC非对称密钥对并输出 909 func (c *Ctx) SDFGenerateKeyPair_ECC(sessionHandle SessionHandle, uiAlgID uint, uiKeyBits uint) (publicKey ECCrefPublicKey, privateKey ECCrefPrivateKey, err error) { 910 var err1 C.SGD_RV 911 var pucPublicKey C.ECCrefPublicKey 912 var pucPrivateKey C.ECCrefPrivateKey 913 err1 = C.SDFGenerateKeyPair_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiAlgID), C.SGD_UINT32(uiKeyBits), &pucPublicKey, &pucPrivateKey) 914 publicKey = ConvertToECCrefPublicKeyGo(pucPublicKey) 915 privateKey = ConvertToECCrefPrivateKeyGo(pucPrivateKey) 916 err = ToError(err1) 917 return publicKey, privateKey, err 918 } 919 920 // SDFImportKey 28.导入明文会话密钥 921 func (c *Ctx) SDFImportKey(sessionHandle SessionHandle, pucKey []byte, uiKeyLength uint) (keyHandle SessionHandle, err error) { 922 var err1 C.SGD_RV 923 var phKeyHandle C.SGD_HANDLE 924 err1 = C.SDFImportKey(c.libHandle, C.SGD_HANDLE(sessionHandle), CMessage(pucKey), C.SGD_UINT32(uiKeyLength), &phKeyHandle) 925 keyHandle = SessionHandle(phKeyHandle) 926 err = ToError(err1) 927 return keyHandle, err 928 } 929 930 // SDFDestroyKey 29.销毁会话密钥 931 func (c *Ctx) SDFDestroyKey(sessionHandle SessionHandle, hKeyHandle SessionHandle) (err error) { 932 var err1 = C.SDFDestroyKey(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_HANDLE(hKeyHandle)) 933 err = ToError(err1) 934 return err 935 } 936 937 // SDFExternalSign_ECC 34. 外部密钥ECC签名 938 func (c *Ctx) SDFExternalSign_ECC(sessionHandle SessionHandle, uiAlgID uint, privateKey ECCrefPrivateKey, pucData []byte, uiDataLength uint) (signature ECCSignature, err error) { 939 pucPrivateKey := ConvertToECCrefPrivateKeyC(privateKey) 940 var pucSignature C.ECCSignature 941 var err1 = C.SDFExternalSign_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiAlgID), &pucPrivateKey, CMessage(pucData), C.SGD_UINT32(uiDataLength), &pucSignature) 942 signature = ConvertToECCSignatureGo(pucSignature) 943 err = ToError(err1) 944 return signature, err 945 } 946 947 // SDFExternalVerify_ECC 35.外部密钥 ECC验证 948 func (c *Ctx) SDFExternalVerify_ECC(sessionHandle SessionHandle, uiAlgID uint, publicKey ECCrefPublicKey, inputData []byte, uiInputLength uint, signature ECCSignature) (err error) { 949 var err1 C.SGD_RV 950 pucPublicKey := ConvertToECCrefPublicKeyC(publicKey) 951 pucSignature := ConvertToECCSignatureC(signature) 952 err1 = C.SDFExternalVerify_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiAlgID), &pucPublicKey, CMessage(inputData), C.SGD_UINT32(uiInputLength), &pucSignature) 953 err = ToError(err1) 954 return err 955 } 956 957 // SDFInternalSign_ECC 36.内部密钥 ECC签名 958 func (c *Ctx) SDFInternalSign_ECC(sessionHandle SessionHandle, uiISKIndex uint, pucData []byte, uiDataLength uint) (signature ECCSignature, err error) { 959 var err1 C.SGD_RV 960 var pucSignature C.ECCSignature 961 err1 = C.SDFInternalSign_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiISKIndex), CMessage(pucData), C.SGD_UINT32(uiDataLength), &pucSignature) 962 signature = ConvertToECCSignatureGo(pucSignature) 963 err = ToError(err1) 964 return signature, err 965 } 966 967 // SDFInternalVerify_ECC 37.内部密钥 ECC验证 968 func (c *Ctx) SDFInternalVerify_ECC(sessionHandle SessionHandle, uiISKIndex uint, pucData []byte, uiDataLength uint, signature ECCSignature) (err error) { 969 var err1 C.SGD_RV 970 var pucSignature C.ECCSignature 971 for i := 0; i < len(signature.R); i++ { 972 pucSignature.r[i] = C.SGD_UCHAR(signature.R[i]) 973 } 974 for i := 0; i < len(signature.S); i++ { 975 pucSignature.s[i] = C.SGD_UCHAR(signature.S[i]) 976 } 977 err1 = C.SDFInternalVerify_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiISKIndex), CMessage(pucData), C.SGD_UINT32(uiDataLength), &pucSignature) 978 err = ToError(err1) 979 return err 980 } 981 982 // SDFExternalEncrypt_ECC 38.外部密钥 ECC加密 983 func (c *Ctx) SDFExternalEncrypt_ECC(sessionHandle SessionHandle, uiAlgID uint, publicKey ECCrefPublicKey, data []byte, dataLength uint) (encData ECCCipher, err error) { 984 var err1 C.SGD_RV 985 pucPublicKey := ConvertToECCrefPublicKeyC(publicKey) 986 var pucEncData C.ECCCipher 987 err1 = C.SDFExternalEncrypt_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiAlgID), &pucPublicKey, CMessage(data), C.SGD_UINT32(dataLength), &pucEncData) 988 encData = ConvertToECCCipherGo(pucEncData) 989 err = ToError(err1) 990 return encData, err 991 } 992 993 // SDFExternalDecrypt_ECC 39.外部密钥 ECC解密 994 func (c *Ctx) SDFExternalDecrypt_ECC(sessionHandle SessionHandle, uiAlgID uint, privateKey ECCrefPrivateKey, encData ECCCipher) (data []byte, dataLength uint, err error) { 995 var err1 C.SGD_RV 996 pucPrivateKey := ConvertToECCrefPrivateKeyC(privateKey) 997 pucEncData := ConvertToECCCipherC(encData) 998 var pucData C.SGD_UCHAR_PRT 999 var puiDataLength C.SGD_UINT32 1000 err1 = C.SDFExternalDecrypt_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiAlgID), &pucPrivateKey, &pucEncData, &pucData, &puiDataLength) 1001 data = C.GoBytes(unsafe.Pointer(pucData), C.int(puiDataLength)) 1002 dataLength = uint(puiDataLength) 1003 C.free(unsafe.Pointer(pucData)) 1004 err = ToError(err1) 1005 return data, dataLength, err 1006 } 1007 1008 // SDFEncrypt 40.对称加密 1009 func (c *Ctx) SDFEncrypt(sessionHandle SessionHandle, keyHandle SessionHandle, algID uint, iv []byte, data []byte, dataLength uint) (encData []byte, encDataLength uint, err error) { 1010 var pucEncData C.SGD_UCHAR_PRT 1011 var puiEncDataLength C.SGD_UINT32 1012 var err1 = C.SDFEncrypt(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_HANDLE(keyHandle), C.SGD_UINT32(algID), CMessage(iv), CMessage(data), C.SGD_UINT32(dataLength), &pucEncData, &puiEncDataLength) 1013 encData = C.GoBytes(unsafe.Pointer(pucEncData), C.int(puiEncDataLength)) 1014 err = ToError(err1) 1015 C.free(unsafe.Pointer(pucEncData)) 1016 return encData, uint(puiEncDataLength), err 1017 } 1018 1019 // SDFDecrypt 41.对称解密 1020 func (c *Ctx) SDFDecrypt(sessionHandle SessionHandle, hKeyHandle SessionHandle, uiAlgID uint, iv []byte, encData []byte, encDataLength uint) (data []byte, dataLength uint, err error) { 1021 var pucData C.SGD_UCHAR_PRT 1022 var puiDataLength C.SGD_UINT32 1023 var err1 = C.SDFDecrypt(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_HANDLE(hKeyHandle), C.SGD_UINT32(uiAlgID), CMessage(iv), CMessage(encData), C.SGD_UINT32(encDataLength), &pucData, &puiDataLength) 1024 data = C.GoBytes(unsafe.Pointer(pucData), C.int(puiDataLength)) 1025 dataLength = uint(puiDataLength) 1026 C.free(unsafe.Pointer(pucData)) 1027 err = ToError(err1) 1028 return data, dataLength, err 1029 } 1030 1031 // SDFGetSymmKeyHandle 50. 1032 func (c *Ctx) SDFGetSymmKeyHandle(sessionHandle SessionHandle, uiKeyIndex uint) (keyHandle SessionHandle, err error) { 1033 var phKeyHandle C.SGD_HANDLE 1034 var err1 = C.SDFGetSymmKeyHandle(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiKeyIndex), &phKeyHandle) 1035 keyHandle = SessionHandle(phKeyHandle) 1036 err = ToError(err1) 1037 return keyHandle, err 1038 } 1039 1040 // SDFInternalEncrypt_ECC 51. ECC方式的加密 1041 func (c *Ctx) SDFInternalEncrypt_ECC(sessionHandle SessionHandle, uiISKIndex uint, uiAlgID uint, pucData []byte, uiDataLength uint) (encData ECCCipher, err error) { 1042 var pucEncData C.ECCCipher 1043 var err1 = C.SDFInternalEncrypt_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiISKIndex), C.SGD_UINT32(uiAlgID), CMessage(pucData), C.SGD_UINT32(uiDataLength), &pucEncData) 1044 encData = ConvertToECCCipherGo(pucEncData) 1045 err = ToError(err1) 1046 return encData, err 1047 } 1048 1049 // SDFInternalDecrypt_ECC 52. ECC方式的解密 1050 func (c *Ctx) SDFInternalDecrypt_ECC(sessionHandle SessionHandle, uiISKIndex uint, uiAlgID uint, encData ECCCipher) (data []byte, dataLength uint, err error) { 1051 var err1 C.SGD_RV 1052 var pucEncData C.ECCCipher 1053 for i := 0; i < len(encData.X); i++ { 1054 pucEncData.x[i] = C.SGD_UCHAR(encData.X[i]) 1055 } 1056 for i := 0; i < len(encData.Y); i++ { 1057 pucEncData.y[i] = C.SGD_UCHAR(encData.Y[i]) 1058 } 1059 for i := 0; i < len(encData.M); i++ { 1060 pucEncData.M[i] = C.SGD_UCHAR(encData.M[i]) 1061 } 1062 pucEncData.L = C.SGD_UINT32(encData.L) 1063 for i := 0; i < len(encData.C); i++ { 1064 pucEncData.C[i] = C.SGD_UCHAR(encData.C[i]) 1065 } 1066 var pucData C.SGD_UCHAR_PRT 1067 var puiDataLength C.SGD_UINT32 1068 err1 = C.SDFInternalDecrypt_ECC(c.libHandle, C.SGD_HANDLE(sessionHandle), C.SGD_UINT32(uiISKIndex), C.SGD_UINT32(uiAlgID), &pucEncData, &pucData, &puiDataLength) 1069 data = C.GoBytes(unsafe.Pointer(pucData), C.int(puiDataLength)) 1070 C.free(unsafe.Pointer(pucData)) 1071 dataLength = uint(puiDataLength) 1072 err = ToError(err1) 1073 return data, dataLength, err 1074 }