Blame


1 2277c5d7 2004-03-21 devnull /*
2 2277c5d7 2004-03-21 devnull * SSH RSA authentication.
3 2277c5d7 2004-03-21 devnull *
4 2277c5d7 2004-03-21 devnull * Client protocol:
5 2277c5d7 2004-03-21 devnull * read public key
6 2277c5d7 2004-03-21 devnull * if you don't like it, read another, repeat
7 2277c5d7 2004-03-21 devnull * write challenge
8 2277c5d7 2004-03-21 devnull * read response
9 2277c5d7 2004-03-21 devnull * all numbers are hexadecimal biginits parsable with strtomp.
10 2277c5d7 2004-03-21 devnull */
11 2277c5d7 2004-03-21 devnull
12 2277c5d7 2004-03-21 devnull #include "dat.h"
13 2277c5d7 2004-03-21 devnull
14 2277c5d7 2004-03-21 devnull enum {
15 2277c5d7 2004-03-21 devnull CHavePub,
16 2277c5d7 2004-03-21 devnull CHaveResp,
17 2277c5d7 2004-03-21 devnull
18 2277c5d7 2004-03-21 devnull Maxphase,
19 2277c5d7 2004-03-21 devnull };
20 2277c5d7 2004-03-21 devnull
21 2277c5d7 2004-03-21 devnull static char *phasenames[] = {
22 2277c5d7 2004-03-21 devnull [CHavePub] "CHavePub",
23 2277c5d7 2004-03-21 devnull [CHaveResp] "CHaveResp",
24 2277c5d7 2004-03-21 devnull };
25 2277c5d7 2004-03-21 devnull
26 2277c5d7 2004-03-21 devnull struct State
27 2277c5d7 2004-03-21 devnull {
28 2277c5d7 2004-03-21 devnull RSApriv *priv;
29 2277c5d7 2004-03-21 devnull mpint *resp;
30 2277c5d7 2004-03-21 devnull int off;
31 2277c5d7 2004-03-21 devnull Key *key;
32 2277c5d7 2004-03-21 devnull };
33 2277c5d7 2004-03-21 devnull
34 2277c5d7 2004-03-21 devnull static RSApriv*
35 2277c5d7 2004-03-21 devnull readrsapriv(Key *k)
36 2277c5d7 2004-03-21 devnull {
37 2277c5d7 2004-03-21 devnull char *a;
38 2277c5d7 2004-03-21 devnull RSApriv *priv;
39 2277c5d7 2004-03-21 devnull
40 2277c5d7 2004-03-21 devnull priv = rsaprivalloc();
41 2277c5d7 2004-03-21 devnull
42 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->attr, "ek"))==nil || (priv->pub.ek=strtomp(a, nil, 16, nil))==nil)
43 2277c5d7 2004-03-21 devnull goto Error;
44 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->attr, "n"))==nil || (priv->pub.n=strtomp(a, nil, 16, nil))==nil)
45 2277c5d7 2004-03-21 devnull goto Error;
46 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->privattr, "!p"))==nil || (priv->p=strtomp(a, nil, 16, nil))==nil)
47 2277c5d7 2004-03-21 devnull goto Error;
48 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->privattr, "!q"))==nil || (priv->q=strtomp(a, nil, 16, nil))==nil)
49 2277c5d7 2004-03-21 devnull goto Error;
50 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->privattr, "!kp"))==nil || (priv->kp=strtomp(a, nil, 16, nil))==nil)
51 2277c5d7 2004-03-21 devnull goto Error;
52 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->privattr, "!kq"))==nil || (priv->kq=strtomp(a, nil, 16, nil))==nil)
53 2277c5d7 2004-03-21 devnull goto Error;
54 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->privattr, "!c2"))==nil || (priv->c2=strtomp(a, nil, 16, nil))==nil)
55 2277c5d7 2004-03-21 devnull goto Error;
56 2277c5d7 2004-03-21 devnull if((a=strfindattr(k->privattr, "!dk"))==nil || (priv->dk=strtomp(a, nil, 16, nil))==nil)
57 2277c5d7 2004-03-21 devnull goto Error;
58 2277c5d7 2004-03-21 devnull return priv;
59 2277c5d7 2004-03-21 devnull
60 2277c5d7 2004-03-21 devnull Error:
61 2277c5d7 2004-03-21 devnull rsaprivfree(priv);
62 2277c5d7 2004-03-21 devnull return nil;
63 2277c5d7 2004-03-21 devnull }
64 2277c5d7 2004-03-21 devnull
65 2277c5d7 2004-03-21 devnull static int
66 2277c5d7 2004-03-21 devnull sshrsainit(Proto*, Fsstate *fss)
67 2277c5d7 2004-03-21 devnull {
68 2277c5d7 2004-03-21 devnull int iscli;
69 2277c5d7 2004-03-21 devnull State *s;
70 2277c5d7 2004-03-21 devnull
71 2277c5d7 2004-03-21 devnull if((iscli = isclient(strfindattr(fss->attr, "role"))) < 0)
72 2277c5d7 2004-03-21 devnull return failure(fss, nil);
73 2277c5d7 2004-03-21 devnull if(iscli==0)
74 2277c5d7 2004-03-21 devnull return failure(fss, "sshrsa server unimplemented");
75 2277c5d7 2004-03-21 devnull
76 2277c5d7 2004-03-21 devnull s = emalloc(sizeof *s);
77 2277c5d7 2004-03-21 devnull fss->phasename = phasenames;
78 2277c5d7 2004-03-21 devnull fss->maxphase = Maxphase;
79 2277c5d7 2004-03-21 devnull fss->phase = CHavePub;
80 2277c5d7 2004-03-21 devnull fss->ps = s;
81 2277c5d7 2004-03-21 devnull return RpcOk;
82 2277c5d7 2004-03-21 devnull }
83 2277c5d7 2004-03-21 devnull
84 2277c5d7 2004-03-21 devnull static int
85 2277c5d7 2004-03-21 devnull sshrsaread(Fsstate *fss, void *va, uint *n)
86 2277c5d7 2004-03-21 devnull {
87 2277c5d7 2004-03-21 devnull RSApriv *priv;
88 2277c5d7 2004-03-21 devnull State *s;
89 2277c5d7 2004-03-21 devnull
90 2277c5d7 2004-03-21 devnull s = fss->ps;
91 2277c5d7 2004-03-21 devnull switch(fss->phase){
92 2277c5d7 2004-03-21 devnull default:
93 2277c5d7 2004-03-21 devnull return phaseerror(fss, "read");
94 2277c5d7 2004-03-21 devnull case CHavePub:
95 2277c5d7 2004-03-21 devnull if(s->key){
96 2277c5d7 2004-03-21 devnull closekey(s->key);
97 2277c5d7 2004-03-21 devnull s->key = nil;
98 2277c5d7 2004-03-21 devnull }
99 2277c5d7 2004-03-21 devnull if((s->key = findkey(fss, Kuser, nil, s->off, fss->attr, nil)) == nil)
100 2277c5d7 2004-03-21 devnull return failure(fss, nil);
101 2277c5d7 2004-03-21 devnull s->off++;
102 2277c5d7 2004-03-21 devnull priv = s->key->priv;
103 2277c5d7 2004-03-21 devnull *n = snprint(va, *n, "%B", priv->pub.n);
104 2277c5d7 2004-03-21 devnull return RpcOk;
105 2277c5d7 2004-03-21 devnull case CHaveResp:
106 2277c5d7 2004-03-21 devnull *n = snprint(va, *n, "%B", s->resp);
107 2277c5d7 2004-03-21 devnull fss->phase = Established;
108 2277c5d7 2004-03-21 devnull return RpcOk;
109 2277c5d7 2004-03-21 devnull }
110 2277c5d7 2004-03-21 devnull }
111 2277c5d7 2004-03-21 devnull
112 2277c5d7 2004-03-21 devnull static int
113 2277c5d7 2004-03-21 devnull sshrsawrite(Fsstate *fss, void *va, uint)
114 2277c5d7 2004-03-21 devnull {
115 2277c5d7 2004-03-21 devnull mpint *m;
116 2277c5d7 2004-03-21 devnull State *s;
117 2277c5d7 2004-03-21 devnull
118 2277c5d7 2004-03-21 devnull s = fss->ps;
119 2277c5d7 2004-03-21 devnull switch(fss->phase){
120 2277c5d7 2004-03-21 devnull default:
121 2277c5d7 2004-03-21 devnull return phaseerror(fss, "write");
122 2277c5d7 2004-03-21 devnull case CHavePub:
123 2277c5d7 2004-03-21 devnull if(s->key == nil)
124 2277c5d7 2004-03-21 devnull return failure(fss, "no current key");
125 2277c5d7 2004-03-21 devnull m = strtomp(va, nil, 16, nil);
126 2277c5d7 2004-03-21 devnull m = rsadecrypt(s->key->priv, m, m);
127 2277c5d7 2004-03-21 devnull s->resp = m;
128 2277c5d7 2004-03-21 devnull fss->phase = CHaveResp;
129 2277c5d7 2004-03-21 devnull return RpcOk;
130 2277c5d7 2004-03-21 devnull }
131 2277c5d7 2004-03-21 devnull }
132 2277c5d7 2004-03-21 devnull
133 2277c5d7 2004-03-21 devnull static void
134 2277c5d7 2004-03-21 devnull sshrsaclose(Fsstate *fss)
135 2277c5d7 2004-03-21 devnull {
136 2277c5d7 2004-03-21 devnull State *s;
137 2277c5d7 2004-03-21 devnull
138 2277c5d7 2004-03-21 devnull s = fss->ps;
139 2277c5d7 2004-03-21 devnull if(s->key)
140 2277c5d7 2004-03-21 devnull closekey(s->key);
141 2277c5d7 2004-03-21 devnull if(s->resp)
142 2277c5d7 2004-03-21 devnull mpfree(s->resp);
143 2277c5d7 2004-03-21 devnull free(s);
144 2277c5d7 2004-03-21 devnull }
145 2277c5d7 2004-03-21 devnull
146 2277c5d7 2004-03-21 devnull static int
147 2277c5d7 2004-03-21 devnull sshrsaaddkey(Key *k)
148 2277c5d7 2004-03-21 devnull {
149 2277c5d7 2004-03-21 devnull fmtinstall('B', mpconv);
150 2277c5d7 2004-03-21 devnull
151 2277c5d7 2004-03-21 devnull if((k->priv = readrsapriv(k)) == nil){
152 2277c5d7 2004-03-21 devnull werrstr("malformed key data");
153 2277c5d7 2004-03-21 devnull return -1;
154 2277c5d7 2004-03-21 devnull }
155 2277c5d7 2004-03-21 devnull return replacekey(k);
156 2277c5d7 2004-03-21 devnull }
157 2277c5d7 2004-03-21 devnull
158 2277c5d7 2004-03-21 devnull static void
159 2277c5d7 2004-03-21 devnull sshrsaclosekey(Key *k)
160 2277c5d7 2004-03-21 devnull {
161 2277c5d7 2004-03-21 devnull rsaprivfree(k->priv);
162 2277c5d7 2004-03-21 devnull }
163 2277c5d7 2004-03-21 devnull
164 2277c5d7 2004-03-21 devnull Proto sshrsa = {
165 2277c5d7 2004-03-21 devnull .name= "sshrsa",
166 2277c5d7 2004-03-21 devnull .init= sshrsainit,
167 2277c5d7 2004-03-21 devnull .write= sshrsawrite,
168 2277c5d7 2004-03-21 devnull .read= sshrsaread,
169 2277c5d7 2004-03-21 devnull .close= sshrsaclose,
170 2277c5d7 2004-03-21 devnull .addkey= sshrsaaddkey,
171 2277c5d7 2004-03-21 devnull .closekey= sshrsaclosekey,
172 2277c5d7 2004-03-21 devnull };