2 * SSH RSA authentication.
6 * if you don't like it, read another, repeat
9 * all numbers are hexadecimal biginits parsable with strtomp.
21 static char *phasenames[] = {
22 [CHavePub] "CHavePub",
23 [CHaveResp] "CHaveResp",
40 priv = rsaprivalloc();
42 if((a=strfindattr(k->attr, "ek"))==nil || (priv->pub.ek=strtomp(a, nil, 16, nil))==nil)
44 if((a=strfindattr(k->attr, "n"))==nil || (priv->pub.n=strtomp(a, nil, 16, nil))==nil)
46 if((a=strfindattr(k->privattr, "!p"))==nil || (priv->p=strtomp(a, nil, 16, nil))==nil)
48 if((a=strfindattr(k->privattr, "!q"))==nil || (priv->q=strtomp(a, nil, 16, nil))==nil)
50 if((a=strfindattr(k->privattr, "!kp"))==nil || (priv->kp=strtomp(a, nil, 16, nil))==nil)
52 if((a=strfindattr(k->privattr, "!kq"))==nil || (priv->kq=strtomp(a, nil, 16, nil))==nil)
54 if((a=strfindattr(k->privattr, "!c2"))==nil || (priv->c2=strtomp(a, nil, 16, nil))==nil)
56 if((a=strfindattr(k->privattr, "!dk"))==nil || (priv->dk=strtomp(a, nil, 16, nil))==nil)
66 sshrsainit(Proto*, Fsstate *fss)
71 if((iscli = isclient(strfindattr(fss->attr, "role"))) < 0)
72 return failure(fss, nil);
74 return failure(fss, "sshrsa server unimplemented");
76 s = emalloc(sizeof *s);
77 fss->phasename = phasenames;
78 fss->maxphase = Maxphase;
79 fss->phase = CHavePub;
85 sshrsaread(Fsstate *fss, void *va, uint *n)
93 return phaseerror(fss, "read");
99 if((s->key = findkey(fss, Kuser, nil, s->off, fss->attr, nil)) == nil)
100 return failure(fss, nil);
103 *n = snprint(va, *n, "%B", priv->pub.n);
106 *n = snprint(va, *n, "%B", s->resp);
107 fss->phase = Established;
113 sshrsawrite(Fsstate *fss, void *va, uint)
121 return phaseerror(fss, "write");
124 return failure(fss, "no current key");
125 m = strtomp(va, nil, 16, nil);
126 m = rsadecrypt(s->key->priv, m, m);
128 fss->phase = CHaveResp;
134 sshrsaclose(Fsstate *fss)
149 fmtinstall('B', mpconv);
151 if((k->priv = readrsapriv(k)) == nil){
152 werrstr("malformed key data");
155 return replacekey(k);
159 sshrsaclosekey(Key *k)
161 rsaprivfree(k->priv);
170 .addkey= sshrsaaddkey,
171 .closekey= sshrsaclosekey,