#include <windows.h>
#include <tbs.h>
#include <tbs_bios.h>
// 定义 ECC 密钥对结构体
typedef struct _ECC_KEY_PAIR
{
BCRYPT_KEY_HANDLE hPublicKey;
BCRYPT_KEY_HANDLE hPrivateKey;
} ECC_KEY_PAIR;
int main()
{
HRESULT hr = S_OK;
TBS_CONTEXT_PARAMS2 contextParams = { 0 };
TBS_HCONTEXT hContext = NULL;
ECC_KEY_PAIR keyPair = { 0 };
// 初始化 TBS 上下文参数
contextParams.version = TBS_CONTEXT_VERSION_TWO;
contextParams.includeTpm20 = 1;
// 创建 TBS 上下文
hr = Tbsi_Context_Create(&contextParams, &hContext);
if (FAILED(hr))
{
printf("Failed to create TBS context. Error code: 0x%x\n", hr);
return -1;
}
// 定义 ECC 密钥参数
BCRYPT_ECCKEY_BLOB keyBlob = { 0 };
keyBlob.dwMagic = BCRYPT_ECDH_PUBLIC_P256_MAGIC;
keyBlob.cbKey = 32; // ECC P-256 曲线的密钥长度
// 生成 ECC 密钥对
hr = BCryptGenerateKeyPair(
BCRYPT_ECDH_P256_ALGORITHM, // 算法标识符
&keyPair.hPublicKey, // 公钥句柄
&keyPair.hPrivateKey, // 私钥句柄
0 // 密钥属性
);
if (FAILED(hr))
{
printf("Failed to generate ECC key pair. Error code: 0x%x\n", hr);
return -1;
}
// 获取公钥数据
DWORD publicKeySize;
hr = BCryptExportKey(
keyPair.hPublicKey, // 公钥句柄
NULL,
BCRYPT_ECCPUBLIC_BLOB,
NULL,
0,
&publicKeySize,
0
);
if (FAILED(hr))
{
printf("Failed to get public key size. Error code: 0x%x\n", hr);
return -1;
}
PBYTE publicKeyData = (PBYTE)malloc(publicKeySize);
hr = BCryptExportKey(
keyPair.hPublicKey, // 公钥句柄
NULL,
BCRYPT_ECCPUBLIC_BLOB,
publicKeyData,
publicKeySize,
&publicKeySize,
0
);
if (FAILED(hr))
{
printf("Failed to export public key. Error code: 0x%x\n", hr);
return -1;
}
// 对消息进行签名
BYTE message[] = "Hello, World!";
DWORD messageSize = sizeof(message) - 1;
BYTE signature[256];
DWORD signatureSize;
hr = BCryptSignHash(
keyPair.hPrivateKey, // 私钥句柄
NULL,
message,
messageSize,
NULL,
0,
&signatureSize,
BCRYPT_PAD_NONE
);
if (FAILED(hr))
{
printf("Failed to get signature size. Error code: 0x%x\n", hr);
return -1;
}
hr = BCryptSignHash(
keyPair.hPrivateKey, // 私钥句柄
NULL,
message,
messageSize,
signature,
signatureSize,
&signatureSize,
BCRYPT_PAD_NONE
);
if (FAILED(hr))
{
printf("Failed to sign message. Error code: 0x%x\n", hr);
return -1;
}
// 输出公钥和签名
printf("Public Key:\n");
for (DWORD i = 0; i < publicKeySize; i++)
{
printf("%02X ", publicKeyData[i]);
}
printf("\n");
printf("Signature:\n");
for (DWORD i = 0; i < signatureSize; i++)
{
printf("%02X ", signature[i]);
}
printf("\n");
// 释放资源
free(publicKeyData);
BCryptDestroyKey(keyPair.hPublicKey);
BCryptDestroyKey(keyPair.hPrivateKey);
Tbsip_Context_Close(hContext);
return 0;
}