xref: /plan9/sys/src/cmd/ssh1/authsrvtis.c (revision 63afb9a5d3f910047231762bcce0ee49fed3d07c)
1*63afb9a5SDavid du Colombier #include "ssh.h"
2*63afb9a5SDavid du Colombier 
3*63afb9a5SDavid du Colombier static AuthInfo*
authsrvtisfn(Conn * conn,Msg * m)4*63afb9a5SDavid du Colombier authsrvtisfn(Conn *conn, Msg *m)
5*63afb9a5SDavid du Colombier {
6*63afb9a5SDavid du Colombier 	char *s;
7*63afb9a5SDavid du Colombier 	AuthInfo *ai;
8*63afb9a5SDavid du Colombier 	Chalstate *c;
9*63afb9a5SDavid du Colombier 
10*63afb9a5SDavid du Colombier 	free(m);
11*63afb9a5SDavid du Colombier 	if((c = auth_challenge("proto=p9cr user=%q role=server", conn->user)) == nil){
12*63afb9a5SDavid du Colombier 		sshlog("auth_challenge failed for %s", conn->user);
13*63afb9a5SDavid du Colombier 		return nil;
14*63afb9a5SDavid du Colombier 	}
15*63afb9a5SDavid du Colombier 	s = smprint("Challenge: %s\nResponse: ", c->chal);
16*63afb9a5SDavid du Colombier 	if(s == nil){
17*63afb9a5SDavid du Colombier 		auth_freechal(c);
18*63afb9a5SDavid du Colombier 		return nil;
19*63afb9a5SDavid du Colombier 	}
20*63afb9a5SDavid du Colombier 	m = allocmsg(conn, SSH_SMSG_AUTH_TIS_CHALLENGE, 4+strlen(s));
21*63afb9a5SDavid du Colombier 	putstring(m, s);
22*63afb9a5SDavid du Colombier 	sendmsg(m);
23*63afb9a5SDavid du Colombier 	free(s);
24*63afb9a5SDavid du Colombier 
25*63afb9a5SDavid du Colombier 	m = recvmsg(conn, 0);
26*63afb9a5SDavid du Colombier 	if(m == nil){
27*63afb9a5SDavid du Colombier 		auth_freechal(c);
28*63afb9a5SDavid du Colombier 		return nil;
29*63afb9a5SDavid du Colombier 	}
30*63afb9a5SDavid du Colombier 	if(m->type != SSH_CMSG_AUTH_TIS_RESPONSE){
31*63afb9a5SDavid du Colombier 		/*
32*63afb9a5SDavid du Colombier 		 * apparently you can just give up on
33*63afb9a5SDavid du Colombier 		 * this protocol and start a new one.
34*63afb9a5SDavid du Colombier 		 */
35*63afb9a5SDavid du Colombier 		unrecvmsg(conn, m);
36*63afb9a5SDavid du Colombier 		return nil;
37*63afb9a5SDavid du Colombier 	}
38*63afb9a5SDavid du Colombier 
39*63afb9a5SDavid du Colombier 	c->resp = getstring(m);
40*63afb9a5SDavid du Colombier 	c->nresp = strlen(c->resp);
41*63afb9a5SDavid du Colombier 	ai = auth_response(c);
42*63afb9a5SDavid du Colombier 	auth_freechal(c);
43*63afb9a5SDavid du Colombier 	return ai;
44*63afb9a5SDavid du Colombier }
45*63afb9a5SDavid du Colombier 
46*63afb9a5SDavid du Colombier Authsrv authsrvtis =
47*63afb9a5SDavid du Colombier {
48*63afb9a5SDavid du Colombier 	SSH_AUTH_TIS,
49*63afb9a5SDavid du Colombier 	"tis",
50*63afb9a5SDavid du Colombier 	SSH_CMSG_AUTH_TIS,
51*63afb9a5SDavid du Colombier 	authsrvtisfn,
52*63afb9a5SDavid du Colombier };
53