generator: allow own PRNG seed source
This commit is contained in:
		
							parent
							
								
									d53586d582
								
							
						
					
					
						commit
						dc3a874cd5
					
				|  | @ -1,4 +1,4 @@ | |||
| #!/bin/sh | ||||
| #!/bin/bash | ||||
| 
 | ||||
| # simple autogen script that generates basic layout for autotools. | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										20
									
								
								man/ccr.1
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								man/ccr.1
									
									
									
									
									
								
							|  | @ -237,9 +237,14 @@ private keyring. | |||
| Backups of user data (i.e. for each file the last state that was loaded | ||||
| successfully) are, on each change, written to files "pubkeys~" and "secrets~". | ||||
| 
 | ||||
| When Codecrypt is running, it locks the .ccr directory using a lockfile "lock" | ||||
| When Codecrypt is running, it locks the ".ccr" directory using a lockfile "lock" | ||||
| and applying flock(2) to it. | ||||
| 
 | ||||
| For seeding the random number generator, Codecrypt uses data from "/dev/random" | ||||
| for generating keys and "/dev/urandom" for everything else, e.g. nonces or | ||||
| envelopes. Both cases can be overriden at once by specifying some other | ||||
| filename in environment variable CCR_RANDOM_SEED. | ||||
| 
 | ||||
| .SH RETURN VALUE | ||||
| 
 | ||||
| \fBccr\fR returns exit status 0 if there was no error and all cryptography went | ||||
|  | @ -353,6 +358,17 @@ import of keys can bring serious inconsistencies into your key naming scheme. | |||
| In a distant universe after much computation, KeyIDs can collide. If you find | ||||
| someone who has a colliding KeyID, kiss him and generate another key. | ||||
| 
 | ||||
| .SS Own sources of random seed | ||||
| 
 | ||||
| Using CCR_RANDOM_SEED is slightly counterintuitive and dangerous, use it only | ||||
| for debugging. | ||||
| 
 | ||||
| If your system does not have /dev/(u)random, make a port by choosing a safe | ||||
| value in the source code instead of specifying the seed each time you invoke | ||||
| Codecrypt. | ||||
| 
 | ||||
| If the seed source of your system can not be trusted, fix the system instead. | ||||
| 
 | ||||
| .SH Troubleshooting/FAQ | ||||
| 
 | ||||
| Q: I can't read/verify messages from versions 1.3.1 and older! | ||||
|  | @ -443,5 +459,5 @@ it with caution. | |||
| 
 | ||||
| .SH AUTHORS | ||||
| 
 | ||||
| Codecrypt was written by Mirek Kratochvil in 2013-2016. | ||||
| Codecrypt was written by Mirek Kratochvil in 2013-2017. | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| /*
 | ||||
|  * This file is part of Codecrypt. | ||||
|  * | ||||
|  * Copyright (C) 2013-2016 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * Copyright (C) 2013-2017 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * | ||||
|  * Codecrypt is free software: you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU Lesser General Public License as published by | ||||
|  | @ -46,6 +46,8 @@ | |||
| #define MSG_CLEARTEXT "MESSAGE-IN-CLEARTEXT" | ||||
| #define MSG_DETACHED "MESSAGE-DETACHED" | ||||
| 
 | ||||
| #define SEED_FAILED { err("error: could not seed PRNG"); return 1; } | ||||
| 
 | ||||
| inline bool open_keyring (keyring&KR) | ||||
| { | ||||
| 	if (!KR.open()) { | ||||
|  | @ -62,7 +64,7 @@ int action_gen_symkey (const std::string&algspec, | |||
| { | ||||
| 	symkey sk; | ||||
| 	ccr_rng r; | ||||
| 	r.seed (256); | ||||
| 	if (!r.seed (256)) SEED_FAILED; | ||||
| 
 | ||||
| 	if (!sk.create (algspec, r)) { | ||||
| 		err ("error: symkey creation failed"); | ||||
|  | @ -219,7 +221,7 @@ int action_gen_key (const std::string& p_algspec, const std::string&name, | |||
| 	err ("If nothing happens, move mouse, type random stuff on keyboard,"); | ||||
| 	err ("or just wait longer."); | ||||
| 
 | ||||
| 	r.seed (512, false); | ||||
| 	if (!r.seed (512, false)) SEED_FAILED; | ||||
| 
 | ||||
| 	err ("Seeding done, generating the key..."); | ||||
| 
 | ||||
|  | @ -312,7 +314,7 @@ int action_sym_encrypt (const std::string&symmetric, bool armor) | |||
| 	sencode_destroy (SK); | ||||
| 
 | ||||
| 	ccr_rng r; | ||||
| 	r.seed (256); | ||||
| 	if (!r.seed (256)) SEED_FAILED; | ||||
| 
 | ||||
| 	if (!sk.encrypt (std::cin, std::cout, r)) { | ||||
| 		err ("error: encryption failed"); | ||||
|  | @ -375,7 +377,7 @@ int action_encrypt (const std::string&recipient, bool armor, | |||
| 	//encryption part
 | ||||
| 	encrypted_msg msg; | ||||
| 	ccr_rng r; | ||||
| 	r.seed (256); | ||||
| 	if (!r.seed (256)) SEED_FAILED; | ||||
| 
 | ||||
| 	bvector plaintext; | ||||
| 	plaintext.from_string (data); | ||||
|  | @ -589,7 +591,7 @@ int action_hash_sign (bool armor, const std::string&symmetric) | |||
| 		parts.resize (1); | ||||
| 		base64_encode (data, parts[0]); | ||||
| 		ccr_rng r; | ||||
| 		r.seed (128); | ||||
| 		if (!r.seed (256)) SEED_FAILED; | ||||
| 		data = envelope_format (ENVELOPE_HASHFILE, parts, r); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -679,7 +681,7 @@ int action_sign (const std::string&user, bool armor, const std::string&detach, | |||
| 	//signature production part
 | ||||
| 	signed_msg msg; | ||||
| 	ccr_rng r; | ||||
| 	r.seed (256); | ||||
| 	if (!r.seed (256)) SEED_FAILED; | ||||
| 
 | ||||
| 	bvector message; | ||||
| 	message.from_string (data); | ||||
|  | @ -1120,7 +1122,7 @@ int action_sign_encrypt (const std::string&user, const std::string&recipient, | |||
| 	//make a signature
 | ||||
| 	signed_msg smsg; | ||||
| 	ccr_rng r; | ||||
| 	r.seed (256); | ||||
| 	if (!r.seed (256)) SEED_FAILED; | ||||
| 
 | ||||
| 	bvector bv; | ||||
| 	bv.from_string (data); | ||||
|  | @ -1521,7 +1523,7 @@ int action_export (bool armor, | |||
| 		parts.resize (1); | ||||
| 		base64_encode (data, parts[0]); | ||||
| 		ccr_rng r; | ||||
| 		r.seed (128); | ||||
| 		if (!r.seed (256)) SEED_FAILED; | ||||
| 		data = envelope_format (ENVELOPE_PUBKEYS, parts, r); | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1777,7 +1779,7 @@ int action_export_sec (bool armor, bool yes, | |||
| 		parts.resize (1); | ||||
| 		base64_encode (data, parts[0]); | ||||
| 		ccr_rng r; | ||||
| 		r.seed (128); | ||||
| 		if (!r.seed (256)) SEED_FAILED; | ||||
| 		data = envelope_format (ENVELOPE_SECRETS, parts, r); | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| /*
 | ||||
|  * This file is part of Codecrypt. | ||||
|  * | ||||
|  * Copyright (C) 2013-2016 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * Copyright (C) 2013-2017 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * | ||||
|  * Codecrypt is free software: you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU Lesser General Public License as published by | ||||
|  | @ -19,16 +19,20 @@ | |||
|  */ | ||||
| 
 | ||||
| #include "generator.h" | ||||
| #include "iohelpers.h" | ||||
| 
 | ||||
| #include <fstream> | ||||
| #include <vector> | ||||
| 
 | ||||
| #include <string.h> //for strerror
 | ||||
| #include <stdlib.h> //for getenv
 | ||||
| 
 | ||||
| static inline uint bytes (uint bits) | ||||
| { | ||||
| 	return (bits >> 3) + ( (bits & 7) ? 1 : 0); | ||||
| } | ||||
| 
 | ||||
| void ccr_rng::seed (uint bits, bool quick) | ||||
| bool ccr_rng::seed (uint bits, bool quick) | ||||
| { | ||||
| 	std::vector<byte> s; | ||||
| 	std::ifstream f; | ||||
|  | @ -36,12 +40,22 @@ void ccr_rng::seed (uint bits, bool quick) | |||
| 	uint b = bytes (bits); | ||||
| 	if (b > 256) b = 256; | ||||
| 
 | ||||
| 	f.open (quick ? "/dev/urandom" : "/dev/random", | ||||
| 	        std::ios::in | std::ios::binary); | ||||
| 	char*user_source = getenv ("CCR_RANDOM_SEED"); | ||||
| 	std::string seed_source = user_source ? user_source : | ||||
| 	                          quick ? "/dev/urandom" : | ||||
| 	                          "/dev/random"; | ||||
| 
 | ||||
| 	f.open (seed_source, std::ios::in | std::ios::binary); | ||||
| 	if (!f.good()) { | ||||
| 		err ("opening " << seed_source << " failed: " | ||||
| 		     << strerror (errno)); | ||||
| 		return false; | ||||
| 	} | ||||
| 	s.resize (b); | ||||
| 	for (uint i = 0; i < b; ++i) f >> s[i]; | ||||
| 	f.close(); | ||||
| 
 | ||||
| 	r.load_key_vector (s); | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| /*
 | ||||
|  * This file is part of Codecrypt. | ||||
|  * | ||||
|  * Copyright (C) 2013-2016 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * Copyright (C) 2013-2017 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * | ||||
|  * Codecrypt is free software: you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU Lesser General Public License as published by | ||||
|  | @ -40,7 +40,7 @@ public: | |||
| 		r.clear(); | ||||
| 	} | ||||
| 
 | ||||
| 	void seed (uint bits, bool quick = true); | ||||
| 	bool seed (uint bits, bool quick = true); | ||||
| 
 | ||||
| 	uint random (uint n) { | ||||
| 		randmax_type i; | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| /*
 | ||||
|  * This file is part of Codecrypt. | ||||
|  * | ||||
|  * Copyright (C) 2013-2016 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * Copyright (C) 2013-2017 Mirek Kratochvil <exa.exa@gmail.com> | ||||
|  * | ||||
|  * Codecrypt is free software: you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU Lesser General Public License as published by | ||||
|  | @ -23,7 +23,7 @@ | |||
| void print_version() | ||||
| { | ||||
| 	out ("codecrypt " PACKAGE_VERSION); | ||||
| 	out ("Copyright (C) 2013-2016 Mirek Kratochvil <exa.exa@gmail.com>"); | ||||
| 	out ("Copyright (C) 2013-2017 Mirek Kratochvil <exa.exa@gmail.com>"); | ||||
| 	out ("This is free software; see the source " | ||||
| 	     "for copying conditions.  There is NO"); | ||||
| 	out ("warranty; not even for MERCHANTABILITY " | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ | |||
| #include <stdint.h> | ||||
| 
 | ||||
| /*
 | ||||
|  * XSYND is a stream cipher based on XSYND, the stream cipher with | ||||
|  * This is a stream cipher based on XSYND, the stream cipher with | ||||
|  * mathematicaly provable (AND also proven) security. | ||||
|  * | ||||
|  * Parameters chosen for this implementation were chosen to have better attack | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue