/** \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; }
ops_boolean_t ops_write_keyring_to_file(const ops_keyring_t *keyring,ops_boolean_t armoured,const char *filename,ops_boolean_t write_all_packets) { ops_create_info_t *info; int fd = ops_setup_file_write(&info, filename, ops_true); if (fd < 0) { fprintf(stderr,"ops_write_keyring(): ERROR: Cannot write to %s\n",filename ) ; return ops_false ; } int i; for(i=0;i<keyring->nkeys;++i) // if(keyring->keys[i].key.pkey.algorithm == OPS_PKA_RSA) if(write_all_packets) ops_write_transferable_public_key_from_packet_data(&keyring->keys[i],armoured,info) ; else ops_write_transferable_public_key(&keyring->keys[i],armoured,info) ; // else // { // fprintf(stdout, "ops_write_keyring: not writing key. Algorithm not handled: ") ; // ops_print_public_keydata(&keyring->keys[i]); // fprintf(stdout, "\n") ; // } ops_writer_close(info); ops_create_info_delete(info); return ops_true ; }
int main(int argc,char **argv) { ops_create_info_t *info; const unsigned char *id; const char *nstr; const char *estr; BIGNUM *n=NULL; BIGNUM *e=NULL; if(argc != 4) { fprintf(stderr,"%s <n> <e> <user id>\n",argv[0]); exit(1); } nstr=argv[1]; estr=argv[2]; id=(unsigned char *)argv[3]; BN_hex2bn(&n,nstr); BN_hex2bn(&e,estr); info=ops_create_info_new(); ops_writer_set_fd(info,1); ops_write_rsa_public_key(time(NULL),n,e,info); ops_write_user_id(id,info); ops_create_info_delete(info); return 0; }
void ops_build_public_key(ops_memory_t *out,const ops_public_key_t *key, ops_boolean_t make_packet) { ops_create_info_t *info; info=ops_create_info_new(); ops_memory_init(out,128); ops_writer_set_memory(info,out); write_public_key_body(key,info); if(make_packet) ops_memory_make_packet(out,OPS_PTAG_CT_PUBLIC_KEY); ops_create_info_delete(info); }
/** \ingroup Core_Keys \brief Add signature to given key \return ops_true if OK; else ops_false */ ops_boolean_t ops_sign_key(ops_keydata_t* keydata, const unsigned char *signers_key_id,ops_secret_key_t *signers_key) { /* 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 sig for this pkt sig=ops_create_signature_new(); ops_signature_start_key_signature(sig, &keydata->key.skey.public_key, &keydata->uids[0], OPS_CERT_GENERIC); ops_signature_add_creation_time(sig,time(NULL)); ops_signature_add_issuer_key_id(sig,signers_key_id); ops_signature_hashed_subpackets_end(sig); ops_setup_memory_write(&cinfo_sig, &mem_sig, 128); ops_write_signature(sig,&signers_key->public_key,signers_key, cinfo_sig); // add this packet to keydata ops_packet_t sigpacket; sigpacket.length=ops_memory_get_length(mem_sig); sigpacket.raw=ops_memory_get_data(mem_sig); // add userid to keydata ops_add_packet_to_keydata(keydata, &sigpacket); // cleanup ops_create_signature_delete(sig); ops_create_info_delete(cinfo_sig); ops_memory_free(mem_sig); return ops_true; }
/** \ingroup Core_Writers \brief Closes writer, frees info, closes fd \param cinfo \param fd */ void ops_teardown_file_write(ops_create_info_t *cinfo, int fd) { ops_writer_close(cinfo); close(fd); ops_create_info_delete(cinfo); }
/** \ingroup Core_Writers \brief Closes writer and frees cinfo and mem \param cinfo \param mem \sa ops_setup_memory_write() */ void ops_teardown_memory_write(ops_create_info_t *cinfo, ops_memory_t *mem) { ops_writer_close(cinfo); // new ops_create_info_delete(cinfo); ops_memory_free(mem); }