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  }