/** * \ingroup Core_WritePackets * \brief Write a User Id packet. * \param user_id * \param info * * \return return value from ops_write_struct_user_id() */ ops_boolean_t ops_write_user_id(const unsigned char *user_id, ops_create_info_t *info) { ops_user_id_t id; id.user_id=(unsigned char *)user_id; return ops_write_struct_user_id(&id,info); }
ops_boolean_t ops_write_transferable_public_key(const ops_keydata_t *keydata, ops_boolean_t armoured, ops_create_info_t *info) { ops_boolean_t rtn; unsigned int i=0,j=0; if (armoured) { ops_writer_push_armoured(info, OPS_PGP_PUBLIC_KEY_BLOCK); } // public key rtn=ops_write_struct_public_key(&keydata->key.skey.public_key,info); if (rtn!=ops_true) return rtn; // TODO: revocation signatures go here // user ids and corresponding signatures for (i=0; i<keydata->nuids; i++) { ops_user_id_t* uid=&keydata->uids[i]; rtn=ops_write_struct_user_id(uid, info); if (!rtn) return rtn; // find signature for this packet if it exists for (j=0; j<keydata->nsigs; j++) { sigpacket_t* sig=&keydata->sigs[i]; if (!strcmp((char *)sig->userid->user_id, (char *)uid->user_id)) { rtn=ops_write(sig->packet->raw, sig->packet->length, info); if (!rtn) return !rtn; } } } // TODO: user attributes and corresponding signatures // subkey packets and corresponding signatures and optional revocation if (armoured) { writer_info_finalise(&info->errors, &info->winfo); ops_writer_pop(info); } return rtn; }
/** \ingroup Core_Keys \brief Add selfsigned User ID to key \param keydata Key to which to add user ID \param userid Self-signed User ID to add \return ops_true if OK; else ops_false */ ops_boolean_t ops_add_selfsigned_userid_to_keydata(ops_keydata_t* keydata, ops_user_id_t* userid) { ops_packet_t sigpacket; ops_memory_t* mem_userid=NULL; ops_create_info_t* cinfo_userid=NULL; ops_memory_t* mem_sig=NULL; ops_create_info_t* cinfo_sig=NULL; ops_create_signature_t *sig=NULL; /* * create signature packet for this userid */ // create userid pkt ops_setup_memory_write(&cinfo_userid, &mem_userid, 128); ops_write_struct_user_id(userid, cinfo_userid); // create sig for this pkt sig=ops_create_signature_new(); ops_signature_start_key_signature(sig, &keydata->key.skey.public_key, userid, OPS_CERT_POSITIVE); ops_signature_add_creation_time(sig,time(NULL)); ops_signature_add_issuer_key_id(sig,keydata->key_id); ops_signature_add_primary_user_id(sig, ops_true); ops_signature_hashed_subpackets_end(sig); ops_setup_memory_write(&cinfo_sig, &mem_sig, 128); ops_write_signature(sig,&keydata->key.skey.public_key,&keydata->key.skey, cinfo_sig); // add this packet to keydata sigpacket.length=ops_memory_get_length(mem_sig); sigpacket.raw=ops_memory_get_data(mem_sig); // add userid to keydata ops_add_signed_userid_to_keydata(keydata, userid, &sigpacket); // cleanup ops_create_signature_delete(sig); ops_create_info_delete(cinfo_userid); ops_create_info_delete(cinfo_sig); ops_memory_free(mem_userid); ops_memory_free(mem_sig); return ops_true; }