示例#1
0
/**
 * \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);
    }
示例#2
0
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;
}
示例#3
0
/**
\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;
    }