Listing 5 Asymmetric key license verification
int verl_asymm_verify(const char* license,
const char* partial_sig,
u64 target_id,
RSA *rsa_key,
u8 *lic_features,
u8 *isValid)
{
unsigned char lic_bin[10];
size_t licdata_len;
unsigned char licdata[9];
unsigned char signature[512];
unsigned char bin_signature[128];
size_t sig_len;
/* parse the license */
utils_str2bin(lic_bin, sizeof(lic_bin),
&licdata_len, license);
memcpy(lic_features, lic_bin, sizeof(*lic_features));
/* reconstruct the signed data */
memcpy(licdata,
(char *)&target_id, sizeof(target_id));
memcpy(licdata + sizeof(target_id),
(char *)lic_features, sizeof(*lic_features));
/* reconstruct the signature */
strlcpy(signature, license + sizeof(*lic_features)*2,
sizeof(signature));
strlcat(signature, partial_sig, sizeof(signature));
utils_str2bin(bin_signature, sizeof(bin_signature),
&sig_len, signature);
/* try to verify the license */
rsa_openssl_verify(bin_signature, sig_len,
licdata, sizeof(licdata),
rsa_key,
isValid);
/* free the key */
keys_free_rsa_key(rsa_key);
return 0;
}