1 /* mcookie.c -- Generates random numbers for xauth
2 * Created: Fri Feb 3 10:42:48 1995 by faith@cs.unc.edu
3 * Revised: Fri Mar 19 07:48:01 1999 by faith@acm.org
4 * Public Domain 1995, 1999 Rickard E. Faith (faith@acm.org)
5 * This program comes with ABSOLUTELY NO WARRANTY.
7 * This program gathers some random bits of data and used the MD5
8 * message-digest algorithm to generate a 128-bit hexadecimal number for
11 * NOTE: Unless /dev/random is available, this program does not actually
12 * gather 128 bits of random information, so the magic cookie generated
13 * will be considerably easier to guess than one might expect.
15 * 1999-02-22 Arkadiusz MiĆkiewicz <misiek@pld.ORG.PL>
16 * - added Native Language Support
17 * 1999-03-21 aeb: Added some fragments of code from Colin Plumb.
24 #include "closestream.h"
25 #include "randutils.h"
41 /* The basic function to hash a file */
42 static size_t hash_file(struct MD5Context
*ctx
, int fd
)
46 unsigned char buf
[BUFFERSIZE
];
48 while ((r
= read(fd
, buf
, sizeof(buf
))) > 0) {
49 MD5Update(ctx
, buf
, r
);
52 /* Separate files with a null byte */
54 MD5Update(ctx
, buf
, 1);
58 static void __attribute__ ((__noreturn__
)) usage(FILE * out
)
60 fputs(_("\nUsage:\n"), out
);
62 _(" %s [options]\n"), program_invocation_short_name
);
64 fputs(_("\nOptions:\n"), out
);
65 fputs(_(" -f, --file <file> use file as a cookie seed\n"
66 " -v, --verbose explain what is being done\n"
67 " -V, --version output version information and exit\n"
68 " -h, --help display this help and exit\n\n"), out
);
70 exit(out
== stderr
? EXIT_FAILURE
: EXIT_SUCCESS
);
73 static void randomness_from_files(char **files
, int nfiles
,
74 struct MD5Context
*ctx
, int verbose
)
79 for (i
= 0; i
< nfiles
; i
++) {
80 if (files
[i
][0] == '-' && !files
[i
][1])
83 fd
= open(files
[i
], O_RDONLY
);
86 warn(_("cannot open %s"), files
[i
]);
88 count
= hash_file(ctx
, fd
);
91 P_("Got %zu byte from %s\n",
92 "Got %zu bytes from %s\n", count
),
95 if (fd
!= STDIN_FILENO
)
98 _("closing %s failed"), files
[i
]);
103 int main(int argc
, char **argv
)
106 struct MD5Context ctx
;
107 unsigned char digest
[MD5LENGTH
];
108 unsigned char buf
[RAND_BYTES
];
114 static const struct option longopts
[] = {
115 {"file", required_argument
, NULL
, 'f'},
116 {"verbose", no_argument
, NULL
, 'v'},
117 {"version", no_argument
, NULL
, 'V'},
118 {"help", no_argument
, NULL
, 'h'},
122 setlocale(LC_ALL
, "");
123 bindtextdomain(PACKAGE
, LOCALEDIR
);
125 atexit(close_stdout
);
130 files
= xmalloc(sizeof(char *) * argc
);
135 getopt_long(argc
, argv
, "f:vVh", longopts
, NULL
)) != -1)
141 files
[nfiles
] = optarg
;
145 printf(UTIL_LINUX_VERSION
);
153 randomness_from_files(files
, nfiles
, &ctx
, verbose
);
156 random_get_bytes(&buf
, RAND_BYTES
);
157 MD5Update(&ctx
, buf
, RAND_BYTES
);
160 _("Got %d bytes from %s\n"), RAND_BYTES
, random_tell_source());
162 MD5Final(digest
, &ctx
);
163 for (i
= 0; i
< MD5LENGTH
; i
++)
164 printf("%02x", digest
[i
]);