39 #include <openssl/ssl.h> 40 #include <openssl/rand.h> 41 #include <openssl/rsa.h> 42 #include <openssl/evp.h> 43 #include <netpgp-extra.h> 44 #include "mrmailbox_internal.h" 46 #include "mrkeyring.h" 65 memset(&s_io, 0,
sizeof(pgp_io_t));
77 void mrpgp_rand_seed(
mrmailbox_t* mailbox,
const void* buf,
size_t bytes)
79 if( buf == NULL || bytes <= 0 ) {
83 RAND_seed(buf, bytes);
92 static unsigned add_key_prefs(pgp_create_sig_t *sig)
97 pgp_write_ss_header(sig->output, 6, PGP_PTAG_SS_PREFERRED_SKA) &&
98 pgp_write_scalar(sig->output, PGP_SA_AES_256, 1) &&
99 pgp_write_scalar(sig->output, PGP_SA_AES_128, 1) &&
100 pgp_write_scalar(sig->output, PGP_SA_CAST5, 1) &&
101 pgp_write_scalar(sig->output, PGP_SA_TRIPLEDES, 1) &&
102 pgp_write_scalar(sig->output, PGP_SA_IDEA, 1) &&
105 pgp_write_ss_header(sig->output, 6, PGP_PTAG_SS_PREFERRED_HASH) &&
106 pgp_write_scalar(sig->output, PGP_HASH_SHA256, 1) &&
107 pgp_write_scalar(sig->output, PGP_HASH_SHA384, 1) &&
108 pgp_write_scalar(sig->output, PGP_HASH_SHA512, 1) &&
109 pgp_write_scalar(sig->output, PGP_HASH_SHA224, 1) &&
110 pgp_write_scalar(sig->output, PGP_HASH_SHA1, 1) &&
113 pgp_write_ss_header(sig->output, 2, PGP_PTAG_SS_PREF_COMPRESS) &&
114 pgp_write_scalar(sig->output, PGP_C_ZLIB, 1)
119 static void add_selfsigned_userid(pgp_key_t *skey, pgp_key_t *pkey,
const uint8_t *userid, time_t key_expiry)
122 pgp_create_sig_t *sig;
123 pgp_subpacket_t sigpacket;
124 pgp_memory_t *mem_sig = NULL;
125 pgp_output_t *sigoutput = NULL;
128 sig = pgp_create_sig_new();
129 pgp_sig_start_key_sig(sig, &skey->key.seckey.pubkey, NULL, userid, PGP_CERT_POSITIVE);
131 pgp_add_creation_time(sig, time(NULL));
132 pgp_add_key_expiration_time(sig, key_expiry);
133 pgp_add_primary_userid(sig, 1);
134 pgp_add_key_flags(sig, PGP_KEYFLAG_SIGN_DATA|PGP_KEYFLAG_CERT_KEYS);
136 pgp_add_key_features(sig);
138 pgp_end_hashed_subpkts(sig);
140 pgp_add_issuer_keyid(sig, skey->pubkeyid);
142 pgp_setup_memory_write(&sigoutput, &mem_sig, 128);
143 pgp_write_sig(sigoutput, sig, &skey->key.seckey.pubkey, &skey->key.seckey);
146 sigpacket.length = pgp_mem_len(mem_sig);
147 sigpacket.raw = pgp_mem_data(mem_sig);
150 pgp_update_userid(skey, userid, &sigpacket, &sig->sig.info);
152 pgp_update_userid(pkey, userid, &sigpacket, &sig->sig.info);
156 pgp_create_sig_delete(sig);
157 pgp_output_delete(sigoutput);
158 pgp_memory_free(mem_sig);
162 static void add_subkey_binding_signature(pgp_subkeysig_t* p, pgp_key_t* primarykey, pgp_key_t* subkey, pgp_key_t* seckey)
165 pgp_create_sig_t* sig;
166 pgp_output_t* sigoutput = NULL;
167 pgp_memory_t* mem_sig = NULL;
169 sig = pgp_create_sig_new();
170 pgp_sig_start_key_sig(sig, &primarykey->key.pubkey, &subkey->key.pubkey, NULL, PGP_SIG_SUBKEY);
172 pgp_add_creation_time(sig, time(NULL));
173 pgp_add_key_expiration_time(sig, 0);
174 pgp_add_key_flags(sig, PGP_KEYFLAG_ENC_STORAGE|PGP_KEYFLAG_ENC_COMM);
176 pgp_end_hashed_subpkts(sig);
178 pgp_add_issuer_keyid(sig, seckey->pubkeyid);
180 pgp_setup_memory_write(&sigoutput, &mem_sig, 128);
181 pgp_write_sig(sigoutput, sig, &seckey->key.seckey.pubkey, &seckey->key.seckey);
183 p->subkey = primarykey->subkeyc-1;
184 p->packet.length = mem_sig->length;
185 p->packet.raw = mem_sig->buf; mem_sig->buf = NULL;
186 copy_sig_info(&p->siginfo, &sig->sig.info);
188 pgp_create_sig_delete(sig);
189 pgp_output_delete(sigoutput);
194 int mrpgp_create_keypair(
mrmailbox_t* mailbox,
const char* addr, mrkey_t* ret_public_key, mrkey_t* ret_private_key)
197 pgp_key_t seckey, pubkey, subkey;
198 uint8_t subkeyid[PGP_KEY_ID_SIZE];
199 uint8_t* user_id = NULL;
200 pgp_memory_t *pubmem = pgp_memory_new(), *secmem = pgp_memory_new();
201 pgp_output_t *pubout = pgp_output_new(), *secout = pgp_output_new();
203 memset(&seckey, 0,
sizeof(pgp_key_t));
204 memset(&pubkey, 0,
sizeof(pgp_key_t));
205 memset(&subkey, 0,
sizeof(pgp_key_t));
207 if( mailbox==NULL || addr==NULL || ret_public_key==NULL || ret_private_key==NULL
208 || pubmem==NULL || secmem==NULL || pubout==NULL || secout==NULL ) {
220 user_id = (uint8_t*)mr_mprintf(
"<%s>", addr);
223 if( !pgp_rsa_generate_keypair(&seckey, 3072, 65537UL, NULL, NULL, NULL, 0)
224 || !pgp_rsa_generate_keypair(&subkey, 3072, 65537UL, NULL, NULL, NULL, 0) ) {
232 pubkey.type = PGP_PTAG_CT_PUBLIC_KEY;
233 pgp_pubkey_dup(&pubkey.key.pubkey, &seckey.key.pubkey);
234 memcpy(pubkey.pubkeyid, seckey.pubkeyid, PGP_KEY_ID_SIZE);
235 pgp_fingerprint(&pubkey.pubkeyfpr, &seckey.key.pubkey, 0);
236 add_selfsigned_userid(&seckey, &pubkey, (
const uint8_t*)user_id, 0);
238 EXPAND_ARRAY((&pubkey), subkey);
240 pgp_subkey_t* p = &pubkey.subkeys[pubkey.subkeyc++];
241 pgp_pubkey_dup(&p->key.pubkey, &subkey.key.pubkey);
242 pgp_keyid(subkeyid, PGP_KEY_ID_SIZE, &pubkey.key.pubkey, PGP_HASH_SHA1);
243 memcpy(p->id, subkeyid, PGP_KEY_ID_SIZE);
246 EXPAND_ARRAY((&pubkey), subkeysig);
247 add_subkey_binding_signature(&pubkey.subkeysigs[pubkey.subkeysigc++], &pubkey, &subkey, &seckey);
253 EXPAND_ARRAY((&seckey), subkey);
255 pgp_subkey_t* p = &seckey.subkeys[seckey.subkeyc++];
256 pgp_seckey_dup(&p->key.seckey, &subkey.key.seckey);
257 pgp_keyid(subkeyid, PGP_KEY_ID_SIZE, &seckey.key.pubkey, PGP_HASH_SHA1);
258 memcpy(p->id, subkeyid, PGP_KEY_ID_SIZE);
261 EXPAND_ARRAY((&seckey), subkeysig);
262 add_subkey_binding_signature(&seckey.subkeysigs[seckey.subkeysigc++], &seckey, &subkey, &seckey);
268 pgp_writer_set_memory(pubout, pubmem);
269 if( !pgp_write_xfer_key(pubout, &pubkey, 0)
270 || pubmem->buf == NULL || pubmem->length <= 0 ) {
274 pgp_writer_set_memory(secout, secmem);
275 if( !pgp_write_xfer_key(secout, &seckey, 0)
276 || secmem->buf == NULL || secmem->length <= 0 ) {
280 mrkey_set_from_raw(ret_public_key, pubmem->buf, pubmem->length, MR_PUBLIC);
281 mrkey_set_from_raw(ret_private_key, secmem->buf, secmem->length, MR_PRIVATE);
286 if( pubout ) { pgp_output_delete(pubout); }
287 if( secout ) { pgp_output_delete(secout); }
288 if( pubmem ) { pgp_memory_free(pubmem); }
289 if( secmem ) { pgp_memory_free(secmem); }
290 pgp_key_free(&seckey);
291 pgp_key_free(&pubkey);
292 pgp_key_free(&subkey);
303 int mrpgp_is_valid_key(
mrmailbox_t* mailbox,
const mrkey_t* raw_key)
305 int key_is_valid = 0;
306 pgp_keyring_t* public_keys = calloc(1,
sizeof(pgp_keyring_t));
307 pgp_keyring_t* private_keys = calloc(1,
sizeof(pgp_keyring_t));
308 pgp_memory_t* keysmem = pgp_memory_new();
310 if( mailbox==NULL || raw_key==NULL
311 || raw_key->m_binary == NULL || raw_key->m_bytes <= 0
312 || public_keys==NULL || private_keys==NULL || keysmem==NULL ) {
316 pgp_memory_add(keysmem, raw_key->m_binary, raw_key->m_bytes);
318 pgp_filter_keys_from_mem(&s_io, public_keys, private_keys, NULL, 0, keysmem);
320 if( raw_key->m_type == MR_PUBLIC && public_keys->keyc >= 1 ) {
323 else if( raw_key->m_type == MR_PRIVATE && private_keys->keyc >= 1 ) {
328 if( keysmem ) { pgp_memory_free(keysmem); }
329 if( public_keys ) { pgp_keyring_purge(public_keys); free(public_keys); }
330 if( private_keys ) { pgp_keyring_purge(private_keys); free(private_keys); }
335 int mrpgp_calc_fingerprint(
mrmailbox_t* mailbox,
const mrkey_t* raw_key, uint8_t** ret_fingerprint,
size_t* ret_fingerprint_bytes)
338 pgp_keyring_t* public_keys = calloc(1,
sizeof(pgp_keyring_t));
339 pgp_keyring_t* private_keys = calloc(1,
sizeof(pgp_keyring_t));
340 pgp_memory_t* keysmem = pgp_memory_new();
342 if( mailbox==NULL || raw_key==NULL || ret_fingerprint==NULL || *ret_fingerprint!=NULL || ret_fingerprint_bytes==NULL || *ret_fingerprint_bytes!=0
343 || raw_key->m_binary == NULL || raw_key->m_bytes <= 0
344 || public_keys==NULL || private_keys==NULL || keysmem==NULL ) {
348 pgp_memory_add(keysmem, raw_key->m_binary, raw_key->m_bytes);
350 pgp_filter_keys_from_mem(&s_io, public_keys, private_keys, NULL, 0, keysmem);
352 if( raw_key->m_type != MR_PUBLIC || public_keys->keyc <= 0 ) {
356 pgp_key_t* key0 = &public_keys->keys[0];
357 pgp_pubkey_t* pubkey0 = &key0->key.pubkey;
358 if( !pgp_fingerprint(&key0->pubkeyfpr, pubkey0, 0) ) {
362 *ret_fingerprint_bytes = key0->pubkeyfpr.length;
363 *ret_fingerprint = malloc(*ret_fingerprint_bytes);
364 memcpy(*ret_fingerprint, key0->pubkeyfpr.fingerprint, *ret_fingerprint_bytes);
369 if( keysmem ) { pgp_memory_free(keysmem); }
370 if( public_keys ) { pgp_keyring_purge(public_keys); free(public_keys); }
371 if( private_keys ) { pgp_keyring_purge(private_keys); free(private_keys); }
376 int mrpgp_split_key(
mrmailbox_t* mailbox,
const mrkey_t* private_in, mrkey_t* ret_public_key)
379 pgp_keyring_t* public_keys = calloc(1,
sizeof(pgp_keyring_t));
380 pgp_keyring_t* private_keys = calloc(1,
sizeof(pgp_keyring_t));
381 pgp_memory_t* keysmem = pgp_memory_new();
382 pgp_memory_t* pubmem = pgp_memory_new();
383 pgp_output_t* pubout = pgp_output_new();
385 if( mailbox == NULL || private_in==NULL || ret_public_key==NULL
386 || public_keys==NULL || private_keys==NULL || keysmem==NULL || pubmem==NULL || pubout==NULL ) {
390 pgp_memory_add(keysmem, private_in->m_binary, private_in->m_bytes);
391 pgp_filter_keys_from_mem(&s_io, public_keys, private_keys, NULL, 0, keysmem);
393 if( private_in->m_type!=MR_PRIVATE || private_keys->keyc <= 0 ) {
394 mrmailbox_log_warning(mailbox, 0,
"Split key: Given key is no private key.");
398 if( public_keys->keyc <= 0 ) {
399 mrmailbox_log_warning(mailbox, 0,
"Split key: Given key does not contain a public key.");
403 pgp_writer_set_memory(pubout, pubmem);
404 if( !pgp_write_xfer_key(pubout, &public_keys->keys[0], 0)
405 || pubmem->buf == NULL || pubmem->length <= 0 ) {
409 mrkey_set_from_raw(ret_public_key, pubmem->buf, pubmem->length, MR_PUBLIC);
414 if( pubout ) { pgp_output_delete(pubout); }
415 if( pubmem ) { pgp_memory_free(pubmem); }
416 if( keysmem ) { pgp_memory_free(keysmem); }
417 if( public_keys ) { pgp_keyring_purge(public_keys); free(public_keys); }
418 if( private_keys ) { pgp_keyring_purge(private_keys); free(private_keys); }
429 const void* plain_text,
431 const mrkeyring_t* raw_public_keys_for_encryption,
432 const mrkey_t* raw_private_key_for_signing,
435 size_t* ret_ctext_bytes)
437 pgp_keyring_t* public_keys = calloc(1,
sizeof(pgp_keyring_t));
438 pgp_keyring_t* private_keys = calloc(1,
sizeof(pgp_keyring_t));
439 pgp_keyring_t* dummy_keys = calloc(1,
sizeof(pgp_keyring_t));
440 pgp_memory_t* keysmem = pgp_memory_new();
441 pgp_memory_t* signedmem = NULL;
444 if( mailbox==NULL || plain_text==NULL || plain_bytes==0 || ret_ctext==NULL || ret_ctext_bytes==NULL
445 || raw_public_keys_for_encryption==NULL || raw_public_keys_for_encryption->m_count<=0
446 || keysmem==NULL || public_keys==NULL || private_keys==NULL || dummy_keys==NULL ) {
451 *ret_ctext_bytes = 0;
454 for( i = 0; i < raw_public_keys_for_encryption->m_count; i++ ) {
455 pgp_memory_add(keysmem, raw_public_keys_for_encryption->m_keys[i]->m_binary, raw_public_keys_for_encryption->m_keys[i]->m_bytes);
458 pgp_filter_keys_from_mem(&s_io, public_keys, private_keys, NULL, 0, keysmem);
459 if( public_keys->keyc <=0 || private_keys->keyc!=0 ) {
460 mrmailbox_log_warning(mailbox, 0,
"Encryption-keyring contains unexpected data (%i/%i)", public_keys->keyc, private_keys->keyc);
466 const void* signed_text = NULL;
467 size_t signed_bytes = 0;
468 int encrypt_raw_packet = 0;
470 if( raw_private_key_for_signing ) {
471 pgp_memory_clear(keysmem);
472 pgp_memory_add(keysmem, raw_private_key_for_signing->m_binary, raw_private_key_for_signing->m_bytes);
473 pgp_filter_keys_from_mem(&s_io, dummy_keys, private_keys, NULL, 0, keysmem);
474 if( private_keys->keyc <= 0 ) {
475 mrmailbox_log_warning(mailbox, 0,
"No key for signing found.");
479 pgp_key_t* sk0 = &private_keys->keys[0];
480 signedmem = pgp_sign_buf(&s_io, plain_text, plain_bytes, &sk0->key.seckey, time(NULL), 0,
"sha1", 0, 0);
481 if( signedmem == NULL ) {
482 mrmailbox_log_warning(mailbox, 0,
"Signing failed.");
485 signed_text = signedmem->buf;
486 signed_bytes = signedmem->length;
487 encrypt_raw_packet = 1;
490 signed_text = plain_text;
491 signed_bytes = plain_bytes;
492 encrypt_raw_packet = 0;
495 pgp_memory_t* outmem = pgp_encrypt_buf(&s_io, signed_text, signed_bytes, public_keys, use_armor, NULL, encrypt_raw_packet);
496 if( outmem == NULL ) {
497 mrmailbox_log_warning(mailbox, 0,
"Encryption failed.");
500 *ret_ctext = outmem->buf;
501 *ret_ctext_bytes = outmem->length;
508 if( keysmem ) { pgp_memory_free(keysmem); }
509 if( signedmem ) { pgp_memory_free(signedmem); }
510 if( public_keys ) { pgp_keyring_purge(public_keys); free(public_keys); }
511 if( private_keys ) { pgp_keyring_purge(private_keys); free(private_keys); }
512 if( dummy_keys ) { pgp_keyring_purge(dummy_keys); free(dummy_keys); }
520 const mrkeyring_t* raw_private_keys_for_decryption,
521 const mrkey_t* raw_public_key_for_validation,
524 size_t* ret_plain_bytes,
525 int* ret_validation_errors)
527 pgp_keyring_t* public_keys = calloc(1,
sizeof(pgp_keyring_t));
528 pgp_keyring_t* private_keys = calloc(1,
sizeof(pgp_keyring_t));
529 pgp_keyring_t* dummy_keys = calloc(1,
sizeof(pgp_keyring_t));
530 pgp_validation_t* vresult = calloc(1,
sizeof(pgp_validation_t));
531 key_id_t* recipients_key_ids = NULL;
532 unsigned recipients_count = 0;
533 pgp_memory_t* keysmem = pgp_memory_new();
536 if( mailbox==NULL || ctext==NULL || ctext_bytes==0 || ret_plain==NULL || ret_plain_bytes==NULL || ret_validation_errors==NULL
537 || raw_private_keys_for_decryption==NULL || raw_private_keys_for_decryption->m_count<=0
538 || vresult==NULL || keysmem==NULL || public_keys==NULL || private_keys==NULL ) {
543 *ret_plain_bytes = 0;
546 for( i = 0; i < raw_private_keys_for_decryption->m_count; i++ ) {
547 pgp_memory_add(keysmem, raw_private_keys_for_decryption->m_keys[i]->m_binary, raw_private_keys_for_decryption->m_keys[i]->m_bytes);
550 pgp_filter_keys_from_mem(&s_io, dummy_keys, private_keys, NULL, 0, keysmem);
551 if( private_keys->keyc<=0 ) {
552 mrmailbox_log_warning(mailbox, 0,
"Decryption-keyring contains unexpected data (%i/%i)", public_keys->keyc, private_keys->keyc);
556 if( raw_public_key_for_validation ) {
557 pgp_memory_clear(keysmem);
558 pgp_memory_add(keysmem, raw_public_key_for_validation->m_binary, raw_public_key_for_validation->m_bytes);
559 pgp_filter_keys_from_mem(&s_io, public_keys, dummy_keys, NULL, 0, keysmem);
564 pgp_memory_t* outmem = pgp_decrypt_and_validate_buf(&s_io, vresult, ctext, ctext_bytes, private_keys, public_keys,
565 use_armor, &recipients_key_ids, &recipients_count);
566 if( outmem == NULL ) {
567 mrmailbox_log_warning(mailbox, 0,
"Decryption failed.");
570 *ret_plain = outmem->buf;
571 *ret_plain_bytes = outmem->length;
575 *ret_validation_errors = 0;
576 if( vresult->validc <= 0 && vresult->invalidc <= 0 && vresult->unknownc <= 0 )
579 *ret_validation_errors = MR_VALIDATE_NO_SIGNATURE;
581 else if( raw_public_key_for_validation==NULL || vresult->unknownc > 0 )
584 *ret_validation_errors = MR_VALIDATE_UNKNOWN_SIGNATURE;
586 else if( vresult->invalidc > 0 )
589 *ret_validation_errors = MR_VALIDATE_BAD_SIGNATURE;
601 if( keysmem ) { pgp_memory_free(keysmem); }
602 if( public_keys ) { pgp_keyring_purge(public_keys); free(public_keys); }
603 if( private_keys ) { pgp_keyring_purge(private_keys); free(private_keys); }
604 if( dummy_keys ) { pgp_keyring_purge(dummy_keys); free(dummy_keys); }
605 if( vresult ) { pgp_validate_result_free(vresult); }
606 if( recipients_key_ids ) { free(recipients_key_ids); }
An object representing a single mailbox.