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;

}