- #include<iostream>
- #include <string>
- #include "Base.h" //提供base64转码功能
- using namespace std;
- #include "cryptlib.h"
- int main()
- {
- cryptInit();
- //cryptlib调用前必须执行init,调用完必须执行end
- cryptEnd();
- return 0;
- }
- /**
- *
- *cryptlib产生自签名证书
- *
- **/
- void GenerateKey(){
- int* keyset;
- keyset = (int*)malloc(sizeof(int*)); //密钥库上下文
- int* cryptContext;
- cryptContext = (int*)malloc(sizeof(int*)); //加密上下文
- int* cryptCertificate;
- cryptCertificate = (int*)malloc(sizeof(int*)); //证书上下文
- int status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, "D:\\Private key file.p15", CRYPT_KEYOPT_CREATE);//创建密钥库,(CRYPT_KEYOPT_CREATE)
- status = cryptCreateContext(cryptContext,CRYPT_UNUSED, CRYPT_ALGO_RSA);//RSA算法的密钥上下文
- status = cryptSetAttributeString(*cryptContext, CRYPT_CTXINFO_LABEL, "test1",5);//密钥标签
- status = cryptGenerateKey(*cryptContext);
- status = cryptAddPrivateKey(*keyset, *cryptContext, "1234");//向密钥库添加私钥
- status = cryptCreateCert(cryptCertificate,CRYPT_UNUSED, CRYPT_CERTTYPE_CERTIFICATE);//创建证书
- status = cryptSetAttribute(*cryptCertificate, CRYPT_CERTINFO_XYZZY, 1);//设置为简单证书
- /* Add the public key and certificate owner name and sign the
- certificate with the private key */
- status = cryptSetAttribute(*cryptCertificate, CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO, *cryptContext);//证书公钥绑定
- status = cryptSetAttributeString(*cryptCertificate, CRYPT_CERTINFO_COMMONNAME, "test1",5);//证书CN
- status = cryptSignCert(*cryptCertificate, *cryptContext);//使用私钥自签发证书
- status = cryptAddPublicKey(*keyset, *cryptCertificate);//向证书添加公钥
- status = cryptDestroyCert(*cryptCertificate);
- status = cryptDestroyContext(*cryptContext);
- status = cryptKeysetClose(*keyset);
- }
- /**
- *
- *从指定密钥库中获取私钥,并签名与验证
- *
- **/
- void signature(){
- /*访问密钥库,获取私钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* sigKeyContext;
- sigKeyContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, "D:\\Private key file.p15", CRYPT_KEYOPT_READONLY);//读取密钥库,(CRYPT_KEYOPT_READONLY)
- status = cryptGetPrivateKey(*keyset,sigKeyContext, CRYPT_KEYID_NAME, "test1", "1234");//通过标签和保护密钥获取私钥
- CRYPT_CONTEXT hashContext;
- void *signature;
- int signatureLength;
- status = cryptCreateContext( &hashContext, CRYPT_UNUSED, CRYPT_ALGO_MD5 );//创建hash上下文
- /* 对数据做摘要 */
- status = cryptEncrypt( hashContext, "1234", 4 );
- status = cryptEncrypt( hashContext, "1234", 0 );
- /* 为签名值分配空间 */
- int signatureMaxLength;
- cryptCreateSignature( NULL, 0, &signatureMaxLength, *sigKeyContext, hashContext );
- signature = malloc( signatureMaxLength );
- /*使用私钥对摘要进行签名*/
- status = cryptCreateSignature( signature, signatureMaxLength, &signatureLength, *sigKeyContext, hashContext );
- status = cryptDestroyContext( hashContext );
- /* 创建hash上下文 */
- status = cryptCreateContext( &hashContext, CRYPT_UNUSED, CRYPT_ALGO_MD5 );
- /* 对数据做摘要 */
- status = cryptEncrypt( hashContext, "1234", 4 );
- status = cryptEncrypt( hashContext, "1234", 0 );
- /* 使用公钥验证签名 */
- status = cryptCheckSignature( signature, signatureLength, *sigKeyContext, hashContext );
- status = cryptDestroyContext( hashContext );
- }
- /**
- *
- *导出指定密钥库中的公钥
- *
- **/
- void ExportKey(){
- /*访问密钥库,获取公钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* sigKeyContext;
- sigKeyContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, "D:\\Private key file.p15", CRYPT_KEYOPT_READONLY);
- status = cryptGetPublicKey(*keyset,sigKeyContext, CRYPT_KEYID_NAME, "test1");//通过标签获取公钥
- CRYPT_CONTEXT pubKeyContext, cryptContext;
- void *encryptedKey;
- int encryptedKeyLength,encryptedKeyMaxLength;
- /* 生成保护密钥 */
- status = cryptCreateContext( &cryptContext, CRYPT_UNUSED, CRYPT_ALGO_3DES );
- status = cryptGenerateKey( cryptContext );
- status = cryptExportKey( NULL, 0, &encryptedKeyMaxLength, *sigKeyContext, cryptContext ); //获取公钥大小
- encryptedKey = malloc( encryptedKeyMaxLength );
- status = cryptExportKey( encryptedKey, encryptedKeyMaxLength, &encryptedKeyLength, *sigKeyContext, cryptContext );//导出公钥
- cout<<(char*) encryptedKey<<endl;
- }
- /**
- *
- *3DES对称加密
- *
- **/
- void encrypt(string text,string pwd,string iv,BYTE* result,int* length){
- CRYPT_CONTEXT context;
- int status = cryptCreateContext(&context,CRYPT_UNUSED,CRYPT_ALGO_3DES);
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_IV,iv.c_str(),iv.size()); //初始向量
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_KEY,pwd.c_str(),pwd.size());//密钥
- int keysize;
- status = cryptGetAttribute(context,CRYPT_CTXINFO_KEYSIZE,&keysize);
- if (text.size() % keysize > 0){
- *length = text.size() + keysize - text.size() % keysize;
- }
- else{
- *length = text.size();
- }
- for(int i =0 ;i<text.size();i++){
- result[i] = text[i]; //存储到BYTE数组中
- }
- status = cryptEncrypt(context,result,*length);//加密处理
- for(int i = 0 ; i < *length ; i++)
- {
- printf("%x ",result[i]);
- }
- status = cryptDestroyContext(context);
- if(status!=0) cout<<"fail"<<endl;
- }
- void decrypt(BYTE* enc , int* length,string pwd,string iv){
- CRYPT_CONTEXT context;
- int status = cryptCreateContext(&context,CRYPT_UNUSED,CRYPT_ALGO_3DES);
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_IV,iv.c_str(),iv.size());
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_KEY,pwd.c_str(),pwd.size());
- int keysize;
- status = cryptGetAttribute(context,CRYPT_CTXINFO_KEYSIZE,&keysize);
- status = cryptDecrypt(context,enc,*length);
- status = cryptDestroyContext(context);
- }
- /**
- * 公钥加密信封,返回base64编码字符串
- */
- string envelop(string text,string keyFile){
- BYTE* message;
- message = new BYTE[text.size()];
- for(int i=0;i<text.size();i++){
- message[i]=text[i];
- }
- int messageLength = text.size();
- /*访问密钥库,获取公钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* pubKeyContext;
- pubKeyContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, keyFile.c_str(), CRYPT_KEYOPT_READONLY);
- status = cryptGetPublicKey(*keyset,pubKeyContext, CRYPT_KEYID_NAME, "test1");
- CRYPT_ENVELOPE cryptEnvelope;
- int bytesCopied;
- status = cryptCreateEnvelope( &cryptEnvelope, CRYPT_UNUSED, CRYPT_FORMAT_CRYPTLIB );
- /* Add the public key */
- status = cryptSetAttribute( cryptEnvelope, CRYPT_ENVINFO_PUBLICKEY, *pubKeyContext );
- /* Add the data size information and data, wrap up the processing, and pop out the processed data */
- status = cryptSetAttribute( cryptEnvelope, CRYPT_ENVINFO_DATASIZE, messageLength );
- status = cryptPushData( cryptEnvelope, message, messageLength, &bytesCopied );
- status = cryptFlushData( cryptEnvelope );
- BYTE* envelopedData;
- envelopedData = new BYTE[1000];
- int envelopedDataBufferSize = 1000;
- status = cryptPopData( cryptEnvelope, envelopedData, envelopedDataBufferSize, &bytesCopied );
- status = cryptDestroyEnvelope( cryptEnvelope );
- string base64Result = base64_encode(envelopedData,bytesCopied);
- cout<<base64Result<<endl;
- return base64Result;
- }
- string develop(string env,string keyFile){
- BYTE* message;
- string debase = base64_decode(env);
- message = new BYTE[debase.size()];
- for(int i=0;i<debase.size();i++){
- message[i] = debase[i];
- }
- int* privKeyContext;
- privKeyContext = (int*)malloc(sizeof(int*));
- int messageLength = debase.size();
- message[messageLength]='\0';
- CRYPT_ENVELOPE cryptEnvelope;
- int bytesCopied, status;
- /*访问密钥库*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE,keyFile.c_str(), CRYPT_KEYOPT_READONLY);
- status = cryptGetPrivateKey(*keyset,privKeyContext, CRYPT_KEYID_NAME, "test1", "1234");
- status = cryptCreateEnvelope( &cryptEnvelope, CRYPT_UNUSED, CRYPT_FORMAT_AUTO );
- /* Push in the enveloped data and the private decryption key required to de-envelope it, and pop out the recovered message */
- status = cryptPushData( cryptEnvelope, message, messageLength, &bytesCopied );
- status = cryptSetAttribute( cryptEnvelope, CRYPT_ENVINFO_PRIVATEKEY, *privKeyContext );
- status = cryptFlushData( cryptEnvelope );
- BYTE* result;
- result = new BYTE[1000];
- int resultLength = 1000;
- status = cryptPopData( cryptEnvelope, result, resultLength, &bytesCopied );
- status = cryptDestroyEnvelope( cryptEnvelope );
- cout<<(char*)result<<endl;
- string r = string((char*)result);
- return r;
- }
- string exportCert(string keyFile){
- /*访问密钥库,获取公钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* certContext;
- certContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, keyFile.c_str(), CRYPT_KEYOPT_READONLY);
- status = cryptGetPublicKey(*keyset,certContext, CRYPT_KEYID_NAME, "test1");
- void *certificate;
- int certLength;
- int certMaxLength;
- status = cryptExportCert( NULL, 0, &certMaxLength,CRYPT_CERTFORMAT_CERTIFICATE
- , *certContext );
- /* Allocate memory for the encoded certificate */
- certificate = malloc( certMaxLength );
- /* Export the encoded certificate from the certificate object */
- status = cryptExportCert( certificate, certMaxLength, &certLength, CRYPT_CERTFORMAT_CERTIFICATE
- , *certContext );
- unsigned char* certChar = (unsigned char*)certificate;
- certChar[certLength]='\0';
- string cert_base64 = base64_encode(certChar,certLength);
- return cert_base64;
- }
- void importCert(string cert_base64){
- CRYPT_CERTIFICATE cryptCertificate;
- int status;
- string certStr = base64_decode(cert_base64);
- /* Import the certificate object from the encoded certificate */
- BYTE* cert;
- int certLength = certStr.size();
- cert = new BYTE[certLength];
- for(int i = 0 ; i<certLength;i++){
- cert[i] = certStr[i];
- }
- cert[certLength]='\0';
- status = cryptImportCert( cert, certLength, CRYPT_UNUSED, &cryptCertificate );
- }
- #include<iostream>
- #include <string>
- #include "Base.h" //提供base64转码功能
- using namespace std;
- #include "cryptlib.h"
- int main()
- {
- cryptInit();
- //cryptlib调用前必须执行init,调用完必须执行end
- cryptEnd();
- return 0;
- }
- /**
- *
- *cryptlib产生自签名证书
- *
- **/
- void GenerateKey(){
- int* keyset;
- keyset = (int*)malloc(sizeof(int*)); //密钥库上下文
- int* cryptContext;
- cryptContext = (int*)malloc(sizeof(int*)); //加密上下文
- int* cryptCertificate;
- cryptCertificate = (int*)malloc(sizeof(int*)); //证书上下文
- int status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, "D:\\Private key file.p15", CRYPT_KEYOPT_CREATE);//创建密钥库,(CRYPT_KEYOPT_CREATE)
- status = cryptCreateContext(cryptContext,CRYPT_UNUSED, CRYPT_ALGO_RSA);//RSA算法的密钥上下文
- status = cryptSetAttributeString(*cryptContext, CRYPT_CTXINFO_LABEL, "test1",5);//密钥标签
- status = cryptGenerateKey(*cryptContext);
- status = cryptAddPrivateKey(*keyset, *cryptContext, "1234");//向密钥库添加私钥
- status = cryptCreateCert(cryptCertificate,CRYPT_UNUSED, CRYPT_CERTTYPE_CERTIFICATE);//创建证书
- status = cryptSetAttribute(*cryptCertificate, CRYPT_CERTINFO_XYZZY, 1);//设置为简单证书
- /* Add the public key and certificate owner name and sign the
- certificate with the private key */
- status = cryptSetAttribute(*cryptCertificate, CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO, *cryptContext);//证书公钥绑定
- status = cryptSetAttributeString(*cryptCertificate, CRYPT_CERTINFO_COMMONNAME, "test1",5);//证书CN
- status = cryptSignCert(*cryptCertificate, *cryptContext);//使用私钥自签发证书
- status = cryptAddPublicKey(*keyset, *cryptCertificate);//向证书添加公钥
- status = cryptDestroyCert(*cryptCertificate);
- status = cryptDestroyContext(*cryptContext);
- status = cryptKeysetClose(*keyset);
- }
- /**
- *
- *从指定密钥库中获取私钥,并签名与验证
- *
- **/
- void signature(){
- /*访问密钥库,获取私钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* sigKeyContext;
- sigKeyContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, "D:\\Private key file.p15", CRYPT_KEYOPT_READONLY);//读取密钥库,(CRYPT_KEYOPT_READONLY)
- status = cryptGetPrivateKey(*keyset,sigKeyContext, CRYPT_KEYID_NAME, "test1", "1234");//通过标签和保护密钥获取私钥
- CRYPT_CONTEXT hashContext;
- void *signature;
- int signatureLength;
- status = cryptCreateContext( &hashContext, CRYPT_UNUSED, CRYPT_ALGO_MD5 );//创建hash上下文
- /* 对数据做摘要 */
- status = cryptEncrypt( hashContext, "1234", 4 );
- status = cryptEncrypt( hashContext, "1234", 0 );
- /* 为签名值分配空间 */
- int signatureMaxLength;
- cryptCreateSignature( NULL, 0, &signatureMaxLength, *sigKeyContext, hashContext );
- signature = malloc( signatureMaxLength );
- /*使用私钥对摘要进行签名*/
- status = cryptCreateSignature( signature, signatureMaxLength, &signatureLength, *sigKeyContext, hashContext );
- status = cryptDestroyContext( hashContext );
- /* 创建hash上下文 */
- status = cryptCreateContext( &hashContext, CRYPT_UNUSED, CRYPT_ALGO_MD5 );
- /* 对数据做摘要 */
- status = cryptEncrypt( hashContext, "1234", 4 );
- status = cryptEncrypt( hashContext, "1234", 0 );
- /* 使用公钥验证签名 */
- status = cryptCheckSignature( signature, signatureLength, *sigKeyContext, hashContext );
- status = cryptDestroyContext( hashContext );
- }
- /**
- *
- *导出指定密钥库中的公钥
- *
- **/
- void ExportKey(){
- /*访问密钥库,获取公钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* sigKeyContext;
- sigKeyContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, "D:\\Private key file.p15", CRYPT_KEYOPT_READONLY);
- status = cryptGetPublicKey(*keyset,sigKeyContext, CRYPT_KEYID_NAME, "test1");//通过标签获取公钥
- CRYPT_CONTEXT pubKeyContext, cryptContext;
- void *encryptedKey;
- int encryptedKeyLength,encryptedKeyMaxLength;
- /* 生成保护密钥 */
- status = cryptCreateContext( &cryptContext, CRYPT_UNUSED, CRYPT_ALGO_3DES );
- status = cryptGenerateKey( cryptContext );
- status = cryptExportKey( NULL, 0, &encryptedKeyMaxLength, *sigKeyContext, cryptContext ); //获取公钥大小
- encryptedKey = malloc( encryptedKeyMaxLength );
- status = cryptExportKey( encryptedKey, encryptedKeyMaxLength, &encryptedKeyLength, *sigKeyContext, cryptContext );//导出公钥
- cout<<(char*) encryptedKey<<endl;
- }
- /**
- *
- *3DES对称加密
- *
- **/
- void encrypt(string text,string pwd,string iv,BYTE* result,int* length){
- CRYPT_CONTEXT context;
- int status = cryptCreateContext(&context,CRYPT_UNUSED,CRYPT_ALGO_3DES);
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_IV,iv.c_str(),iv.size()); //初始向量
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_KEY,pwd.c_str(),pwd.size());//密钥
- int keysize;
- status = cryptGetAttribute(context,CRYPT_CTXINFO_KEYSIZE,&keysize);
- if (text.size() % keysize > 0){
- *length = text.size() + keysize - text.size() % keysize;
- }
- else{
- *length = text.size();
- }
- for(int i =0 ;i<text.size();i++){
- result[i] = text[i]; //存储到BYTE数组中
- }
- status = cryptEncrypt(context,result,*length);//加密处理
- for(int i = 0 ; i < *length ; i++)
- {
- printf("%x ",result[i]);
- }
- status = cryptDestroyContext(context);
- if(status!=0) cout<<"fail"<<endl;
- }
- void decrypt(BYTE* enc , int* length,string pwd,string iv){
- CRYPT_CONTEXT context;
- int status = cryptCreateContext(&context,CRYPT_UNUSED,CRYPT_ALGO_3DES);
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_IV,iv.c_str(),iv.size());
- status = cryptSetAttributeString(context,CRYPT_CTXINFO_KEY,pwd.c_str(),pwd.size());
- int keysize;
- status = cryptGetAttribute(context,CRYPT_CTXINFO_KEYSIZE,&keysize);
- status = cryptDecrypt(context,enc,*length);
- status = cryptDestroyContext(context);
- }
- /**
- * 公钥加密信封,返回base64编码字符串
- */
- string envelop(string text,string keyFile){
- BYTE* message;
- message = new BYTE[text.size()];
- for(int i=0;i<text.size();i++){
- message[i]=text[i];
- }
- int messageLength = text.size();
- /*访问密钥库,获取公钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* pubKeyContext;
- pubKeyContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, keyFile.c_str(), CRYPT_KEYOPT_READONLY);
- status = cryptGetPublicKey(*keyset,pubKeyContext, CRYPT_KEYID_NAME, "test1");
- CRYPT_ENVELOPE cryptEnvelope;
- int bytesCopied;
- status = cryptCreateEnvelope( &cryptEnvelope, CRYPT_UNUSED, CRYPT_FORMAT_CRYPTLIB );
- /* Add the public key */
- status = cryptSetAttribute( cryptEnvelope, CRYPT_ENVINFO_PUBLICKEY, *pubKeyContext );
- /* Add the data size information and data, wrap up the processing, and pop out the processed data */
- status = cryptSetAttribute( cryptEnvelope, CRYPT_ENVINFO_DATASIZE, messageLength );
- status = cryptPushData( cryptEnvelope, message, messageLength, &bytesCopied );
- status = cryptFlushData( cryptEnvelope );
- BYTE* envelopedData;
- envelopedData = new BYTE[1000];
- int envelopedDataBufferSize = 1000;
- status = cryptPopData( cryptEnvelope, envelopedData, envelopedDataBufferSize, &bytesCopied );
- status = cryptDestroyEnvelope( cryptEnvelope );
- string base64Result = base64_encode(envelopedData,bytesCopied);
- cout<<base64Result<<endl;
- return base64Result;
- }
- string develop(string env,string keyFile){
- BYTE* message;
- string debase = base64_decode(env);
- message = new BYTE[debase.size()];
- for(int i=0;i<debase.size();i++){
- message[i] = debase[i];
- }
- int* privKeyContext;
- privKeyContext = (int*)malloc(sizeof(int*));
- int messageLength = debase.size();
- message[messageLength]='\0';
- CRYPT_ENVELOPE cryptEnvelope;
- int bytesCopied, status;
- /*访问密钥库*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE,keyFile.c_str(), CRYPT_KEYOPT_READONLY);
- status = cryptGetPrivateKey(*keyset,privKeyContext, CRYPT_KEYID_NAME, "test1", "1234");
- status = cryptCreateEnvelope( &cryptEnvelope, CRYPT_UNUSED, CRYPT_FORMAT_AUTO );
- /* Push in the enveloped data and the private decryption key required to de-envelope it, and pop out the recovered message */
- status = cryptPushData( cryptEnvelope, message, messageLength, &bytesCopied );
- status = cryptSetAttribute( cryptEnvelope, CRYPT_ENVINFO_PRIVATEKEY, *privKeyContext );
- status = cryptFlushData( cryptEnvelope );
- BYTE* result;
- result = new BYTE[1000];
- int resultLength = 1000;
- status = cryptPopData( cryptEnvelope, result, resultLength, &bytesCopied );
- status = cryptDestroyEnvelope( cryptEnvelope );
- cout<<(char*)result<<endl;
- string r = string((char*)result);
- return r;
- }
- string exportCert(string keyFile){
- /*访问密钥库,获取公钥*/
- int* keyset;
- keyset = (int*)malloc(sizeof(int*));
- int* certContext;
- certContext = (int*)malloc(sizeof(int*));
- int status = 0;
- status = cryptKeysetOpen(keyset,CRYPT_UNUSED, CRYPT_KEYSET_FILE, keyFile.c_str(), CRYPT_KEYOPT_READONLY);
- status = cryptGetPublicKey(*keyset,certContext, CRYPT_KEYID_NAME, "test1");
- void *certificate;
- int certLength;
- int certMaxLength;
- status = cryptExportCert( NULL, 0, &certMaxLength,CRYPT_CERTFORMAT_CERTIFICATE
- , *certContext );
- /* Allocate memory for the encoded certificate */
- certificate = malloc( certMaxLength );
- /* Export the encoded certificate from the certificate object */
- status = cryptExportCert( certificate, certMaxLength, &certLength, CRYPT_CERTFORMAT_CERTIFICATE
- , *certContext );
- unsigned char* certChar = (unsigned char*)certificate;
- certChar[certLength]='\0';
- string cert_base64 = base64_encode(certChar,certLength);
- return cert_base64;
- }
- void importCert(string cert_base64){
- CRYPT_CERTIFICATE cryptCertificate;
- int status;
- string certStr = base64_decode(cert_base64);
- /* Import the certificate object from the encoded certificate */
- BYTE* cert;
- int certLength = certStr.size();
- cert = new BYTE[certLength];
- for(int i = 0 ; i<certLength;i++){
- cert[i] = certStr[i];
- }
- cert[certLength]='\0';
- status = cryptImportCert( cert, certLength, CRYPT_UNUSED, &cryptCertificate );
- }