rmd160 und losetup

Wie ich hier bereits erwähnte, hab ich mir den Source von losetup (util-linux-2.11z-25) angeschaut. Nun hab ich dort folgenden Code gefunden:
Code:
#define HASHLENGTH 20
#define PASSWDBUFFLEN 130 /* getpass returns only max. 128 bytes, see man getpass */
#define LO_NAME_SIZE	64
#define LO_KEY_SIZE	32

struct loop_info {
//:
	int		lo_encrypt_key_size; 	/* ioctl w/o */
	unsigned char	lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
	unsigned long	lo_init[2];
//:
};
//:
		pass = getthepass("Password: ");
		strncpy(passwdbuff+1,pass,PASSWDBUFFLEN-1);
		passwdbuff[0] = 'A';
		rmd160_hash_buffer(keybits,pass,strlen(pass));
		rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,strlen(pass)+1);
		memcpy((char*)loopinfo.lo_encrypt_key,keybits,2*HASHLENGTH);
//:
		loopinfo.lo_encrypt_key_size=keylength;//Im Fall von twofish 20

//:
Das ist nur ein kurzer Auszug.
Ersteinmal wollte ich fragen, ob dass nicht etwas gewagt ist, einfach 40 byte zu kopieren, die dann in 32-chars und 2 unsigned longs landet, immerhin muss ein unsigned long ja nicht 4 bytes lang sein (oder?).
Außerdem noch zum Hash. Es wird ja einmal das Passwort gehasht und dann das Passwort mit einem vorangestellten 'A' gehasht. Ist das nicht etwas unsicher? Es wird in diesem Fall zwar die Key-len auf 20 gesetzt, so das der zweite Hash nur für die inits sind, aber trotzdem! Könnte man die Keylenght nicht hochsetzen, oder wird es dadurch eher unsicherer?!
Und noch allgmeinen zu rmd160:
Es soll ein Hash sein, der ähnlich md4 ist und wie der Name schon sagt einen 160 bit (=20byte) Hash liefert. Leider habe ich nichts direkt zur Sicherheit gelesen, nur das der Hash "frei" ist.
 
Auf Linux ist u_long 4 Bytes gross (unter anderen imo auch), solange es sich um 32 bittige systeme handelt.
Passwort wird in pass gelesen und dann ab dem 1. element in array passwdbuff gelesen. passwdbuff[0] erhaelt das "A". Das passwort wird nur einmal "gehasht".

Könnte man die Keylenght nicht hochsetzen,
Worauf wartest du ? ;)

mfg
 
Zurück
Oben