]> git.pld-linux.org Git - packages/util-linux.git/blame - util-linux-crypto-debian.patch
- util-linux switched to a new maintainer and is now available from
[packages/util-linux.git] / util-linux-crypto-debian.patch
CommitLineData
95efaa7a
AM
1--- util-linux-2.12.orig/mount/Makefile
2+++ util-linux-2.12/mount/Makefile
3@@ -24,7 +26,7 @@
4
5 MAYBE = pivot_root swapoff
6
7-LO_OBJS = lomount.o $(LIB)/xstrncpy.o
8+LO_OBJS = lomount.o $(LIB)/xstrncpy.o rmd160.o
9 NFS_OBJS = nfsmount.o nfsmount_xdr.o nfsmount_clnt.o
10 GEN_FILES = nfsmount.h nfsmount_xdr.c nfsmount_clnt.c
11
12@@ -57,7 +59,7 @@
13 main_losetup.o: lomount.c
14 $(COMPILE) -DMAIN lomount.c -o $@
15
16-losetup: main_losetup.o $(LIB)/xstrncpy.o
17+losetup: main_losetup.o $(LIB)/xstrncpy.o rmd160.o
18 $(LINK) $^ -o $@
19
20 mount.o umount.o nfsmount.o losetup.o fstab.o realpath.o sundries.o: sundries.h
85946069
JB
21--- util-linux-2.12/mount/lomount.c.orig 2003-07-17 01:56:53.000000000 +0200
22+++ util-linux-2.12/mount/lomount.c 2004-08-04 19:27:23.000000000 +0200
95efaa7a
AM
23@@ -33,15 +33,80 @@
24
25 #include "loop.h"
26 #include "lomount.h"
27+#include "rmd160.h"
28 #include "xstrncpy.h"
29 #include "nls.h"
30
31 extern int verbose;
32-extern char *xstrdup (const char *s); /* not: #include "sundries.h" */
33+extern char *xstrdup (const char *s); /* not: #include "sundries.h" */
34 extern void error (const char *fmt, ...); /* idem */
35
36 #ifdef LOOP_SET_FD
37
38+#include <getopt.h>
39+#include <stdarg.h>
40+
41+struct crypt_type_struct {
42+ int id;
43+ char *name;
44+ int keylength;
45+} crypt_type_tbl[] = {
46+ { LO_CRYPT_NONE, "none", 0 },
47+ { LO_CRYPT_XOR, "xor", 0 },
48+ { LO_CRYPT_DES, "des", 8 },
49+ { LO_CRYPT_FISH2, "twofish", 20 },
50+ { LO_CRYPT_BLOW, "blowfish", 20 },
51+ { LO_CRYPT_CAST128, "cast", 16 },
52+ { LO_CRYPT_SERPENT, "serpent", 16 },
53+ { LO_CRYPT_MARS, "mars", 16 },
54+ { LO_CRYPT_RC6, "rc6", 16 },
55+ { LO_CRYPT_3DES, "des-ede3", 24 },
56+ { LO_CRYPT_DFC, "dfc", 16 },
57+ { LO_CRYPT_IDEA, "idea", 16 },
58+ { LO_CRYPT_RIJNDAEL, "rijndael", 16 },
59+ { -1, NULL,0 }
60+};
61+
62+static struct option longopts[] = {
63+ { "delete", 0, 0, 'd' },
64+ { "detach", 0, 0, 'd' },
65+ { "encryption", 1, 0, 'e' },
66+ { "help", 0, 0, 'h' },
67+ { "nopasshash", 1, 0, 'N' },
68+ { "offset", 1, 0, 'o' },
69+ { "pass-fd", 1, 0, 'p' },
70+ { "verbose", 0, 0, 'v' },
71+ { "keybits", 1, 0, 'k' },
72+ { NULL, 0, 0, 0 }
73+};
74+
75+static int
76+name_to_id(const char *name)
77+{
78+ int i;
79+
80+ if (name) {
81+ for (i = 0; crypt_type_tbl[i].id != -1; i++)
82+ if (!strcasecmp (name, crypt_type_tbl[i].name))
83+ return crypt_type_tbl[i].id;
84+ } else
85+ return LO_CRYPT_NONE;
86+ return LO_CRYPT_CRYPTOAPI;
87+}
88+
89+#ifdef MAIN
90+static char *
91+id_to_name(int id) {
92+ int i;
93+
94+ for (i = 0; crypt_type_tbl[i].id != -1; i++)
95+ if (id == crypt_type_tbl[i].id)
96+ return crypt_type_tbl[i].name;
97+ return "undefined";
98+}
99+#endif
100+
101+
102 static int
103 loop_info64_to_old(const struct loop_info64 *info64, struct loop_info *info)
104 {
85946069
JB
105@@ -126,7 +191,8 @@
106 printf(_(", offset %d"), loopinfo.lo_offset);
95efaa7a 107
85946069
JB
108 if (loopinfo.lo_encrypt_type)
109- printf(_(", encryption type %d\n"),
110+ printf(_(", encryption %s (type %d)\n"),
111+ id_to_name(loopinfo.lo_encrypt_type),
112 loopinfo.lo_encrypt_type);
113
114 printf("\n");
115@@ -189,10 +255,9 @@
95efaa7a
AM
116 error(_("mount: could not find any device /dev/loop#"));
117 else if (!someloop) {
118 error(_(
119- "mount: Could not find any loop device. Maybe this kernel "
120- "does not know\n"
121- " about the loop device? (If so, recompile or "
122- "`modprobe loop'.)"));
123+ "mount: Could not find any loop device. Maybe this kernel does not know\n"
124+ " about the loop device? (If so, recompile or `modprobe loop'), or\n"
125+ " maybe /dev/loop# has the wrong major number?"));
126 } else
127 error(_("mount: could not find any free loop device"));
128 return 0;
85946069 129@@ -247,10 +312,20 @@
95efaa7a
AM
130
131 int
132 set_loop(const char *device, const char *file, int offset,
133- const char *encryption, int pfd, int *loopro) {
134+ const char *encryption, int pfd, int keysz, int *loopro, int hash_password) {
135 struct loop_info64 loopinfo64;
136 int fd, ffd, mode;
137 char *pass;
138+ int tried_old;
139+
140+ int kerneli=open("/proc/crypto/cipher",O_RDONLY);
141+
142+ if (kerneli>=0) {
143+ close(kerneli);
144+ kerneli=1;
145+ } else {
146+ kerneli=0;
147+ }
148
149 mode = (*loopro ? O_RDONLY : O_RDWR);
150 if ((ffd = open(file, mode)) < 0) {
85946069 151@@ -276,8 +351,13 @@
95efaa7a
AM
152 loopinfo64.lo_encrypt_type = atoi(encryption);
153 } else {
154 loopinfo64.lo_encrypt_type = LO_CRYPT_CRYPTOAPI;
155- snprintf(loopinfo64.lo_crypt_name, LO_NAME_SIZE,
156+ if (kerneli)
157+ snprintf(loopinfo64.lo_crypt_name, LO_NAME_SIZE,
158+ "%s-cbc", encryption);
159+ else
160+ snprintf(loopinfo64.lo_crypt_name, LO_NAME_SIZE,
161 "%s", encryption);
162+ loopinfo64.lo_crypt_name[LO_NAME_SIZE-1] = 0;
163 }
164 }
165
85946069 166@@ -296,29 +376,98 @@
95efaa7a
AM
167 }
168 #endif
169
170+ if (keysz==0)
171+ keysz=LO_KEY_SIZE*8;
172+ tried_old=0;
173+again:
174 switch (loopinfo64.lo_encrypt_type) {
175 case LO_CRYPT_NONE:
176 loopinfo64.lo_encrypt_key_size = 0;
177 break;
178 case LO_CRYPT_XOR:
179 pass = getpass(_("Password: "));
180- xstrncpy(loopinfo64.lo_encrypt_key, pass, LO_KEY_SIZE);
181+ xstrncpy(loopinfo64.lo_encrypt_key, pass, keysz/8);
182 loopinfo64.lo_encrypt_key_size =
183 strlen(loopinfo64.lo_encrypt_key);
184 break;
185- default:
186+ case LO_CRYPT_FISH2:
187+ case LO_CRYPT_BLOW:
188+ case LO_CRYPT_IDEA:
189+ case LO_CRYPT_CAST128:
190+ case LO_CRYPT_SERPENT:
191+ case LO_CRYPT_MARS:
192+ case LO_CRYPT_RC6:
193+ case LO_CRYPT_3DES:
194+ case LO_CRYPT_DFC:
195+ case LO_CRYPT_RIJNDAEL:
196+ {
197+#define HASHLENGTH 20
198+#define PASSWDBUFFLEN 130 /* getpass returns only max. 128 bytes, see man getpass */
199+ char keybits[2*HASHLENGTH];
200+ char passwdbuff[PASSWDBUFFLEN];
201+ int keylength;
202+ int i;
203+
204 pass = xgetpass(pfd, _("Password: "));
205- xstrncpy(loopinfo64.lo_encrypt_key, pass, LO_KEY_SIZE);
206- loopinfo64.lo_encrypt_key_size = LO_KEY_SIZE;
207+ strncpy(passwdbuff+1,pass,PASSWDBUFFLEN-1);
208+ passwdbuff[PASSWDBUFFLEN-1] = '\0';
209+ passwdbuff[0] = 'A';
210+ rmd160_hash_buffer(keybits,pass,strlen(pass));
211+ rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,strlen(pass)+1);
212+ memcpy((char*)loopinfo64.lo_encrypt_key,keybits,2*HASHLENGTH);
213+ keylength=0;
214+ for(i=0; crypt_type_tbl[i].id != -1; i++){
215+ if(loopinfo64.lo_encrypt_type == crypt_type_tbl[i].id){
216+ keylength = crypt_type_tbl[i].keylength;
217+ break;
218+ }
219+ }
220+ loopinfo64.lo_encrypt_key_size=keylength;
221+ break;
222+ }
223+ default:
224+ if (hash_password) {
225+ char keybits[2*HASHLENGTH];
226+ char passwdbuff[PASSWDBUFFLEN];
227+
228+ pass = xgetpass(pfd, _("Password: "));
229+ strncpy(passwdbuff+1,pass,PASSWDBUFFLEN-1);
230+ passwdbuff[PASSWDBUFFLEN-1] = '\0';
231+ passwdbuff[0] = 'A';
232+ rmd160_hash_buffer(keybits,pass,strlen(pass));
233+ rmd160_hash_buffer(keybits+HASHLENGTH,passwdbuff,strlen(pass)+1);
234+ memcpy((char*)loopinfo64.lo_encrypt_key,keybits,keysz/8);
235+ } else {
236+ pass = xgetpass(pfd, _("Password: "));
237+ xstrncpy(loopinfo64.lo_encrypt_key, pass, keysz/8);
238+ }
239+ loopinfo64.lo_encrypt_key_size = keysz/8;
240 }
241
242 if (ioctl(fd, LOOP_SET_FD, ffd) < 0) {
243 perror("ioctl: LOOP_SET_FD");
244 return 1;
245 }
246- close (ffd);
247-
248- if (ioctl(fd, LOOP_SET_STATUS64, &loopinfo64) < 0) {
249+ if (kerneli) {
250+ struct loop_info loopinfo;
251+ loop_info64_to_old(&loopinfo64,&loopinfo);
252+ if (ioctl (fd, LOOP_SET_STATUS, &loopinfo) < 0) {
253+ /* Try again with old-style LO_CRYPT_XX if
254+ new-style LO_CRYPT_CRYPTOAPI ioctl didn't work */
255+ if (tried_old) {
256+ error("The cipher does not exist, or a cipher module "
257+ "needs to be loaded into the kernel");
258+ perror ("ioctl: LOOP_SET_STATUS");
259+ goto fail;
260+ }
261+ strncpy (loopinfo64.lo_file_name, file, LO_NAME_SIZE);
262+ loopinfo64.lo_file_name[LO_NAME_SIZE - 1] = 0;
263+ loopinfo64.lo_encrypt_type = name_to_id (encryption);
264+ tried_old = 1;
265+ goto again;
266+ }
267+ } else {
268+ if (ioctl(fd, LOOP_SET_STATUS64, &loopinfo64) < 0) {
269 struct loop_info loopinfo;
270 int errsv = errno;
271
85946069 272@@ -333,8 +482,10 @@
95efaa7a
AM
273 perror("ioctl: LOOP_SET_STATUS");
274 goto fail;
275 }
276+ }
277 }
278
279+ close (ffd);
280 close (fd);
281 if (verbose > 1)
282 printf(_("set_loop(%s,%s,%d): success\n"),
85946069 283@@ -343,6 +494,7 @@
95efaa7a
AM
284
285 fail:
286 (void) ioctl (fd, LOOP_CLR_FD, 0);
287+ close (ffd);
288 close (fd);
289 return 1;
290 }
85946069 291@@ -411,8 +563,24 @@
95efaa7a
AM
292 fprintf(stderr, _("usage:\n\
293 %s loop_device # give info\n\
294 %s -d loop_device # delete\n\
295- %s [ -e encryption ] [ -o offset ] loop_device file # setup\n"),
296- progname, progname, progname);
297+ %s [ options ] loop_device file # setup\n\
298+ where options include\n\
299+ --offset <num>, -o <num>\n\
300+ start at offset <num> into file.\n\
301+ --pass-fd <num>, -p <num>\n\
302+ read passphrase from file descriptor <num>\n\
303+ instead of the terminal.\n\
304+ --encryption <cipher>, -e <cipher>\n\
305+ encrypt with <cipher>.\n\
306+ Check /proc/crypto or /proc/crypto/cipher for available ciphers.\n\
307+ --nohashpass, -N\n\
308+ Don't hash the password given. (previous versions hash, non-debian doesn't.\n\
309+ --keybits <num>, -k <num>\n\
310+ specify number of bits in the hashed key given\n\
311+ to the cipher. Some ciphers support several key\n\
312+ sizes and might be more efficient with a smaller\n\
313+ key size. Key sizes < 128 are generally not\n\
314+ recommended\n"), progname, progname, progname);
315 exit(1);
316 }
317
85946069 318@@ -445,20 +613,23 @@
95efaa7a
AM
319
320 int
321 main(int argc, char **argv) {
322- char *offset, *encryption, *passfd;
323+ char *offset, *encryption, *passfd, *keysize;
324 int delete, off, c;
325 int res = 0;
326 int ro = 0;
327 int pfd = -1;
328+ int keysz = 0;
329+ int hash_password = 1;
330
331 setlocale(LC_ALL, "");
332 bindtextdomain(PACKAGE, LOCALEDIR);
333 textdomain(PACKAGE);
334
335 delete = off = 0;
336- offset = encryption = passfd = NULL;
337+ offset = encryption = passfd = keysize = NULL;
338 progname = argv[0];
339- while ((c = getopt(argc,argv,"de:E:o:p:v")) != -1) {
340+ while ((c = getopt_long(argc,argv,"de:E:hk:No:p:v",
341+ longopts, NULL)) != EOF) {
342 switch (c) {
343 case 'd':
344 delete = 1;
85946069 345@@ -467,6 +638,12 @@
95efaa7a
AM
346 case 'e':
347 encryption = optarg;
348 break;
349+ case 'N':
350+ hash_password=0;
351+ break;
352+ case 'k':
353+ keysize = optarg;
354+ break;
355 case 'o':
356 offset = optarg;
357 break;
85946069 358@@ -494,8 +671,10 @@
95efaa7a
AM
359 usage();
360 if (passfd && sscanf(passfd,"%d",&pfd) != 1)
361 usage();
362+ if (keysize && sscanf(keysize,"%d",&keysz) != 1)
363+ usage();
364 res = set_loop(argv[optind], argv[optind+1], off,
365- encryption, pfd, &ro);
366+ encryption, pfd, keysz, &ro, hash_password);
367 }
368 return res;
369 }
370--- util-linux-2.12.orig/mount/lomount.h
371+++ util-linux-2.12/mount/lomount.h
372@@ -1,6 +1,6 @@
373 extern int verbose;
374 extern int set_loop(const char *, const char *, int, const char *,
375- int, int *);
376+ int, int, int *, int);
377 extern int del_loop(const char *);
378 extern int is_loop_device(const char *);
379 extern char * find_unused_loop_device(void);
380--- util-linux-2.12.orig/mount/loop.h
381+++ util-linux-2.12/mount/loop.h
382@@ -1,8 +1,39 @@
383-#define LO_CRYPT_NONE 0
384-#define LO_CRYPT_XOR 1
385-#define LO_CRYPT_DES 2
386+#define LO_CRYPT_NONE 0
387+#define LO_CRYPT_XOR 1
388+#define LO_CRYPT_DES 2
389 #define LO_CRYPT_CRYPTOAPI 18
390
391+#ifndef LO_CRYPT_FISH2
392+#define LO_CRYPT_FISH2 3
393+#endif
394+#ifndef LO_CRYPT_BLOW
395+#define LO_CRYPT_BLOW 4
396+#endif
397+#ifndef LO_CRYPT_CAST128
398+#define LO_CRYPT_CAST128 5
399+#endif
400+#ifndef LO_CRYPT_IDEA
401+#define LO_CRYPT_IDEA 6
402+#endif
403+#ifndef LO_CRYPT_SERPENT
404+#define LO_CRYPT_SERPENT 7
405+#endif
406+#ifndef LO_CRYPT_MARS
407+#define LO_CRYPT_MARS 8
408+#endif
409+#ifndef LO_CRYPT_RC6
410+#define LO_CRYPT_RC6 11
411+#endif
412+#ifndef LO_CRYPT_3DES
413+#define LO_CRYPT_3DES 12
414+#endif
415+#ifndef LO_CRYPT_DFC
416+#define LO_CRYPT_DFC 15
417+#endif
418+#ifndef LO_CRYPT_RIJNDAEL
419+#define LO_CRYPT_RIJNDAEL 16
420+#endif
421+
422 #define LOOP_SET_FD 0x4C00
423 #define LOOP_CLR_FD 0x4C01
424 #define LOOP_SET_STATUS 0x4C02
425--- util-linux-2.12.orig/mount/losetup.8
426+++ util-linux-2.12/mount/losetup.8
427@@ -50,19 +50,24 @@
428 .B \-e
429 option.)
430 .SH OPTIONS
431-.IP \fB\-d\fP
432-Detach the file or device associated with the specified loop device.
433+.IP "\fB\-\-delete, \-\-detach, \-d\fP"
434+detach the file or device associated with the specified loop device.
435 .IP "\fB\-E \fIencryption_type\fP"
436 Enable data encryption with specified number.
437-.IP "\fB\-e \fIencryption_name\fP"
438+.IP "\fB\-\-encryption, \-e \fIencryption\fP"
439 Enable data encryption with specified name.
440-.IP "\fB\-o \fIoffset\fP"
441+.IP "\fB\-\-nohashpass, \-N\fP"
442+Do not hash the password. Many previous Debian releases run the password through a
443+hash function, non-Debian systems appear to.
444+.IP "\fB\-\-offset, \-o \fIoffset\fP"
445 The data start is moved \fIoffset\fP bytes into the specified file or
446 device.
447-.IP "\fB\-p \fInum\fP"
448+.IP "\fB\-\-pass-fd, \-p \fInum\fP"
449 Read the passphrase from file descriptor with number
450 .I num
451 instead of from the terminal.
452+.IP "\fB\-\-keybits, \-k \fInum\fP"
453+set the number of bits to use in key to \fInum\fP.
454 .SH RETURN VALUE
455 .B losetup
456 returns 0 on success, nonzero on failure. When
457@@ -109,6 +114,9 @@
458 .fi
459 .SH RESTRICTION
460 DES encryption is painfully slow. On the other hand, XOR is terribly weak.
461+Both are insecure nowadays. Some ciphers may require a licence for you to be
462+allowed to use them.
463+.fi
464 .\" .SH AUTHORS
465 .\" .nf
466 .\" Original version: Theodore Ts'o <tytso@athena.mit.edu>
467--- util-linux-2.12.orig/mount/mount.8
468+++ util-linux-2.12/mount/mount.8
469@@ -270,6 +270,12 @@
470 .B \-v
471 Verbose mode.
472 .TP
473+.B \-p "\fInum\fP"
474+If the mount requires a passphrase to be entered, read it from file
475+descriptor
476+.IR num\fP
477+instead of from the terminal.
478+.TP
479 .B \-a
480 Mount all filesystems (of the given types) mentioned in
481 .IR fstab .
482@@ -633,6 +639,15 @@
483 .BR noexec ", " nosuid ", and " nodev
484 (unless overridden by subsequent options, as in the option line
485 .BR users,exec,dev,suid ).
486+.TP
487+.B encryption
488+Specifies an encryption algorithm to use. Used in conjunction with the
489+.BR loop " option."
490+.TP
491+.B keybits
492+Specifies the key size to use for an encryption algorithm. Used in conjunction
493+with the
494+.BR loop " and " encryption " options."
495 .RE
496 .TP
497 .B \-\-bind
498@@ -1696,7 +1711,10 @@
499 .BR loop ", " offset " and " encryption ,
500 that are really options to
501 .BR losetup (8).
502-If no explicit loop device is mentioned
503+If the mount requires a passphrase, you will be prompted for one unless
504+you specify a file descriptor to read from instead with the
505+.BR \-\-pass-fd
506+option. If no explicit loop device is mentioned
507 (but just an option `\fB\-o loop\fP' is given), then
508 .B mount
509 will try to find some unused loop device and use that.
510@@ -1767,7 +1785,7 @@
511 .BR e2label (8),
512 .BR xfs_admin (8),
513 .BR mountd (8),
514-.BR nfsd (8),
515+.BR rpc.nfsd (8),
516 .BR mke2fs (8),
517 .BR tune2fs (8),
518 .BR losetup (8)
519--- util-linux-2.12.orig/mount/mount.c
520+++ util-linux-2.12/mount/mount.c
521@@ -92,6 +92,9 @@
522 /* Nonzero for chatty (-v). */
523 int verbose = 0;
524
525+/* Do we hash the password or not */
526+int hash_password = 1;
527+
528 /* Nonzero for sloppy (-s). */
529 int sloppy = 0;
530
531@@ -116,6 +119,9 @@
532 /* Contains the fd to read the passphrase from, if any. */
533 static int pfd = -1;
534
535+/* Contains the preferred keysize in bits we want to use */
536+static int keysz = 0;
537+
538 /* Map from -o and fstab option strings to the flag argument to mount(2). */
539 struct opt_map {
540 const char *opt; /* option name */
541@@ -195,7 +201,7 @@
542 };
543
544 static char *opt_loopdev, *opt_vfstype, *opt_offset, *opt_encryption,
545- *opt_speed;
546+ *opt_keybits, *opt_nohashpass, *opt_speed;
547
548 static struct string_opt_map {
549 char *tag;
550@@ -206,6 +212,8 @@
551 { "vfs=", 1, &opt_vfstype },
552 { "offset=", 0, &opt_offset },
553 { "encryption=", 0, &opt_encryption },
554+ { "keybits=", 0, &opt_keybits },
555+ { "nohashpass", 0, &opt_nohashpass },
556 { "speed=", 0, &opt_speed },
557 { NULL, 0, NULL }
558 };
559@@ -586,7 +594,8 @@
560 *type = opt_vfstype;
561 }
562
563- *loop = ((*flags & MS_LOOP) || *loopdev || opt_offset || opt_encryption);
564+ *loop = ((*flags & MS_LOOP) || *loopdev || opt_offset || opt_encryption ||
565+ opt_keybits);
566 *loopfile = *spec;
567
568 if (*loop) {
569@@ -604,8 +613,12 @@
570 if (verbose)
571 printf(_("mount: going to use the loop device %s\n"), *loopdev);
572 offset = opt_offset ? strtoul(opt_offset, NULL, 0) : 0;
573- if (set_loop(*loopdev, *loopfile, offset,
574- opt_encryption, pfd, &loopro)) {
575+ if (!keysz && opt_keybits)
576+ keysz = strtoul(opt_keybits, NULL, 0);
577+ if (opt_nohashpass)
578+ hash_password=0;
579+ if (set_loop (*loopdev, *loopfile, offset, opt_encryption, pfd,
580+ keysz, &loopro, hash_password)) {
581 if (verbose)
582 printf(_("mount: failed setting up loop device\n"));
583 return EX_FAIL;
584@@ -1371,6 +1384,7 @@
585 { "options", 1, 0, 'o' },
586 { "test-opts", 1, 0, 'O' },
587 { "pass-fd", 1, 0, 'p' },
588+ { "keybits", 1, 0, 'k' },
589 { "types", 1, 0, 't' },
590 { "bind", 0, 0, 128 },
591 { "replace", 0, 0, 129 },
592@@ -1424,6 +1438,8 @@
593 int c, result = 0, specseen;
594 char *options = NULL, *test_opts = NULL, *spec, *node;
595 char *volumelabel = NULL;
596+ char *passfd = NULL;
597+ char *keysize = NULL;
598 char *uuid = NULL;
599 char *types = NULL;
600 struct mntentchn *mc;
601@@ -1447,7 +1463,7 @@
602 initproctitle(argc, argv);
603 #endif
604
605- while ((c = getopt_long (argc, argv, "afFhilL:no:O:p:rsU:vVwt:",
606+ while ((c = getopt_long (argc, argv, "afFhilL:k:no:O:p:rsU:vVwt:",
607 longopts, NULL)) != -1) {
608 switch (c) {
609 case 'a': /* mount everything in fstab */
610@@ -1471,6 +1487,9 @@
611 case 'L':
612 volumelabel = optarg;
613 break;
614+ case 'k':
615+ keysize = optarg;
616+ break;
617 case 'n': /* do not write /etc/mtab */
618 ++nomtab;
619 break;
620@@ -1598,6 +1617,11 @@
621 } else
622 spec = NULL; /* just for gcc */
623
624+ if (passfd && sscanf(passfd,"%d",&pfd) != 1)
625+ die (EX_USAGE, _("mount: argument to --pass-fd or -p must be a number"));
626+ if (keysize && sscanf(keysize,"%d",&keysz) != 1)
627+ die (EX_USAGE, _("mount: argument to --keybits or -k must be a number"));
628+
629 switch (argc+specseen) {
630 case 0:
631 /* mount -a */
632--- util-linux-2.12.orig/mount/rmd160.c
633+++ util-linux-2.12/mount/rmd160.c
634@@ -0,0 +1,532 @@
635+/* rmd160.c - RIPE-MD160
636+ * Copyright (C) 1998 Free Software Foundation, Inc.
637+ */
638+
639+/* This file was part of GnuPG. Modified for use within the Linux
640+ * mount utility by Marc Mutz <Marc@Mutz.com>. None of this code is
641+ * by myself. I just removed everything that you don't need when all
642+ * you want to do is to use rmd160_hash_buffer().
643+ * My comments are marked with (mm). */
644+
645+/* GnuPG is free software; you can redistribute it and/or modify
646+ * it under the terms of the GNU General Public License as published by
647+ * the Free Software Foundation; either version 2 of the License, or
648+ * (at your option) any later version.
649+ *
650+ * GnuPG is distributed in the hope that it will be useful,
651+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
652+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
653+ * GNU General Public License for more details.
654+ *
655+ * You should have received a copy of the GNU General Public License
656+ * along with this program; if not, write to the Free Software
657+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */
658+
659+#include <string.h> /* (mm) for memcpy */
660+#include <endian.h> /* (mm) for BIG_ENDIAN and BYTE_ORDER */
661+#include "rmd160.h"
662+
663+/* (mm) these are used by the original GnuPG file. In order to modify
664+ * that file not too much, we keep the notations. maybe it would be
665+ * better to include linux/types.h and typedef __u32 to u32 and __u8
666+ * to byte? */
667+typedef unsigned int u32; /* taken from e.g. util-linux's minix.h */
668+typedef unsigned char byte;
669+
670+typedef struct {
671+ u32 h0,h1,h2,h3,h4;
672+ u32 nblocks;
673+ byte buf[64];
674+ int count;
675+} RMD160_CONTEXT;
676+
677+/****************
678+ * Rotate a 32 bit integer by n bytes
679+ */
680+#if defined(__GNUC__) && defined(__i386__)
681+static inline u32
682+rol( u32 x, int n)
683+{
684+ __asm__("roll %%cl,%0"
685+ :"=r" (x)
686+ :"0" (x),"c" (n));
687+ return x;
688+}
689+#else
690+ #define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
691+#endif
692+
693+/*********************************
694+ * RIPEMD-160 is not patented, see (as of 25.10.97)
695+ * http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
696+ * Note that the code uses Little Endian byteorder, which is good for
697+ * 386 etc, but we must add some conversion when used on a big endian box.
698+ *
699+ *
700+ * Pseudo-code for RIPEMD-160
701+ *
702+ * RIPEMD-160 is an iterative hash function that operates on 32-bit words.
703+ * The round function takes as input a 5-word chaining variable and a 16-word
704+ * message block and maps this to a new chaining variable. All operations are
705+ * defined on 32-bit words. Padding is identical to that of MD4.
706+ *
707+ *
708+ * RIPEMD-160: definitions
709+ *
710+ *
711+ * nonlinear functions at bit level: exor, mux, -, mux, -
712+ *
713+ * f(j, x, y, z) = x XOR y XOR z (0 <= j <= 15)
714+ * f(j, x, y, z) = (x AND y) OR (NOT(x) AND z) (16 <= j <= 31)
715+ * f(j, x, y, z) = (x OR NOT(y)) XOR z (32 <= j <= 47)
716+ * f(j, x, y, z) = (x AND z) OR (y AND NOT(z)) (48 <= j <= 63)
717+ * f(j, x, y, z) = x XOR (y OR NOT(z)) (64 <= j <= 79)
718+ *
719+ *
720+ * added constants (hexadecimal)
721+ *
722+ * K(j) = 0x00000000 (0 <= j <= 15)
723+ * K(j) = 0x5A827999 (16 <= j <= 31) int(2**30 x sqrt(2))
724+ * K(j) = 0x6ED9EBA1 (32 <= j <= 47) int(2**30 x sqrt(3))
725+ * K(j) = 0x8F1BBCDC (48 <= j <= 63) int(2**30 x sqrt(5))
726+ * K(j) = 0xA953FD4E (64 <= j <= 79) int(2**30 x sqrt(7))
727+ * K'(j) = 0x50A28BE6 (0 <= j <= 15) int(2**30 x cbrt(2))
728+ * K'(j) = 0x5C4DD124 (16 <= j <= 31) int(2**30 x cbrt(3))
729+ * K'(j) = 0x6D703EF3 (32 <= j <= 47) int(2**30 x cbrt(5))
730+ * K'(j) = 0x7A6D76E9 (48 <= j <= 63) int(2**30 x cbrt(7))
731+ * K'(j) = 0x00000000 (64 <= j <= 79)
732+ *
733+ *
734+ * selection of message word
735+ *
736+ * r(j) = j (0 <= j <= 15)
737+ * r(16..31) = 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8
738+ * r(32..47) = 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12
739+ * r(48..63) = 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2
740+ * r(64..79) = 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
741+ * r0(0..15) = 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12
742+ * r0(16..31)= 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2
743+ * r0(32..47)= 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13
744+ * r0(48..63)= 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14
745+ * r0(64..79)= 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
746+ *
747+ *
748+ * amount for rotate left (rol)
749+ *
750+ * s(0..15) = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8
751+ * s(16..31) = 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12
752+ * s(32..47) = 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5
753+ * s(48..63) = 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12
754+ * s(64..79) = 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
755+ * s'(0..15) = 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6
756+ * s'(16..31)= 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11
757+ * s'(32..47)= 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5
758+ * s'(48..63)= 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8
759+ * s'(64..79)= 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
760+ *
761+ *
762+ * initial value (hexadecimal)
763+ *
764+ * h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476;
765+ * h4 = 0xC3D2E1F0;
766+ *
767+ *
768+ * RIPEMD-160: pseudo-code
769+ *
770+ * It is assumed that the message after padding consists of t 16-word blocks
771+ * that will be denoted with X[i][j], with 0 <= i <= t-1 and 0 <= j <= 15.
772+ * The symbol [+] denotes addition modulo 2**32 and rol_s denotes cyclic left
773+ * shift (rotate) over s positions.
774+ *
775+ *
776+ * for i := 0 to t-1 {
777+ * A := h0; B := h1; C := h2; D = h3; E = h4;
778+ * A' := h0; B' := h1; C' := h2; D' = h3; E' = h4;
779+ * for j := 0 to 79 {
780+ * T := rol_s(j)(A [+] f(j, B, C, D) [+] X[i][r(j)] [+] K(j)) [+] E;
781+ * A := E; E := D; D := rol_10(C); C := B; B := T;
782+ * T := rol_s'(j)(A' [+] f(79-j, B', C', D') [+] X[i][r'(j)]
783+ [+] K'(j)) [+] E';
784+ * A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T;
785+ * }
786+ * T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A';
787+ * h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T;
788+ * }
789+ */
790+
791+/* Some examples:
792+ * "" 9c1185a5c5e9fc54612808977ee8f548b2258d31
793+ * "a" 0bdc9d2d256b3ee9daae347be6f4dc835a467ffe
794+ * "abc" 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
795+ * "message digest" 5d0689ef49d2fae572b881b123a85ffa21595f36
796+ * "a...z" f71c27109c692c1b56bbdceb5b9d2865b3708dbc
797+ * "abcdbcde...nopq" 12a053384a9c0c88e405a06c27dcf49ada62eb2b
798+ * "A...Za...z0...9" b0e20b6e3116640286ed3a87a5713079b21f5189
799+ * 8 times "1234567890" 9b752e45573d4b39f4dbd3323cab82bf63326bfb
800+ * 1 million times "a" 52783243c1697bdbe16d37f97f68f08325dc1528
801+ */
802+
803+
804+static void
805+rmd160_init( RMD160_CONTEXT *hd )
806+{
807+ hd->h0 = 0x67452301;
808+ hd->h1 = 0xEFCDAB89;
809+ hd->h2 = 0x98BADCFE;
810+ hd->h3 = 0x10325476;
811+ hd->h4 = 0xC3D2E1F0;
812+ hd->nblocks = 0;
813+ hd->count = 0;
814+}
815+
816+
817+
818+/****************
819+ * Transform the message X which consists of 16 32-bit-words
820+ */
821+static void
822+transform( RMD160_CONTEXT *hd, byte *data )
823+{
824+ u32 a,b,c,d,e,aa,bb,cc,dd,ee,t;
825+ #if BYTE_ORDER == BIG_ENDIAN
826+ u32 x[16];
827+ { int i;
828+ byte *p2, *p1;
829+ for(i=0, p1=data, p2=(byte*)x; i < 16; i++, p2 += 4 ) {
830+ p2[3] = *p1++;
831+ p2[2] = *p1++;
832+ p2[1] = *p1++;
833+ p2[0] = *p1++;
834+ }
835+ }
836+ #else
837+ #if 0
838+ u32 *x =(u32*)data;
839+ #else
840+ /* this version is better because it is always aligned;
841+ * The performance penalty on a 586-100 is about 6% which
842+ * is acceptable - because the data is more local it might
843+ * also be possible that this is faster on some machines.
844+ * This function (when compiled with -02 on gcc 2.7.2)
845+ * executes on a 586-100 (39.73 bogomips) at about 1900kb/sec;
846+ * [measured with a 4MB data and "gpgm --print-md rmd160"] */
847+ u32 x[16];
848+ memcpy( x, data, 64 );
849+ #endif
850+ #endif
851+
852+
853+#define K0 0x00000000
854+#define K1 0x5A827999
855+#define K2 0x6ED9EBA1
856+#define K3 0x8F1BBCDC
857+#define K4 0xA953FD4E
858+#define KK0 0x50A28BE6
859+#define KK1 0x5C4DD124
860+#define KK2 0x6D703EF3
861+#define KK3 0x7A6D76E9
862+#define KK4 0x00000000
863+#define F0(x,y,z) ( (x) ^ (y) ^ (z) )
864+#define F1(x,y,z) ( ((x) & (y)) | (~(x) & (z)) )
865+#define F2(x,y,z) ( ((x) | ~(y)) ^ (z) )
866+#define F3(x,y,z) ( ((x) & (z)) | ((y) & ~(z)) )
867+#define F4(x,y,z) ( (x) ^ ((y) | ~(z)) )
868+#define R(a,b,c,d,e,f,k,r,s) do { t = a + f(b,c,d) + k + x[r]; \
869+ a = rol(t,s) + e; \
870+ c = rol(c,10); \
871+ } while(0)
872+
873+ /* left lane */
874+ a = hd->h0;
875+ b = hd->h1;
876+ c = hd->h2;
877+ d = hd->h3;
878+ e = hd->h4;
879+ R( a, b, c, d, e, F0, K0, 0, 11 );
880+ R( e, a, b, c, d, F0, K0, 1, 14 );
881+ R( d, e, a, b, c, F0, K0, 2, 15 );
882+ R( c, d, e, a, b, F0, K0, 3, 12 );
883+ R( b, c, d, e, a, F0, K0, 4, 5 );
884+ R( a, b, c, d, e, F0, K0, 5, 8 );
885+ R( e, a, b, c, d, F0, K0, 6, 7 );
886+ R( d, e, a, b, c, F0, K0, 7, 9 );
887+ R( c, d, e, a, b, F0, K0, 8, 11 );
888+ R( b, c, d, e, a, F0, K0, 9, 13 );
889+ R( a, b, c, d, e, F0, K0, 10, 14 );
890+ R( e, a, b, c, d, F0, K0, 11, 15 );
891+ R( d, e, a, b, c, F0, K0, 12, 6 );
892+ R( c, d, e, a, b, F0, K0, 13, 7 );
893+ R( b, c, d, e, a, F0, K0, 14, 9 );
894+ R( a, b, c, d, e, F0, K0, 15, 8 );
895+ R( e, a, b, c, d, F1, K1, 7, 7 );
896+ R( d, e, a, b, c, F1, K1, 4, 6 );
897+ R( c, d, e, a, b, F1, K1, 13, 8 );
898+ R( b, c, d, e, a, F1, K1, 1, 13 );
899+ R( a, b, c, d, e, F1, K1, 10, 11 );
900+ R( e, a, b, c, d, F1, K1, 6, 9 );
901+ R( d, e, a, b, c, F1, K1, 15, 7 );
902+ R( c, d, e, a, b, F1, K1, 3, 15 );
903+ R( b, c, d, e, a, F1, K1, 12, 7 );
904+ R( a, b, c, d, e, F1, K1, 0, 12 );
905+ R( e, a, b, c, d, F1, K1, 9, 15 );
906+ R( d, e, a, b, c, F1, K1, 5, 9 );
907+ R( c, d, e, a, b, F1, K1, 2, 11 );
908+ R( b, c, d, e, a, F1, K1, 14, 7 );
909+ R( a, b, c, d, e, F1, K1, 11, 13 );
910+ R( e, a, b, c, d, F1, K1, 8, 12 );
911+ R( d, e, a, b, c, F2, K2, 3, 11 );
912+ R( c, d, e, a, b, F2, K2, 10, 13 );
913+ R( b, c, d, e, a, F2, K2, 14, 6 );
914+ R( a, b, c, d, e, F2, K2, 4, 7 );
915+ R( e, a, b, c, d, F2, K2, 9, 14 );
916+ R( d, e, a, b, c, F2, K2, 15, 9 );
917+ R( c, d, e, a, b, F2, K2, 8, 13 );
918+ R( b, c, d, e, a, F2, K2, 1, 15 );
919+ R( a, b, c, d, e, F2, K2, 2, 14 );
920+ R( e, a, b, c, d, F2, K2, 7, 8 );
921+ R( d, e, a, b, c, F2, K2, 0, 13 );
922+ R( c, d, e, a, b, F2, K2, 6, 6 );
923+ R( b, c, d, e, a, F2, K2, 13, 5 );
924+ R( a, b, c, d, e, F2, K2, 11, 12 );
925+ R( e, a, b, c, d, F2, K2, 5, 7 );
926+ R( d, e, a, b, c, F2, K2, 12, 5 );
927+ R( c, d, e, a, b, F3, K3, 1, 11 );
928+ R( b, c, d, e, a, F3, K3, 9, 12 );
929+ R( a, b, c, d, e, F3, K3, 11, 14 );
930+ R( e, a, b, c, d, F3, K3, 10, 15 );
931+ R( d, e, a, b, c, F3, K3, 0, 14 );
932+ R( c, d, e, a, b, F3, K3, 8, 15 );
933+ R( b, c, d, e, a, F3, K3, 12, 9 );
934+ R( a, b, c, d, e, F3, K3, 4, 8 );
935+ R( e, a, b, c, d, F3, K3, 13, 9 );
936+ R( d, e, a, b, c, F3, K3, 3, 14 );
937+ R( c, d, e, a, b, F3, K3, 7, 5 );
938+ R( b, c, d, e, a, F3, K3, 15, 6 );
939+ R( a, b, c, d, e, F3, K3, 14, 8 );
940+ R( e, a, b, c, d, F3, K3, 5, 6 );
941+ R( d, e, a, b, c, F3, K3, 6, 5 );
942+ R( c, d, e, a, b, F3, K3, 2, 12 );
943+ R( b, c, d, e, a, F4, K4, 4, 9 );
944+ R( a, b, c, d, e, F4, K4, 0, 15 );
945+ R( e, a, b, c, d, F4, K4, 5, 5 );
946+ R( d, e, a, b, c, F4, K4, 9, 11 );
947+ R( c, d, e, a, b, F4, K4, 7, 6 );
948+ R( b, c, d, e, a, F4, K4, 12, 8 );
949+ R( a, b, c, d, e, F4, K4, 2, 13 );
950+ R( e, a, b, c, d, F4, K4, 10, 12 );
951+ R( d, e, a, b, c, F4, K4, 14, 5 );
952+ R( c, d, e, a, b, F4, K4, 1, 12 );
953+ R( b, c, d, e, a, F4, K4, 3, 13 );
954+ R( a, b, c, d, e, F4, K4, 8, 14 );
955+ R( e, a, b, c, d, F4, K4, 11, 11 );
956+ R( d, e, a, b, c, F4, K4, 6, 8 );
957+ R( c, d, e, a, b, F4, K4, 15, 5 );
958+ R( b, c, d, e, a, F4, K4, 13, 6 );
959+
960+ aa = a; bb = b; cc = c; dd = d; ee = e;
961+
962+ /* right lane */
963+ a = hd->h0;
964+ b = hd->h1;
965+ c = hd->h2;
966+ d = hd->h3;
967+ e = hd->h4;
968+ R( a, b, c, d, e, F4, KK0, 5, 8);
969+ R( e, a, b, c, d, F4, KK0, 14, 9);
970+ R( d, e, a, b, c, F4, KK0, 7, 9);
971+ R( c, d, e, a, b, F4, KK0, 0, 11);
972+ R( b, c, d, e, a, F4, KK0, 9, 13);
973+ R( a, b, c, d, e, F4, KK0, 2, 15);
974+ R( e, a, b, c, d, F4, KK0, 11, 15);
975+ R( d, e, a, b, c, F4, KK0, 4, 5);
976+ R( c, d, e, a, b, F4, KK0, 13, 7);
977+ R( b, c, d, e, a, F4, KK0, 6, 7);
978+ R( a, b, c, d, e, F4, KK0, 15, 8);
979+ R( e, a, b, c, d, F4, KK0, 8, 11);
980+ R( d, e, a, b, c, F4, KK0, 1, 14);
981+ R( c, d, e, a, b, F4, KK0, 10, 14);
982+ R( b, c, d, e, a, F4, KK0, 3, 12);
983+ R( a, b, c, d, e, F4, KK0, 12, 6);
984+ R( e, a, b, c, d, F3, KK1, 6, 9);
985+ R( d, e, a, b, c, F3, KK1, 11, 13);
986+ R( c, d, e, a, b, F3, KK1, 3, 15);
987+ R( b, c, d, e, a, F3, KK1, 7, 7);
988+ R( a, b, c, d, e, F3, KK1, 0, 12);
989+ R( e, a, b, c, d, F3, KK1, 13, 8);
990+ R( d, e, a, b, c, F3, KK1, 5, 9);
991+ R( c, d, e, a, b, F3, KK1, 10, 11);
992+ R( b, c, d, e, a, F3, KK1, 14, 7);
993+ R( a, b, c, d, e, F3, KK1, 15, 7);
994+ R( e, a, b, c, d, F3, KK1, 8, 12);
995+ R( d, e, a, b, c, F3, KK1, 12, 7);
996+ R( c, d, e, a, b, F3, KK1, 4, 6);
997+ R( b, c, d, e, a, F3, KK1, 9, 15);
998+ R( a, b, c, d, e, F3, KK1, 1, 13);
999+ R( e, a, b, c, d, F3, KK1, 2, 11);
1000+ R( d, e, a, b, c, F2, KK2, 15, 9);
1001+ R( c, d, e, a, b, F2, KK2, 5, 7);
1002+ R( b, c, d, e, a, F2, KK2, 1, 15);
1003+ R( a, b, c, d, e, F2, KK2, 3, 11);
1004+ R( e, a, b, c, d, F2, KK2, 7, 8);
1005+ R( d, e, a, b, c, F2, KK2, 14, 6);
1006+ R( c, d, e, a, b, F2, KK2, 6, 6);
1007+ R( b, c, d, e, a, F2, KK2, 9, 14);
1008+ R( a, b, c, d, e, F2, KK2, 11, 12);
1009+ R( e, a, b, c, d, F2, KK2, 8, 13);
1010+ R( d, e, a, b, c, F2, KK2, 12, 5);
1011+ R( c, d, e, a, b, F2, KK2, 2, 14);
1012+ R( b, c, d, e, a, F2, KK2, 10, 13);
1013+ R( a, b, c, d, e, F2, KK2, 0, 13);
1014+ R( e, a, b, c, d, F2, KK2, 4, 7);
1015+ R( d, e, a, b, c, F2, KK2, 13, 5);
1016+ R( c, d, e, a, b, F1, KK3, 8, 15);
1017+ R( b, c, d, e, a, F1, KK3, 6, 5);
1018+ R( a, b, c, d, e, F1, KK3, 4, 8);
1019+ R( e, a, b, c, d, F1, KK3, 1, 11);
1020+ R( d, e, a, b, c, F1, KK3, 3, 14);
1021+ R( c, d, e, a, b, F1, KK3, 11, 14);
1022+ R( b, c, d, e, a, F1, KK3, 15, 6);
1023+ R( a, b, c, d, e, F1, KK3, 0, 14);
1024+ R( e, a, b, c, d, F1, KK3, 5, 6);
1025+ R( d, e, a, b, c, F1, KK3, 12, 9);
1026+ R( c, d, e, a, b, F1, KK3, 2, 12);
1027+ R( b, c, d, e, a, F1, KK3, 13, 9);
1028+ R( a, b, c, d, e, F1, KK3, 9, 12);
1029+ R( e, a, b, c, d, F1, KK3, 7, 5);
1030+ R( d, e, a, b, c, F1, KK3, 10, 15);
1031+ R( c, d, e, a, b, F1, KK3, 14, 8);
1032+ R( b, c, d, e, a, F0, KK4, 12, 8);
1033+ R( a, b, c, d, e, F0, KK4, 15, 5);
1034+ R( e, a, b, c, d, F0, KK4, 10, 12);
1035+ R( d, e, a, b, c, F0, KK4, 4, 9);
1036+ R( c, d, e, a, b, F0, KK4, 1, 12);
1037+ R( b, c, d, e, a, F0, KK4, 5, 5);
1038+ R( a, b, c, d, e, F0, KK4, 8, 14);
1039+ R( e, a, b, c, d, F0, KK4, 7, 6);
1040+ R( d, e, a, b, c, F0, KK4, 6, 8);
1041+ R( c, d, e, a, b, F0, KK4, 2, 13);
1042+ R( b, c, d, e, a, F0, KK4, 13, 6);
1043+ R( a, b, c, d, e, F0, KK4, 14, 5);
1044+ R( e, a, b, c, d, F0, KK4, 0, 15);
1045+ R( d, e, a, b, c, F0, KK4, 3, 13);
1046+ R( c, d, e, a, b, F0, KK4, 9, 11);
1047+ R( b, c, d, e, a, F0, KK4, 11, 11);
1048+
1049+
1050+ t = hd->h1 + d + cc;
1051+ hd->h1 = hd->h2 + e + dd;
1052+ hd->h2 = hd->h3 + a + ee;
1053+ hd->h3 = hd->h4 + b + aa;
1054+ hd->h4 = hd->h0 + c + bb;
1055+ hd->h0 = t;
1056+}
1057+
1058+
1059+/* Update the message digest with the contents
1060+ * of INBUF with length INLEN.
1061+ */
1062+static void
1063+rmd160_write( RMD160_CONTEXT *hd, byte *inbuf, size_t inlen)
1064+{
1065+ if( hd->count == 64 ) { /* flush the buffer */
1066+ transform( hd, hd->buf );
1067+ hd->count = 0;
1068+ hd->nblocks++;
1069+ }
1070+ if( !inbuf )
1071+ return;
1072+ if( hd->count ) {
1073+ for( ; inlen && hd->count < 64; inlen-- )
1074+ hd->buf[hd->count++] = *inbuf++;
1075+ rmd160_write( hd, NULL, 0 );
1076+ if( !inlen )
1077+ return;
1078+ }
1079+
1080+ while( inlen >= 64 ) {
1081+ transform( hd, inbuf );
1082+ hd->count = 0;
1083+ hd->nblocks++;
1084+ inlen -= 64;
1085+ inbuf += 64;
1086+ }
1087+ for( ; inlen && hd->count < 64; inlen-- )
1088+ hd->buf[hd->count++] = *inbuf++;
1089+}
1090+
1091+/* The routine terminates the computation
1092+ */
1093+
1094+static void
1095+rmd160_final( RMD160_CONTEXT *hd )
1096+{
1097+ u32 t, msb, lsb;
1098+ byte *p;
1099+
1100+ rmd160_write(hd, NULL, 0); /* flush */;
1101+
1102+ msb = 0;
1103+ t = hd->nblocks;
1104+ if( (lsb = t << 6) < t ) /* multiply by 64 to make a byte count */
1105+ msb++;
1106+ msb += t >> 26;
1107+ t = lsb;
1108+ if( (lsb = t + hd->count) < t ) /* add the count */
1109+ msb++;
1110+ t = lsb;
1111+ if( (lsb = t << 3) < t ) /* multiply by 8 to make a bit count */
1112+ msb++;
1113+ msb += t >> 29;
1114+
1115+ if( hd->count < 56 ) { /* enough room */
1116+ hd->buf[hd->count++] = 0x80; /* pad */
1117+ while( hd->count < 56 )
1118+ hd->buf[hd->count++] = 0; /* pad */
1119+ }
1120+ else { /* need one extra block */
1121+ hd->buf[hd->count++] = 0x80; /* pad character */
1122+ while( hd->count < 64 )
1123+ hd->buf[hd->count++] = 0;
1124+ rmd160_write(hd, NULL, 0); /* flush */;
1125+ memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
1126+ }
1127+ /* append the 64 bit count */
1128+ hd->buf[56] = lsb ;
1129+ hd->buf[57] = lsb >> 8;
1130+ hd->buf[58] = lsb >> 16;
1131+ hd->buf[59] = lsb >> 24;
1132+ hd->buf[60] = msb ;
1133+ hd->buf[61] = msb >> 8;
1134+ hd->buf[62] = msb >> 16;
1135+ hd->buf[63] = msb >> 24;
1136+ transform( hd, hd->buf );
1137+
1138+ p = hd->buf;
1139+ #if BYTE_ORDER == BIG_ENDIAN
1140+ #define X(a) do { *p++ = hd->h##a ; *p++ = hd->h##a >> 8; \
1141+ *p++ = hd->h##a >> 16; *p++ = hd->h##a >> 24; } while(0)
1142+ #else /* little endian */
1143+ #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
1144+ #endif
1145+ X(0);
1146+ X(1);
1147+ X(2);
1148+ X(3);
1149+ X(4);
1150+ #undef X
1151+}
1152+
1153+/****************
1154+ * Shortcut functions which puts the hash value of the supplied buffer
1155+ * into outbuf which must have a size of 20 bytes.
1156+ */
1157+void
1158+rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length )
1159+{
1160+ RMD160_CONTEXT hd;
1161+
1162+ rmd160_init( &hd );
1163+ rmd160_write( &hd, (byte*)buffer, length );
1164+ rmd160_final( &hd );
1165+ memcpy( outbuf, hd.buf, 20 );
1166+}
1167--- util-linux-2.12.orig/mount/rmd160.h
1168+++ util-linux-2.12/mount/rmd160.h
1169@@ -0,0 +1,9 @@
1170+#ifndef RMD160_H
1171+#define RMD160_H
1172+
1173+void
1174+rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length );
1175+
1176+#endif /*RMD160_H*/
1177+
1178+
1179
This page took 0.151363 seconds and 4 git commands to generate.