C语言---基于CNG调用windows TPM2.0生成ECC密钥对

TPM2.0的相关资料较少,且多为英文版。晦涩难懂!分享一个通过CNG调用windows TPM的示例~
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <windows.h>
#include <bcrypt.h>
#include <ncrypt.h>

int main(int argc, char argv[])
{
/CNG生成ECC密钥对并导出公钥/
SECURITY_STATUS status = ERROR_SUCCESS;
// 初始化 CNG 提供程序–打开存储提供设备TPM
NCRYPT_PROV_HANDLE providerHandle;
//MS_PLATFORM_CRYPTO_PROVIDER 标识 Microsoft 提供的 TPM 密钥存储提供程序
status=NCryptOpenStorageProvider(&providerHandle, MS_PLATFORM_CRYPTO_PROVIDER, 0);
if(status != ERROR_SUCCESS){
printf(“NCryptOpenStorageProvider err [%d]\n”,LINE);
return -1;
}
NCRYPT_KEY_HANDLE keyHandle;
// 创建持久化密钥对象 BCRYPT_ECDH_P256_ALGORITHM
status=NCryptCreatePersistedKey(providerHandle, &keyHandle, BCRYPT_ECDSA_P256_ALGORITHM,
L"MyECCKeyPair", 0, NCRYPT_OVERWRITE_KEY_FLAG);
if(status != ERROR_SUCCESS){
printf(“NCryptCreatePersistedKey err [%d]\n”,LINE);
NCryptFreeObject(keyHandle);
NCryptFreeObject(providerHandle);
return -1;
}
// 设置密钥参数 为 CNG 密钥存储对象的命名属性设置值
// 设置 允许私钥导出
/

DWORD exportPolicy = NCRYPT_ALLOW_EXPORT_FLAG;
status=NCryptSetProperty(keyHandle, NCRYPT_EXPORT_POLICY_PROPERTY, (PBYTE)&exportPolicy,sizeof(DWORD), NCRYPT_PERSIST_FLAG);
if(status != ERROR_SUCCESS){
printf(“NCryptSetProperty1 err\n”);
NCryptFreeObject(keyHandle);
NCryptFreeObject(providerHandle);
return -1;
}
*/
//设置密钥长度
DWORD keySize = 256;
status=NCryptSetProperty(keyHandle, NCRYPT_LENGTH_PROPERTY, (PBYTE)&keySize,
sizeof(DWORD), NCRYPT_PERSIST_FLAG);
if(status != ERROR_SUCCESS){
printf(“NCryptSetProperty2 err [%d]\n”,LINE);
NCryptFreeObject(keyHandle);
NCryptFreeObject(providerHandle);
return -1;
}
if(NCryptFinalizeKey(keyHandle, 0) !=ERROR_SUCCESS){
printf(“NCryptFinalizeKey err [%d]\n”,LINE);
NCryptFreeObject(keyHandle);
NCryptFreeObject(providerHandle);
return -1;
}
// 清理资源
NCryptFreeObject(keyHandle);
NCryptFreeObject(providerHandle);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值