Listing 4: Asymmetric key license generation
int genl_asymm_generate(char *license,
size_t license_size,
char *partial_sig,
size_t part_sig_size,
u64 target_id,
u8 lic_features,
RSA *rsa_key)
{
unsigned char licdata[9];
unsigned char signature[128];
size_t sig_len;
unsigned char userlic[10];
/* copy data into place */
memcpy(licdata,
(char *)&target_id, sizeof(target_id));
memcpy(licdata + sizeof(target_id),
(char *)&lic_features, sizeof(lic_features));
/* sign the license */
rsa_openssl_sign(signature, &sig_len,
licdata, sizeof(licdata),
rsa_key);
/* create the license string */
memcpy(userlic,
(char *)&lic_features, sizeof(lic_features));
memcpy(userlic + sizeof(lic_features),
signature, sizeof(userlic) - sizeof(lic_features));
utils_bin2str(license, license_size,
userlic, sizeof(userlic));
/* create the part that should be shipped with the sw */
utils_bin2str(partial_sig, part_sig_size,
signature + sizeof(userlic) - sizeof(lic_features),
sig_len - sizeof(userlic) + sizeof(lic_features));
/* free the key */
keys_free_rsa_key(rsa_key);
return 0;
}