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