2 * Copyright (C) 2005-2012 Free Software Foundation, Inc.
4 * This file is part of GnuTLS.
6 * GnuTLS is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GnuTLS is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see
18 * <http://www.gnu.org/licenses/>.
23 /* Gnulib portability files. */
29 int main(int argc, char **argv)
31 printf("\nPSK not supported. This program is a dummy.\n\n");
40 #include <gnutls/gnutls.h>
41 #include <psktool-args.h>
43 #include <gnutls/crypto.h> /* for random */
45 #include <sys/types.h>
55 /* Gnulib portability files. */
59 static int write_key(const char *username, const char *key, int key_size,
60 const char *passwd_file);
62 #define KPASSWD "/etc/passwd.psk"
63 #define MAX_KEY_SIZE 64
64 int main(int argc, char **argv)
70 unsigned char key[MAX_KEY_SIZE];
71 char hex_key[MAX_KEY_SIZE * 2 + 1];
74 const char *passwd, *username;
75 size_t hex_key_size = sizeof(hex_key);
77 if ((ret = gnutls_global_init()) < 0) {
78 fprintf(stderr, "global_init: %s\n", gnutls_strerror(ret));
84 optct = optionProcess(&psktoolOptions, argc, argv);
88 if (!HAVE_OPT(PASSWD))
89 passwd = (char *) KPASSWD;
91 passwd = OPT_ARG(PASSWD);
93 if (!HAVE_OPT(USERNAME)) {
95 pwd = getpwuid(getuid());
98 fprintf(stderr, "No such user\n");
102 username = pwd->pw_name;
104 fprintf(stderr, "Please specify a user\n");
108 username = OPT_ARG(USERNAME);
110 if (HAVE_OPT(KEYSIZE) && OPT_VALUE_KEYSIZE > MAX_KEY_SIZE) {
111 fprintf(stderr, "Key size is too long\n");
115 if (!HAVE_OPT(KEYSIZE) || OPT_VALUE_KEYSIZE < 1)
118 key_size = OPT_VALUE_KEYSIZE;
120 printf("Generating a random key for user '%s'\n", username);
122 ret = gnutls_rnd(GNUTLS_RND_RANDOM, (char *) key, key_size);
124 fprintf(stderr, "Not enough randomness\n");
129 dkey.size = key_size;
131 ret = gnutls_hex_encode(&dkey, hex_key, &hex_key_size);
133 fprintf(stderr, "HEX encoding error\n");
137 ret = write_key(username, hex_key, hex_key_size, passwd);
139 printf("Key stored to %s\n", passwd);
144 static int filecopy(const char *src, const char *dst)
150 fd = fopen(dst, "w");
152 fprintf(stderr, "Cannot open '%s' for write\n", dst);
156 fd2 = fopen(src, "r");
163 line[sizeof(line) - 1] = 0;
165 p = fgets(line, sizeof(line) - 1, fd2);
180 write_key(const char *username, const char *key, int key_size,
181 const char *passwd_file)
189 /* delete previous entry */
194 if (strlen(passwd_file) + 5 > sizeof(tmpname)) {
195 fprintf(stderr, "file '%s' is tooooo long\n", passwd_file);
199 snprintf(tmpname, sizeof(tmpname), "%s.tmp", passwd_file);
201 if (stat(tmpname, &st) != -1) {
202 fprintf(stderr, "file '%s' is locked\n", tmpname);
206 if (filecopy(passwd_file, tmpname) != 0) {
207 fprintf(stderr, "Cannot copy '%s' to '%s'\n", passwd_file,
212 fd = fopen(passwd_file, "w");
214 fprintf(stderr, "Cannot open '%s' for write\n",
220 fd2 = fopen(tmpname, "r");
222 fprintf(stderr, "Cannot open '%s' for read\n", tmpname);
229 p = fgets(line, sizeof(line) - 1, fd2);
233 pp = strchr(line, ':');
237 if (strncmp(p, username,
238 MAX(strlen(username),
239 (unsigned int) (pp - p))) == 0) {
241 fprintf(fd, "%s:%s\n", username, key);
249 fprintf(fd, "%s:%s\n", username, key);
261 #endif /* ENABLE_PSK */