113b8cf66Sagc /*-
213b8cf66Sagc * Copyright (c) 2010 Alistair Crooks <agc@NetBSD.org>
313b8cf66Sagc * All rights reserved.
413b8cf66Sagc *
513b8cf66Sagc * Redistribution and use in source and binary forms, with or without
613b8cf66Sagc * modification, are permitted provided that the following conditions
713b8cf66Sagc * are met:
813b8cf66Sagc * 1. Redistributions of source code must retain the above copyright
913b8cf66Sagc * notice, this list of conditions and the following disclaimer.
1013b8cf66Sagc * 2. Redistributions in binary form must reproduce the above copyright
1113b8cf66Sagc * notice, this list of conditions and the following disclaimer in the
1213b8cf66Sagc * documentation and/or other materials provided with the distribution.
1313b8cf66Sagc *
1413b8cf66Sagc * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1513b8cf66Sagc * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1613b8cf66Sagc * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1713b8cf66Sagc * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1813b8cf66Sagc * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1913b8cf66Sagc * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2013b8cf66Sagc * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2113b8cf66Sagc * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2213b8cf66Sagc * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2313b8cf66Sagc * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2413b8cf66Sagc */
2513b8cf66Sagc #include <sys/types.h>
2613b8cf66Sagc #include <sys/param.h>
2713b8cf66Sagc
2813b8cf66Sagc #include <inttypes.h>
2913b8cf66Sagc #include <netpgp.h>
3013b8cf66Sagc #include <stdio.h>
3113b8cf66Sagc #include <stdlib.h>
3213b8cf66Sagc #include <string.h>
3313b8cf66Sagc #include <unistd.h>
3413b8cf66Sagc
3513b8cf66Sagc #include "b64.h"
3613b8cf66Sagc #include "hkpc.h"
3713b8cf66Sagc
3813b8cf66Sagc #define DEFAULT_NUMBITS 2048
3913b8cf66Sagc
4013b8cf66Sagc #define DEFAULT_HASH_ALG "SHA256"
4113b8cf66Sagc
4213b8cf66Sagc int
main(int argc,char ** argv)4313b8cf66Sagc main(int argc, char **argv)
4413b8cf66Sagc {
4513b8cf66Sagc netpgp_t netpgp;
4613b8cf66Sagc char *res;
4713b8cf66Sagc char key[8192];
4813b8cf66Sagc char asc[8192];
4913b8cf66Sagc char server[BUFSIZ];
5013b8cf66Sagc char *cp;
5113b8cf66Sagc int family;
5213b8cf66Sagc int port;
5313b8cf66Sagc int keyc;
5413b8cf66Sagc int ascc;
5513b8cf66Sagc int ok;
5613b8cf66Sagc int i;
5713b8cf66Sagc
5813b8cf66Sagc (void) memset(&netpgp, 0x0, sizeof(netpgp));
5913b8cf66Sagc port = 11371;
6013b8cf66Sagc family = 4;
6113b8cf66Sagc (void) snprintf(server, sizeof(server), "localhost");
6213b8cf66Sagc while ((i = getopt(argc, argv, "f:h:p:")) != -1) {
6313b8cf66Sagc switch(i) {
6413b8cf66Sagc case 'f':
6513b8cf66Sagc family = atoi(optarg);
6613b8cf66Sagc break;
6713b8cf66Sagc case 'h':
6813b8cf66Sagc (void) snprintf(server, sizeof(server), optarg);
6913b8cf66Sagc break;
7013b8cf66Sagc case 'p':
7113b8cf66Sagc port = atoi(optarg);
7213b8cf66Sagc break;
7313b8cf66Sagc default:
7413b8cf66Sagc break;
7513b8cf66Sagc }
7613b8cf66Sagc }
7713b8cf66Sagc netpgp_setvar(&netpgp, "ssh keys", "1");
7813b8cf66Sagc netpgp_setvar(&netpgp, "hash", DEFAULT_HASH_ALG);
7913b8cf66Sagc netpgp_set_homedir(&netpgp, getenv("HOME"), "/.ssh", 1);
8013b8cf66Sagc for (ok = 1, i = optind ; i < argc ; i++) {
8113b8cf66Sagc if (!hkpc_get(&res, server, port, family, "get", argv[i])) {
8213b8cf66Sagc (void) fprintf(stderr, "No such key '%s'\n", argv[i]);
8313b8cf66Sagc ok = 0;
8413b8cf66Sagc }
8513b8cf66Sagc if ((keyc = netpgp_write_sshkey(&netpgp, res, argv[i], key, sizeof(key))) <= 0) {
8613b8cf66Sagc (void) fprintf(stderr, "can't netpgp_write_sshkey '%s'\n", argv[i]);
8713b8cf66Sagc ok = 0;
8813b8cf66Sagc }
8913b8cf66Sagc for (cp = &key[keyc - 1] ; cp > key && *cp != ' ' ; --cp) {
9013b8cf66Sagc }
9113b8cf66Sagc if (cp == key) {
9213b8cf66Sagc cp = argv[i];
9313b8cf66Sagc } else {
9413b8cf66Sagc cp += 1;
9513b8cf66Sagc }
9613b8cf66Sagc /* btoa */
9713b8cf66Sagc ascc = b64encode(key, keyc, asc, sizeof(asc), 0xffffffff);
9813b8cf66Sagc /* write to .ssh/id_c0596823.pub */
99*c9aae3a7Sagc printf("ssh-rsa %.*s %s\n", ascc, asc, cp);
10013b8cf66Sagc }
10113b8cf66Sagc exit((ok) ? EXIT_SUCCESS : EXIT_FAILURE);
10213b8cf66Sagc }
103