现在,我正在寻找一种方法来验证“ Google inapp结算”系统中的签名。
我已经在php中找到了“ openssl_pkey_get_public”和“ openssl_verify”函数(非常容易和简单!),但是没有C或C ++的示例或文档;;(我花了两天时间来搜索它。.OTL。 ..)
我现在有 :
-公钥
-签名
-从Google购买数据
我想使用C或C ++实现验证代码
有谁知道我能得到它吗?
我搜索了以下内容。
-http://www.nlnetlabs.nl/downloads/publications/hsm/hsm_node21.html
它处理'openssl EVP'..但它讲述了HSM(硬件安全模块)
谢谢!
最佳答案
以下是有关我所问问题的答案。
1表示成功,0表示失败。
谢谢..
int Verify_GoogleInappBilling_Signature(const char* data, const char* signature, const char* pub_key_id)
{
std::shared_ptr<EVP_MD_CTX> mdctx = std::shared_ptr<EVP_MD_CTX>(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
const EVP_MD* md = EVP_get_digestbyname("SHA1");
if(NULL == md)
{
return -1;
}
if(0 == EVP_VerifyInit_ex(mdctx.get(), md, NULL))
{
return -1;
}
if(0 == EVP_VerifyUpdate(mdctx.get(), (void*)data, strlen(data)))
{
return -1;
}
std::shared_ptr<BIO> b64 = std::shared_ptr<BIO>(BIO_new(BIO_f_base64()), BIO_free);
BIO_set_flags(b64.get(),BIO_FLAGS_BASE64_NO_NL);
std::shared_ptr<BIO> bPubKey = std::shared_ptr<BIO>(BIO_new(BIO_s_mem()), BIO_free);
BIO_puts(bPubKey.get(),pub_key_id);
BIO_push(b64.get(), bPubKey.get());
std::shared_ptr<EVP_PKEY> pubkey = std::shared_ptr<EVP_PKEY>(d2i_PUBKEY_bio(b64.get(), NULL), EVP_PKEY_free);
std::string decoded_signature = Base64Decode(std::string(signature));
return EVP_VerifyFinal(mdctx.get(), (unsigned char*)decoded_signature.c_str(), decoded_signature.length(), pubkey.get());
}