xref: /plan9/sys/src/cmd/ssh2/rsa2ssh2.c (revision 63afb9a5d3f910047231762bcce0ee49fed3d07c)
1*63afb9a5SDavid du Colombier #include <u.h>
2*63afb9a5SDavid du Colombier #include <libc.h>
3*63afb9a5SDavid du Colombier #include <mp.h>
4*63afb9a5SDavid du Colombier #include <fcall.h>
5*63afb9a5SDavid du Colombier #include <thread.h>
6*63afb9a5SDavid du Colombier #include <9p.h>
7*63afb9a5SDavid du Colombier #include <auth.h>
8*63afb9a5SDavid du Colombier #include <authsrv.h>
9*63afb9a5SDavid du Colombier #include <libsec.h>
10*63afb9a5SDavid du Colombier #include "netssh.h"
11*63afb9a5SDavid du Colombier 
12*63afb9a5SDavid du Colombier Cipher *cryptos[1];
13*63afb9a5SDavid du Colombier int debug;
14*63afb9a5SDavid du Colombier 
15*63afb9a5SDavid du Colombier void
usage(void)16*63afb9a5SDavid du Colombier usage(void)
17*63afb9a5SDavid du Colombier {
18*63afb9a5SDavid du Colombier 	fprint(2, "usage: %s [file]\n", argv0);
19*63afb9a5SDavid du Colombier 	exits("usage");
20*63afb9a5SDavid du Colombier }
21*63afb9a5SDavid du Colombier 
22*63afb9a5SDavid du Colombier void
main(int argc,char * argv[])23*63afb9a5SDavid du Colombier main(int argc, char *argv[])
24*63afb9a5SDavid du Colombier {
25*63afb9a5SDavid du Colombier 	Packet *p;
26*63afb9a5SDavid du Colombier 	char *ep, *np, *user;
27*63afb9a5SDavid du Colombier 	mpint *e, *n;
28*63afb9a5SDavid du Colombier 	int fd, m;
29*63afb9a5SDavid du Colombier 	char key[Maxrpcbuf], encpub[Maxrpcbuf];
30*63afb9a5SDavid du Colombier 
31*63afb9a5SDavid du Colombier 	ARGBEGIN {
32*63afb9a5SDavid du Colombier 	default:
33*63afb9a5SDavid du Colombier 		usage();
34*63afb9a5SDavid du Colombier 	} ARGEND
35*63afb9a5SDavid du Colombier 	if (argc > 1)
36*63afb9a5SDavid du Colombier 		usage();
37*63afb9a5SDavid du Colombier 
38*63afb9a5SDavid du Colombier 	user = getenv("user");
39*63afb9a5SDavid du Colombier 	if (argc == 0)
40*63afb9a5SDavid du Colombier 		fd = 0;
41*63afb9a5SDavid du Colombier 	else {
42*63afb9a5SDavid du Colombier 		fd = open(argv[0], OREAD);
43*63afb9a5SDavid du Colombier 		if (fd < 0)
44*63afb9a5SDavid du Colombier 			usage();
45*63afb9a5SDavid du Colombier 	}
46*63afb9a5SDavid du Colombier 	m = read(fd, key, Maxrpcbuf - 1);
47*63afb9a5SDavid du Colombier 	close(fd);
48*63afb9a5SDavid du Colombier 	key[m >= 0? m: 0] = 0;
49*63afb9a5SDavid du Colombier 
50*63afb9a5SDavid du Colombier 	ep = strstr(key, " ek=");
51*63afb9a5SDavid du Colombier 	np = strstr(key, " n=");
52*63afb9a5SDavid du Colombier 	if (ep == nil || np == nil)
53*63afb9a5SDavid du Colombier 		sysfatal("bad key file\n");
54*63afb9a5SDavid du Colombier 	e = strtomp(ep+4, nil, 16, nil);
55*63afb9a5SDavid du Colombier 	n = strtomp(np+3, nil, 16, nil);
56*63afb9a5SDavid du Colombier 	p = new_packet(nil);
57*63afb9a5SDavid du Colombier 	add_string(p, "ssh-rsa");
58*63afb9a5SDavid du Colombier 	add_mp(p, e);
59*63afb9a5SDavid du Colombier 	add_mp(p, n);
60*63afb9a5SDavid du Colombier 	if ((m = enc64(encpub, Maxrpcbuf, p->payload, p->rlength-1)) < 0)
61*63afb9a5SDavid du Colombier 		sysfatal("base-64 encoding failed\n");
62*63afb9a5SDavid du Colombier 	print("ssh-rsa ");
63*63afb9a5SDavid du Colombier 	write(1, encpub, m);
64*63afb9a5SDavid du Colombier 	if (user)
65*63afb9a5SDavid du Colombier 		print(" %s\n", user);
66*63afb9a5SDavid du Colombier }
67