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;

}