Blame


1 ce94dbe6 2005-02-13 devnull /*
2 ce94dbe6 2005-02-13 devnull * Present factotum in ssh agent clothing.
3 ce94dbe6 2005-02-13 devnull */
4 ce94dbe6 2005-02-13 devnull #include <u.h>
5 ce94dbe6 2005-02-13 devnull #include <libc.h>
6 ce94dbe6 2005-02-13 devnull #include <mp.h>
7 ce94dbe6 2005-02-13 devnull #include <libsec.h>
8 ce94dbe6 2005-02-13 devnull #include <auth.h>
9 ce94dbe6 2005-02-13 devnull #include <thread.h>
10 ce94dbe6 2005-02-13 devnull #include <9pclient.h>
11 ce94dbe6 2005-02-13 devnull
12 ce94dbe6 2005-02-13 devnull enum
13 ce94dbe6 2005-02-13 devnull {
14 ce94dbe6 2005-02-13 devnull STACK = 65536
15 ce94dbe6 2005-02-13 devnull };
16 ce94dbe6 2005-02-13 devnull enum /* agent protocol packet types */
17 ce94dbe6 2005-02-13 devnull {
18 ce94dbe6 2005-02-13 devnull SSH_AGENTC_NONE = 0,
19 ce94dbe6 2005-02-13 devnull SSH_AGENTC_REQUEST_RSA_IDENTITIES,
20 ce94dbe6 2005-02-13 devnull SSH_AGENT_RSA_IDENTITIES_ANSWER,
21 ce94dbe6 2005-02-13 devnull SSH_AGENTC_RSA_CHALLENGE,
22 ce94dbe6 2005-02-13 devnull SSH_AGENT_RSA_RESPONSE,
23 ce94dbe6 2005-02-13 devnull SSH_AGENT_FAILURE,
24 ce94dbe6 2005-02-13 devnull SSH_AGENT_SUCCESS,
25 ce94dbe6 2005-02-13 devnull SSH_AGENTC_ADD_RSA_IDENTITY,
26 ce94dbe6 2005-02-13 devnull SSH_AGENTC_REMOVE_RSA_IDENTITY,
27 ce94dbe6 2005-02-13 devnull SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES,
28 fa325e9b 2020-01-10 cross
29 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_REQUEST_IDENTITIES = 11,
30 ce94dbe6 2005-02-13 devnull SSH2_AGENT_IDENTITIES_ANSWER,
31 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_SIGN_REQUEST,
32 ce94dbe6 2005-02-13 devnull SSH2_AGENT_SIGN_RESPONSE,
33 ce94dbe6 2005-02-13 devnull
34 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_ADD_IDENTITY = 17,
35 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_REMOVE_IDENTITY,
36 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_REMOVE_ALL_IDENTITIES,
37 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_ADD_SMARTCARD_KEY,
38 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_REMOVE_SMARTCARD_KEY,
39 ce94dbe6 2005-02-13 devnull
40 ce94dbe6 2005-02-13 devnull SSH_AGENTC_LOCK,
41 ce94dbe6 2005-02-13 devnull SSH_AGENTC_UNLOCK,
42 ce94dbe6 2005-02-13 devnull SSH_AGENTC_ADD_RSA_ID_CONSTRAINED,
43 ce94dbe6 2005-02-13 devnull SSH2_AGENTC_ADD_ID_CONSTRAINED,
44 ce94dbe6 2005-02-13 devnull SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED,
45 fa325e9b 2020-01-10 cross
46 ce94dbe6 2005-02-13 devnull SSH_AGENT_CONSTRAIN_LIFETIME = 1,
47 ce94dbe6 2005-02-13 devnull SSH_AGENT_CONSTRAIN_CONFIRM = 2,
48 ce94dbe6 2005-02-13 devnull
49 ce94dbe6 2005-02-13 devnull SSH2_AGENT_FAILURE = 30,
50 fa325e9b 2020-01-10 cross
51 ce94dbe6 2005-02-13 devnull SSH_COM_AGENT2_FAILURE = 102,
52 cbeb0b26 2006-04-01 devnull SSH_AGENT_OLD_SIGNATURE = 0x01
53 ce94dbe6 2005-02-13 devnull };
54 ce94dbe6 2005-02-13 devnull
55 ce94dbe6 2005-02-13 devnull typedef struct Aconn Aconn;
56 ce94dbe6 2005-02-13 devnull struct Aconn
57 ce94dbe6 2005-02-13 devnull {
58 ce94dbe6 2005-02-13 devnull uchar *data;
59 ce94dbe6 2005-02-13 devnull uint ndata;
60 ce94dbe6 2005-02-13 devnull int ctl;
61 ce94dbe6 2005-02-13 devnull int fd;
62 ce94dbe6 2005-02-13 devnull char dir[40];
63 ce94dbe6 2005-02-13 devnull };
64 ce94dbe6 2005-02-13 devnull
65 ce94dbe6 2005-02-13 devnull typedef struct Msg Msg;
66 ce94dbe6 2005-02-13 devnull struct Msg
67 ce94dbe6 2005-02-13 devnull {
68 ce94dbe6 2005-02-13 devnull uchar *bp;
69 ce94dbe6 2005-02-13 devnull uchar *p;
70 ce94dbe6 2005-02-13 devnull uchar *ep;
71 acb880af 2006-03-21 devnull int bpalloc;
72 ce94dbe6 2005-02-13 devnull };
73 ce94dbe6 2005-02-13 devnull
74 ce94dbe6 2005-02-13 devnull char adir[40];
75 ce94dbe6 2005-02-13 devnull int afd;
76 ce94dbe6 2005-02-13 devnull int chatty;
77 ce94dbe6 2005-02-13 devnull char *factotum = "factotum";
78 ce94dbe6 2005-02-13 devnull
79 ce94dbe6 2005-02-13 devnull void agentproc(void *v);
80 ce94dbe6 2005-02-13 devnull void* emalloc(int n);
81 ce94dbe6 2005-02-13 devnull void* erealloc(void *v, int n);
82 ce94dbe6 2005-02-13 devnull void listenproc(void *v);
83 ce94dbe6 2005-02-13 devnull int runmsg(Aconn *a);
84 ce94dbe6 2005-02-13 devnull void listkeystext(void);
85 ce94dbe6 2005-02-13 devnull
86 ce94dbe6 2005-02-13 devnull void
87 ce94dbe6 2005-02-13 devnull usage(void)
88 ce94dbe6 2005-02-13 devnull {
89 ce94dbe6 2005-02-13 devnull fprint(2, "usage: 9 ssh-agent [-D] [factotum]\n");
90 ce94dbe6 2005-02-13 devnull threadexitsall("usage");
91 b3a20a96 2020-12-30 rsc }
92 b3a20a96 2020-12-30 rsc
93 b3a20a96 2020-12-30 rsc int
94 b3a20a96 2020-12-30 rsc threadmaybackground(void)
95 b3a20a96 2020-12-30 rsc {
96 b3a20a96 2020-12-30 rsc return 1;
97 ce94dbe6 2005-02-13 devnull }
98 ce94dbe6 2005-02-13 devnull
99 ce94dbe6 2005-02-13 devnull void
100 ce94dbe6 2005-02-13 devnull threadmain(int argc, char **argv)
101 ce94dbe6 2005-02-13 devnull {
102 ce94dbe6 2005-02-13 devnull int fd, pid, export, dotextlist;
103 e3331bf2 2005-03-18 devnull char dir[100], *ns;
104 ce94dbe6 2005-02-13 devnull char sock[200], addr[200];
105 ce94dbe6 2005-02-13 devnull uvlong x;
106 ce94dbe6 2005-02-13 devnull
107 ce94dbe6 2005-02-13 devnull export = 0;
108 ce94dbe6 2005-02-13 devnull dotextlist = 0;
109 ce94dbe6 2005-02-13 devnull pid = getpid();
110 ce94dbe6 2005-02-13 devnull fmtinstall('B', mpfmt);
111 ce94dbe6 2005-02-13 devnull fmtinstall('H', encodefmt);
112 ce94dbe6 2005-02-13 devnull fmtinstall('[', encodefmt);
113 e1a22963 2005-02-13 devnull
114 ce94dbe6 2005-02-13 devnull ARGBEGIN{
115 e1a22963 2005-02-13 devnull case '9':
116 e1a22963 2005-02-13 devnull chatty9pclient++;
117 e1a22963 2005-02-13 devnull break;
118 ce94dbe6 2005-02-13 devnull case 'D':
119 ce94dbe6 2005-02-13 devnull chatty++;
120 ce94dbe6 2005-02-13 devnull break;
121 ce94dbe6 2005-02-13 devnull case 'e':
122 ce94dbe6 2005-02-13 devnull export = 1;
123 ce94dbe6 2005-02-13 devnull break;
124 ce94dbe6 2005-02-13 devnull case 'l':
125 ce94dbe6 2005-02-13 devnull dotextlist = 1;
126 ce94dbe6 2005-02-13 devnull break;
127 ce94dbe6 2005-02-13 devnull default:
128 ce94dbe6 2005-02-13 devnull usage();
129 ce94dbe6 2005-02-13 devnull }ARGEND
130 fa325e9b 2020-01-10 cross
131 ce94dbe6 2005-02-13 devnull if(argc > 1)
132 ce94dbe6 2005-02-13 devnull usage();
133 ce94dbe6 2005-02-13 devnull if(argc == 1)
134 ce94dbe6 2005-02-13 devnull factotum = argv[0];
135 fa325e9b 2020-01-10 cross
136 ce94dbe6 2005-02-13 devnull if(dotextlist)
137 ce94dbe6 2005-02-13 devnull listkeystext();
138 ce94dbe6 2005-02-13 devnull
139 e3331bf2 2005-03-18 devnull ns = getns();
140 e3331bf2 2005-03-18 devnull snprint(sock, sizeof sock, "%s/ssh-agent.socket", ns);
141 e3331bf2 2005-03-18 devnull if(0){
142 e3331bf2 2005-03-18 devnull x = ((uvlong)fastrand()<<32) | fastrand();
143 e3331bf2 2005-03-18 devnull x ^= ((uvlong)fastrand()<<32) | fastrand();
144 e3331bf2 2005-03-18 devnull snprint(dir, sizeof dir, "/tmp/ssh-%llux", x);
145 e3331bf2 2005-03-18 devnull if((fd = create(dir, OREAD, DMDIR|0700)) < 0)
146 e3331bf2 2005-03-18 devnull sysfatal("mkdir %s: %r", dir);
147 e3331bf2 2005-03-18 devnull close(fd);
148 e3331bf2 2005-03-18 devnull snprint(sock, sizeof sock, "%s/agent.%d", dir, pid);
149 e3331bf2 2005-03-18 devnull }
150 ce94dbe6 2005-02-13 devnull snprint(addr, sizeof addr, "unix!%s", sock);
151 ce94dbe6 2005-02-13 devnull
152 ce94dbe6 2005-02-13 devnull if((afd = announce(addr, adir)) < 0)
153 ce94dbe6 2005-02-13 devnull sysfatal("announce %s: %r", addr);
154 fa325e9b 2020-01-10 cross
155 ce94dbe6 2005-02-13 devnull print("SSH_AUTH_SOCK=%s;\n", sock);
156 ce94dbe6 2005-02-13 devnull if(export)
157 ce94dbe6 2005-02-13 devnull print("export SSH_AUTH_SOCK;\n");
158 ce94dbe6 2005-02-13 devnull print("SSH_AGENT_PID=%d;\n", pid);
159 ce94dbe6 2005-02-13 devnull if(export)
160 ce94dbe6 2005-02-13 devnull print("export SSH_AGENT_PID;\n");
161 ce94dbe6 2005-02-13 devnull close(1);
162 e1a22963 2005-02-13 devnull rfork(RFNOTEG);
163 e1a22963 2005-02-13 devnull proccreate(listenproc, nil, STACK);
164 ce94dbe6 2005-02-13 devnull threadexits(0);
165 ce94dbe6 2005-02-13 devnull }
166 ce94dbe6 2005-02-13 devnull
167 ce94dbe6 2005-02-13 devnull void
168 ce94dbe6 2005-02-13 devnull listenproc(void *v)
169 ce94dbe6 2005-02-13 devnull {
170 ce94dbe6 2005-02-13 devnull Aconn *a;
171 ce94dbe6 2005-02-13 devnull
172 ce94dbe6 2005-02-13 devnull USED(v);
173 ce94dbe6 2005-02-13 devnull for(;;){
174 ce94dbe6 2005-02-13 devnull a = emalloc(sizeof *a);
175 ce94dbe6 2005-02-13 devnull a->ctl = listen(adir, a->dir);
176 ce94dbe6 2005-02-13 devnull if(a->ctl < 0)
177 ce94dbe6 2005-02-13 devnull sysfatal("listen: %r");
178 ce94dbe6 2005-02-13 devnull proccreate(agentproc, a, STACK);
179 ce94dbe6 2005-02-13 devnull }
180 ce94dbe6 2005-02-13 devnull }
181 ce94dbe6 2005-02-13 devnull
182 ce94dbe6 2005-02-13 devnull void
183 ce94dbe6 2005-02-13 devnull agentproc(void *v)
184 ce94dbe6 2005-02-13 devnull {
185 ce94dbe6 2005-02-13 devnull Aconn *a;
186 ce94dbe6 2005-02-13 devnull int n;
187 fa325e9b 2020-01-10 cross
188 ce94dbe6 2005-02-13 devnull a = v;
189 ce94dbe6 2005-02-13 devnull a->fd = accept(a->ctl, a->dir);
190 ce94dbe6 2005-02-13 devnull close(a->ctl);
191 ce94dbe6 2005-02-13 devnull a->ctl = -1;
192 ce94dbe6 2005-02-13 devnull for(;;){
193 ce94dbe6 2005-02-13 devnull a->data = erealloc(a->data, a->ndata+1024);
194 ce94dbe6 2005-02-13 devnull n = read(a->fd, a->data+a->ndata, 1024);
195 ce94dbe6 2005-02-13 devnull if(n <= 0)
196 ce94dbe6 2005-02-13 devnull break;
197 ce94dbe6 2005-02-13 devnull a->ndata += n;
198 ce94dbe6 2005-02-13 devnull while(runmsg(a))
199 ce94dbe6 2005-02-13 devnull ;
200 ce94dbe6 2005-02-13 devnull }
201 ce94dbe6 2005-02-13 devnull close(a->fd);
202 ce94dbe6 2005-02-13 devnull free(a);
203 ce94dbe6 2005-02-13 devnull threadexits(nil);
204 ce94dbe6 2005-02-13 devnull }
205 ce94dbe6 2005-02-13 devnull
206 ce94dbe6 2005-02-13 devnull int
207 ce94dbe6 2005-02-13 devnull get1(Msg *m)
208 ce94dbe6 2005-02-13 devnull {
209 ce94dbe6 2005-02-13 devnull if(m->p >= m->ep)
210 ce94dbe6 2005-02-13 devnull return 0;
211 ce94dbe6 2005-02-13 devnull return *m->p++;
212 ce94dbe6 2005-02-13 devnull }
213 ce94dbe6 2005-02-13 devnull
214 ce94dbe6 2005-02-13 devnull int
215 ce94dbe6 2005-02-13 devnull get2(Msg *m)
216 ce94dbe6 2005-02-13 devnull {
217 ce94dbe6 2005-02-13 devnull uint x;
218 fa325e9b 2020-01-10 cross
219 ce94dbe6 2005-02-13 devnull if(m->p+2 > m->ep)
220 ce94dbe6 2005-02-13 devnull return 0;
221 ce94dbe6 2005-02-13 devnull x = (m->p[0]<<8)|m->p[1];
222 ce94dbe6 2005-02-13 devnull m->p += 2;
223 ce94dbe6 2005-02-13 devnull return x;
224 ce94dbe6 2005-02-13 devnull }
225 ce94dbe6 2005-02-13 devnull
226 ce94dbe6 2005-02-13 devnull int
227 ce94dbe6 2005-02-13 devnull get4(Msg *m)
228 ce94dbe6 2005-02-13 devnull {
229 ce94dbe6 2005-02-13 devnull uint x;
230 ce94dbe6 2005-02-13 devnull if(m->p+4 > m->ep)
231 ce94dbe6 2005-02-13 devnull return 0;
232 ce94dbe6 2005-02-13 devnull x = (m->p[0]<<24)|(m->p[1]<<16)|(m->p[2]<<8)|m->p[3];
233 ce94dbe6 2005-02-13 devnull m->p += 4;
234 ce94dbe6 2005-02-13 devnull return x;
235 ce94dbe6 2005-02-13 devnull }
236 ce94dbe6 2005-02-13 devnull
237 ce94dbe6 2005-02-13 devnull uchar*
238 ce94dbe6 2005-02-13 devnull getn(Msg *m, uint n)
239 ce94dbe6 2005-02-13 devnull {
240 ce94dbe6 2005-02-13 devnull uchar *p;
241 fa325e9b 2020-01-10 cross
242 ce94dbe6 2005-02-13 devnull if(m->p+n > m->ep)
243 ce94dbe6 2005-02-13 devnull return nil;
244 ce94dbe6 2005-02-13 devnull p = m->p;
245 ce94dbe6 2005-02-13 devnull m->p += n;
246 ce94dbe6 2005-02-13 devnull return p;
247 ce94dbe6 2005-02-13 devnull }
248 ce94dbe6 2005-02-13 devnull
249 ce94dbe6 2005-02-13 devnull char*
250 ce94dbe6 2005-02-13 devnull getstr(Msg *m)
251 ce94dbe6 2005-02-13 devnull {
252 ce94dbe6 2005-02-13 devnull uint n;
253 ce94dbe6 2005-02-13 devnull uchar *p;
254 ce94dbe6 2005-02-13 devnull
255 ce94dbe6 2005-02-13 devnull n = get4(m);
256 ce94dbe6 2005-02-13 devnull p = getn(m, n);
257 ce94dbe6 2005-02-13 devnull if(p == nil)
258 ce94dbe6 2005-02-13 devnull return nil;
259 ce94dbe6 2005-02-13 devnull p--;
260 ce94dbe6 2005-02-13 devnull memmove(p, p+1, n);
261 ce94dbe6 2005-02-13 devnull p[n] = 0;
262 1cab7105 2005-07-13 devnull return (char*)p;
263 ce94dbe6 2005-02-13 devnull }
264 ce94dbe6 2005-02-13 devnull
265 ce94dbe6 2005-02-13 devnull mpint*
266 ce94dbe6 2005-02-13 devnull getmp(Msg *m)
267 ce94dbe6 2005-02-13 devnull {
268 ce94dbe6 2005-02-13 devnull int n;
269 ce94dbe6 2005-02-13 devnull uchar *p;
270 fa325e9b 2020-01-10 cross
271 ce94dbe6 2005-02-13 devnull n = (get2(m)+7)/8;
272 ce94dbe6 2005-02-13 devnull if((p=getn(m, n)) == nil)
273 ce94dbe6 2005-02-13 devnull return nil;
274 ce94dbe6 2005-02-13 devnull return betomp(p, n, nil);
275 ce94dbe6 2005-02-13 devnull }
276 ce94dbe6 2005-02-13 devnull
277 ce94dbe6 2005-02-13 devnull mpint*
278 ce94dbe6 2005-02-13 devnull getmp2(Msg *m)
279 ce94dbe6 2005-02-13 devnull {
280 ce94dbe6 2005-02-13 devnull int n;
281 ce94dbe6 2005-02-13 devnull uchar *p;
282 fa325e9b 2020-01-10 cross
283 ce94dbe6 2005-02-13 devnull n = get4(m);
284 ce94dbe6 2005-02-13 devnull if((p = getn(m, n)) == nil)
285 ce94dbe6 2005-02-13 devnull return nil;
286 ce94dbe6 2005-02-13 devnull return betomp(p, n, nil);
287 acb880af 2006-03-21 devnull }
288 acb880af 2006-03-21 devnull
289 acb880af 2006-03-21 devnull void
290 acb880af 2006-03-21 devnull newmsg(Msg *m)
291 acb880af 2006-03-21 devnull {
292 acb880af 2006-03-21 devnull memset(m, 0, sizeof *m);
293 acb880af 2006-03-21 devnull }
294 acb880af 2006-03-21 devnull
295 acb880af 2006-03-21 devnull void
296 acb880af 2006-03-21 devnull mreset(Msg *m)
297 acb880af 2006-03-21 devnull {
298 acb880af 2006-03-21 devnull if(m->bpalloc){
299 acb880af 2006-03-21 devnull memset(m->bp, 0, m->ep-m->bp);
300 acb880af 2006-03-21 devnull free(m->bp);
301 acb880af 2006-03-21 devnull }
302 acb880af 2006-03-21 devnull memset(m, 0, sizeof *m);
303 ce94dbe6 2005-02-13 devnull }
304 ce94dbe6 2005-02-13 devnull
305 ce94dbe6 2005-02-13 devnull Msg*
306 ce94dbe6 2005-02-13 devnull getm(Msg *m, Msg *mm)
307 ce94dbe6 2005-02-13 devnull {
308 ce94dbe6 2005-02-13 devnull uint n;
309 ce94dbe6 2005-02-13 devnull uchar *p;
310 fa325e9b 2020-01-10 cross
311 ce94dbe6 2005-02-13 devnull n = get4(m);
312 ce94dbe6 2005-02-13 devnull if((p = getn(m, n)) == nil)
313 ce94dbe6 2005-02-13 devnull return nil;
314 ce94dbe6 2005-02-13 devnull mm->bp = p;
315 ce94dbe6 2005-02-13 devnull mm->p = p;
316 ce94dbe6 2005-02-13 devnull mm->ep = p+n;
317 acb880af 2006-03-21 devnull mm->bpalloc = 0;
318 ce94dbe6 2005-02-13 devnull return mm;
319 ce94dbe6 2005-02-13 devnull }
320 ce94dbe6 2005-02-13 devnull
321 ce94dbe6 2005-02-13 devnull uchar*
322 ce94dbe6 2005-02-13 devnull ensure(Msg *m, int n)
323 ce94dbe6 2005-02-13 devnull {
324 acb880af 2006-03-21 devnull int len;
325 ce94dbe6 2005-02-13 devnull uchar *p;
326 acb880af 2006-03-21 devnull uchar *obp;
327 acb880af 2006-03-21 devnull
328 acb880af 2006-03-21 devnull if(m->bp == nil)
329 acb880af 2006-03-21 devnull m->bpalloc = 1;
330 acb880af 2006-03-21 devnull if(!m->bpalloc){
331 acb880af 2006-03-21 devnull p = emalloc(m->ep - m->bp);
332 acb880af 2006-03-21 devnull memmove(p, m->bp, m->ep - m->bp);
333 acb880af 2006-03-21 devnull obp = m->bp;
334 acb880af 2006-03-21 devnull m->bp = p;
335 acb880af 2006-03-21 devnull m->ep += m->bp - obp;
336 acb880af 2006-03-21 devnull m->p += m->bp - obp;
337 acb880af 2006-03-21 devnull m->bpalloc = 1;
338 acb880af 2006-03-21 devnull }
339 ce94dbe6 2005-02-13 devnull len = m->ep - m->bp;
340 ce94dbe6 2005-02-13 devnull if(m->p+n > m->ep){
341 acb880af 2006-03-21 devnull obp = m->bp;
342 ce94dbe6 2005-02-13 devnull m->bp = erealloc(m->bp, len+n+1024);
343 acb880af 2006-03-21 devnull m->p += m->bp - obp;
344 acb880af 2006-03-21 devnull m->ep += m->bp - obp;
345 acb880af 2006-03-21 devnull m->ep += n+1024;
346 ce94dbe6 2005-02-13 devnull }
347 ce94dbe6 2005-02-13 devnull p = m->p;
348 ce94dbe6 2005-02-13 devnull m->p += n;
349 ce94dbe6 2005-02-13 devnull return p;
350 ce94dbe6 2005-02-13 devnull }
351 ce94dbe6 2005-02-13 devnull
352 ce94dbe6 2005-02-13 devnull void
353 ce94dbe6 2005-02-13 devnull put4(Msg *m, uint n)
354 ce94dbe6 2005-02-13 devnull {
355 ce94dbe6 2005-02-13 devnull uchar *p;
356 fa325e9b 2020-01-10 cross
357 ce94dbe6 2005-02-13 devnull p = ensure(m, 4);
358 ce94dbe6 2005-02-13 devnull p[0] = (n>>24)&0xFF;
359 ce94dbe6 2005-02-13 devnull p[1] = (n>>16)&0xFF;
360 ce94dbe6 2005-02-13 devnull p[2] = (n>>8)&0xFF;
361 ce94dbe6 2005-02-13 devnull p[3] = n&0xFF;
362 ce94dbe6 2005-02-13 devnull }
363 ce94dbe6 2005-02-13 devnull
364 ce94dbe6 2005-02-13 devnull void
365 ce94dbe6 2005-02-13 devnull put2(Msg *m, uint n)
366 ce94dbe6 2005-02-13 devnull {
367 ce94dbe6 2005-02-13 devnull uchar *p;
368 fa325e9b 2020-01-10 cross
369 ce94dbe6 2005-02-13 devnull p = ensure(m, 2);
370 ce94dbe6 2005-02-13 devnull p[0] = (n>>8)&0xFF;
371 ce94dbe6 2005-02-13 devnull p[1] = n&0xFF;
372 ce94dbe6 2005-02-13 devnull }
373 ce94dbe6 2005-02-13 devnull
374 ce94dbe6 2005-02-13 devnull void
375 ce94dbe6 2005-02-13 devnull put1(Msg *m, uint n)
376 ce94dbe6 2005-02-13 devnull {
377 ce94dbe6 2005-02-13 devnull uchar *p;
378 fa325e9b 2020-01-10 cross
379 ce94dbe6 2005-02-13 devnull p = ensure(m, 1);
380 ce94dbe6 2005-02-13 devnull p[0] = n&0xFF;
381 ce94dbe6 2005-02-13 devnull }
382 ce94dbe6 2005-02-13 devnull
383 ce94dbe6 2005-02-13 devnull void
384 ce94dbe6 2005-02-13 devnull putn(Msg *m, void *a, uint n)
385 ce94dbe6 2005-02-13 devnull {
386 ce94dbe6 2005-02-13 devnull uchar *p;
387 fa325e9b 2020-01-10 cross
388 ce94dbe6 2005-02-13 devnull p = ensure(m, n);
389 ce94dbe6 2005-02-13 devnull memmove(p, a, n);
390 ce94dbe6 2005-02-13 devnull }
391 ce94dbe6 2005-02-13 devnull
392 ce94dbe6 2005-02-13 devnull void
393 ce94dbe6 2005-02-13 devnull putmp(Msg *m, mpint *b)
394 ce94dbe6 2005-02-13 devnull {
395 ce94dbe6 2005-02-13 devnull int bits, n;
396 ce94dbe6 2005-02-13 devnull uchar *p;
397 fa325e9b 2020-01-10 cross
398 ce94dbe6 2005-02-13 devnull bits = mpsignif(b);
399 ce94dbe6 2005-02-13 devnull put2(m, bits);
400 ce94dbe6 2005-02-13 devnull n = (bits+7)/8;
401 ce94dbe6 2005-02-13 devnull p = ensure(m, n);
402 ce94dbe6 2005-02-13 devnull mptobe(b, p, n, nil);
403 ce94dbe6 2005-02-13 devnull }
404 ce94dbe6 2005-02-13 devnull
405 ce94dbe6 2005-02-13 devnull void
406 ce94dbe6 2005-02-13 devnull putmp2(Msg *m, mpint *b)
407 ce94dbe6 2005-02-13 devnull {
408 ce94dbe6 2005-02-13 devnull int bits, n;
409 ce94dbe6 2005-02-13 devnull uchar *p;
410 fa325e9b 2020-01-10 cross
411 ce94dbe6 2005-02-13 devnull if(mpcmp(b, mpzero) == 0){
412 ce94dbe6 2005-02-13 devnull put4(m, 0);
413 ce94dbe6 2005-02-13 devnull return;
414 ce94dbe6 2005-02-13 devnull }
415 ce94dbe6 2005-02-13 devnull bits = mpsignif(b);
416 ce94dbe6 2005-02-13 devnull n = (bits+7)/8;
417 ce94dbe6 2005-02-13 devnull if(bits%8 == 0){
418 ce94dbe6 2005-02-13 devnull put4(m, n+1);
419 ce94dbe6 2005-02-13 devnull put1(m, 0);
420 ce94dbe6 2005-02-13 devnull }else
421 ce94dbe6 2005-02-13 devnull put4(m, n);
422 ce94dbe6 2005-02-13 devnull p = ensure(m, n);
423 ce94dbe6 2005-02-13 devnull mptobe(b, p, n, nil);
424 ce94dbe6 2005-02-13 devnull }
425 ce94dbe6 2005-02-13 devnull
426 ce94dbe6 2005-02-13 devnull void
427 ce94dbe6 2005-02-13 devnull putstr(Msg *m, char *s)
428 ce94dbe6 2005-02-13 devnull {
429 ce94dbe6 2005-02-13 devnull int n;
430 fa325e9b 2020-01-10 cross
431 ce94dbe6 2005-02-13 devnull n = strlen(s);
432 ce94dbe6 2005-02-13 devnull put4(m, n);
433 ce94dbe6 2005-02-13 devnull putn(m, s, n);
434 ce94dbe6 2005-02-13 devnull }
435 ce94dbe6 2005-02-13 devnull
436 ce94dbe6 2005-02-13 devnull void
437 ce94dbe6 2005-02-13 devnull putm(Msg *m, Msg *mm)
438 ce94dbe6 2005-02-13 devnull {
439 ce94dbe6 2005-02-13 devnull uint n;
440 fa325e9b 2020-01-10 cross
441 ce94dbe6 2005-02-13 devnull n = mm->p - mm->bp;
442 ce94dbe6 2005-02-13 devnull put4(m, n);
443 ce94dbe6 2005-02-13 devnull putn(m, mm->bp, n);
444 ce94dbe6 2005-02-13 devnull }
445 ce94dbe6 2005-02-13 devnull
446 ce94dbe6 2005-02-13 devnull void
447 ce94dbe6 2005-02-13 devnull newreply(Msg *m, int type)
448 ce94dbe6 2005-02-13 devnull {
449 ce94dbe6 2005-02-13 devnull memset(m, 0, sizeof *m);
450 ce94dbe6 2005-02-13 devnull put4(m, 0);
451 ce94dbe6 2005-02-13 devnull put1(m, type);
452 ce94dbe6 2005-02-13 devnull }
453 ce94dbe6 2005-02-13 devnull
454 ce94dbe6 2005-02-13 devnull void
455 ce94dbe6 2005-02-13 devnull reply(Aconn *a, Msg *m)
456 ce94dbe6 2005-02-13 devnull {
457 ce94dbe6 2005-02-13 devnull uint n;
458 ce94dbe6 2005-02-13 devnull uchar *p;
459 fa325e9b 2020-01-10 cross
460 ce94dbe6 2005-02-13 devnull n = (m->p - m->bp) - 4;
461 ce94dbe6 2005-02-13 devnull p = m->bp;
462 ce94dbe6 2005-02-13 devnull p[0] = (n>>24)&0xFF;
463 ce94dbe6 2005-02-13 devnull p[1] = (n>>16)&0xFF;
464 ce94dbe6 2005-02-13 devnull p[2] = (n>>8)&0xFF;
465 ce94dbe6 2005-02-13 devnull p[3] = n&0xFF;
466 ce94dbe6 2005-02-13 devnull if(chatty)
467 acb880af 2006-03-21 devnull fprint(2, "respond %d t=%d: %.*H\n", n, p[4], n, m->bp+4);
468 ce94dbe6 2005-02-13 devnull write(a->fd, p, n+4);
469 acb880af 2006-03-21 devnull mreset(m);
470 ce94dbe6 2005-02-13 devnull }
471 ce94dbe6 2005-02-13 devnull
472 ce94dbe6 2005-02-13 devnull typedef struct Key Key;
473 ce94dbe6 2005-02-13 devnull struct Key
474 ce94dbe6 2005-02-13 devnull {
475 ce94dbe6 2005-02-13 devnull mpint *mod;
476 ce94dbe6 2005-02-13 devnull mpint *ek;
477 ce94dbe6 2005-02-13 devnull char *comment;
478 ce94dbe6 2005-02-13 devnull };
479 ce94dbe6 2005-02-13 devnull
480 ce94dbe6 2005-02-13 devnull static char*
481 ce94dbe6 2005-02-13 devnull find(char **f, int nf, char *k)
482 ce94dbe6 2005-02-13 devnull {
483 ce94dbe6 2005-02-13 devnull int i, len;
484 ce94dbe6 2005-02-13 devnull
485 ce94dbe6 2005-02-13 devnull len = strlen(k);
486 ce94dbe6 2005-02-13 devnull for(i=1; i<nf; i++) /* i=1: f[0] is "key" */
487 ce94dbe6 2005-02-13 devnull if(strncmp(f[i], k, len) == 0 && f[i][len] == '=')
488 ce94dbe6 2005-02-13 devnull return f[i]+len+1;
489 ce94dbe6 2005-02-13 devnull return nil;
490 ce94dbe6 2005-02-13 devnull }
491 ce94dbe6 2005-02-13 devnull
492 ce94dbe6 2005-02-13 devnull static int
493 ce94dbe6 2005-02-13 devnull putrsa1(Msg *m, char **f, int nf)
494 ce94dbe6 2005-02-13 devnull {
495 ce94dbe6 2005-02-13 devnull char *p;
496 ce94dbe6 2005-02-13 devnull mpint *mod, *ek;
497 ce94dbe6 2005-02-13 devnull
498 ce94dbe6 2005-02-13 devnull p = find(f, nf, "n");
499 ce94dbe6 2005-02-13 devnull if(p == nil || (mod = strtomp(p, nil, 16, nil)) == nil)
500 ce94dbe6 2005-02-13 devnull return -1;
501 ce94dbe6 2005-02-13 devnull p = find(f, nf, "ek");
502 ce94dbe6 2005-02-13 devnull if(p == nil || (ek = strtomp(p, nil, 16, nil)) == nil){
503 ce94dbe6 2005-02-13 devnull mpfree(mod);
504 ce94dbe6 2005-02-13 devnull return -1;
505 ce94dbe6 2005-02-13 devnull }
506 ce94dbe6 2005-02-13 devnull p = find(f, nf, "comment");
507 ce94dbe6 2005-02-13 devnull if(p == nil)
508 ce94dbe6 2005-02-13 devnull p = "";
509 ce94dbe6 2005-02-13 devnull put4(m, mpsignif(mod));
510 ce94dbe6 2005-02-13 devnull putmp(m, ek);
511 ce94dbe6 2005-02-13 devnull putmp(m, mod);
512 ce94dbe6 2005-02-13 devnull putstr(m, p);
513 ce94dbe6 2005-02-13 devnull mpfree(mod);
514 ce94dbe6 2005-02-13 devnull mpfree(ek);
515 ce94dbe6 2005-02-13 devnull return 0;
516 ce94dbe6 2005-02-13 devnull }
517 ce94dbe6 2005-02-13 devnull
518 ce94dbe6 2005-02-13 devnull void
519 ce94dbe6 2005-02-13 devnull printattr(char **f, int nf)
520 ce94dbe6 2005-02-13 devnull {
521 ce94dbe6 2005-02-13 devnull int i;
522 fa325e9b 2020-01-10 cross
523 ce94dbe6 2005-02-13 devnull print("#");
524 ce94dbe6 2005-02-13 devnull for(i=0; i<nf; i++)
525 ce94dbe6 2005-02-13 devnull print(" %s", f[i]);
526 ce94dbe6 2005-02-13 devnull print("\n");
527 ce94dbe6 2005-02-13 devnull }
528 ce94dbe6 2005-02-13 devnull
529 ce94dbe6 2005-02-13 devnull void
530 ce94dbe6 2005-02-13 devnull printrsa1(char **f, int nf)
531 ce94dbe6 2005-02-13 devnull {
532 ce94dbe6 2005-02-13 devnull char *p;
533 ce94dbe6 2005-02-13 devnull mpint *mod, *ek;
534 ce94dbe6 2005-02-13 devnull
535 ce94dbe6 2005-02-13 devnull p = find(f, nf, "n");
536 ce94dbe6 2005-02-13 devnull if(p == nil || (mod = strtomp(p, nil, 16, nil)) == nil)
537 ce94dbe6 2005-02-13 devnull return;
538 ce94dbe6 2005-02-13 devnull p = find(f, nf, "ek");
539 ce94dbe6 2005-02-13 devnull if(p == nil || (ek = strtomp(p, nil, 16, nil)) == nil){
540 ce94dbe6 2005-02-13 devnull mpfree(mod);
541 ce94dbe6 2005-02-13 devnull return;
542 ce94dbe6 2005-02-13 devnull }
543 ce94dbe6 2005-02-13 devnull p = find(f, nf, "comment");
544 ce94dbe6 2005-02-13 devnull if(p == nil)
545 ce94dbe6 2005-02-13 devnull p = "";
546 ce94dbe6 2005-02-13 devnull
547 ce94dbe6 2005-02-13 devnull if(chatty)
548 ce94dbe6 2005-02-13 devnull printattr(f, nf);
549 ce94dbe6 2005-02-13 devnull print("%d %.10B %.10B %s\n", mpsignif(mod), ek, mod, p);
550 ce94dbe6 2005-02-13 devnull mpfree(ek);
551 ce94dbe6 2005-02-13 devnull mpfree(mod);
552 ce94dbe6 2005-02-13 devnull }
553 ce94dbe6 2005-02-13 devnull
554 ce94dbe6 2005-02-13 devnull static int
555 ce94dbe6 2005-02-13 devnull putrsa(Msg *m, char **f, int nf)
556 ce94dbe6 2005-02-13 devnull {
557 ce94dbe6 2005-02-13 devnull char *p;
558 ce94dbe6 2005-02-13 devnull mpint *mod, *ek;
559 ce94dbe6 2005-02-13 devnull
560 ce94dbe6 2005-02-13 devnull p = find(f, nf, "n");
561 ce94dbe6 2005-02-13 devnull if(p == nil || (mod = strtomp(p, nil, 16, nil)) == nil)
562 ce94dbe6 2005-02-13 devnull return -1;
563 ce94dbe6 2005-02-13 devnull p = find(f, nf, "ek");
564 ce94dbe6 2005-02-13 devnull if(p == nil || (ek = strtomp(p, nil, 16, nil)) == nil){
565 ce94dbe6 2005-02-13 devnull mpfree(mod);
566 ce94dbe6 2005-02-13 devnull return -1;
567 ce94dbe6 2005-02-13 devnull }
568 ce94dbe6 2005-02-13 devnull putstr(m, "ssh-rsa");
569 ce94dbe6 2005-02-13 devnull putmp2(m, ek);
570 ce94dbe6 2005-02-13 devnull putmp2(m, mod);
571 ce94dbe6 2005-02-13 devnull mpfree(ek);
572 ce94dbe6 2005-02-13 devnull mpfree(mod);
573 ce94dbe6 2005-02-13 devnull return 0;
574 ce94dbe6 2005-02-13 devnull }
575 ce94dbe6 2005-02-13 devnull
576 ce94dbe6 2005-02-13 devnull RSApub*
577 ce94dbe6 2005-02-13 devnull getrsapub(Msg *m)
578 ce94dbe6 2005-02-13 devnull {
579 ce94dbe6 2005-02-13 devnull RSApub *k;
580 fa325e9b 2020-01-10 cross
581 ce94dbe6 2005-02-13 devnull k = rsapuballoc();
582 ce94dbe6 2005-02-13 devnull if(k == nil)
583 ce94dbe6 2005-02-13 devnull return nil;
584 ce94dbe6 2005-02-13 devnull k->ek = getmp2(m);
585 ce94dbe6 2005-02-13 devnull k->n = getmp2(m);
586 ce94dbe6 2005-02-13 devnull if(k->ek == nil || k->n == nil){
587 ce94dbe6 2005-02-13 devnull rsapubfree(k);
588 ce94dbe6 2005-02-13 devnull return nil;
589 ce94dbe6 2005-02-13 devnull }
590 ce94dbe6 2005-02-13 devnull return k;
591 ce94dbe6 2005-02-13 devnull }
592 ce94dbe6 2005-02-13 devnull
593 ce94dbe6 2005-02-13 devnull static int
594 ce94dbe6 2005-02-13 devnull putdsa(Msg *m, char **f, int nf)
595 ce94dbe6 2005-02-13 devnull {
596 ce94dbe6 2005-02-13 devnull char *p;
597 ce94dbe6 2005-02-13 devnull int ret;
598 ce94dbe6 2005-02-13 devnull mpint *dp, *dq, *dalpha, *dkey;
599 ce94dbe6 2005-02-13 devnull
600 ce94dbe6 2005-02-13 devnull ret = -1;
601 ce94dbe6 2005-02-13 devnull dp = dq = dalpha = dkey = nil;
602 ce94dbe6 2005-02-13 devnull p = find(f, nf, "p");
603 ce94dbe6 2005-02-13 devnull if(p == nil || (dp = strtomp(p, nil, 16, nil)) == nil)
604 ce94dbe6 2005-02-13 devnull goto out;
605 ce94dbe6 2005-02-13 devnull p = find(f, nf, "q");
606 ce94dbe6 2005-02-13 devnull if(p == nil || (dq = strtomp(p, nil, 16, nil)) == nil)
607 ce94dbe6 2005-02-13 devnull goto out;
608 ce94dbe6 2005-02-13 devnull p = find(f, nf, "alpha");
609 ce94dbe6 2005-02-13 devnull if(p == nil || (dalpha = strtomp(p, nil, 16, nil)) == nil)
610 ce94dbe6 2005-02-13 devnull goto out;
611 ce94dbe6 2005-02-13 devnull p = find(f, nf, "key");
612 ce94dbe6 2005-02-13 devnull if(p == nil || (dkey = strtomp(p, nil, 16, nil)) == nil)
613 ce94dbe6 2005-02-13 devnull goto out;
614 ce94dbe6 2005-02-13 devnull putstr(m, "ssh-dss");
615 ce94dbe6 2005-02-13 devnull putmp2(m, dp);
616 ce94dbe6 2005-02-13 devnull putmp2(m, dq);
617 ce94dbe6 2005-02-13 devnull putmp2(m, dalpha);
618 ce94dbe6 2005-02-13 devnull putmp2(m, dkey);
619 ce94dbe6 2005-02-13 devnull ret = 0;
620 ce94dbe6 2005-02-13 devnull out:
621 ce94dbe6 2005-02-13 devnull mpfree(dp);
622 ce94dbe6 2005-02-13 devnull mpfree(dq);
623 ce94dbe6 2005-02-13 devnull mpfree(dalpha);
624 ce94dbe6 2005-02-13 devnull mpfree(dkey);
625 ce94dbe6 2005-02-13 devnull return ret;
626 ce94dbe6 2005-02-13 devnull }
627 ce94dbe6 2005-02-13 devnull
628 ce94dbe6 2005-02-13 devnull static int
629 ce94dbe6 2005-02-13 devnull putkey2(Msg *m, int (*put)(Msg*,char**,int), char **f, int nf)
630 ce94dbe6 2005-02-13 devnull {
631 ce94dbe6 2005-02-13 devnull char *p;
632 ce94dbe6 2005-02-13 devnull Msg mm;
633 fa325e9b 2020-01-10 cross
634 ce94dbe6 2005-02-13 devnull newmsg(&mm);
635 ce94dbe6 2005-02-13 devnull if(put(&mm, f, nf) < 0)
636 ce94dbe6 2005-02-13 devnull return -1;
637 ce94dbe6 2005-02-13 devnull putm(m, &mm);
638 acb880af 2006-03-21 devnull mreset(&mm);
639 ce94dbe6 2005-02-13 devnull p = find(f, nf, "comment");
640 ce94dbe6 2005-02-13 devnull if(p == nil)
641 ce94dbe6 2005-02-13 devnull p = "";
642 ce94dbe6 2005-02-13 devnull putstr(m, p);
643 ce94dbe6 2005-02-13 devnull return 0;
644 ce94dbe6 2005-02-13 devnull }
645 ce94dbe6 2005-02-13 devnull
646 ce94dbe6 2005-02-13 devnull static int
647 ce94dbe6 2005-02-13 devnull printkey(char *type, int (*put)(Msg*,char**,int), char **f, int nf)
648 ce94dbe6 2005-02-13 devnull {
649 ce94dbe6 2005-02-13 devnull Msg m;
650 ce94dbe6 2005-02-13 devnull char *p;
651 fa325e9b 2020-01-10 cross
652 ce94dbe6 2005-02-13 devnull newmsg(&m);
653 ce94dbe6 2005-02-13 devnull if(put(&m, f, nf) < 0)
654 ce94dbe6 2005-02-13 devnull return -1;
655 ce94dbe6 2005-02-13 devnull p = find(f, nf, "comment");
656 ce94dbe6 2005-02-13 devnull if(p == nil)
657 ce94dbe6 2005-02-13 devnull p = "";
658 ce94dbe6 2005-02-13 devnull if(chatty)
659 ce94dbe6 2005-02-13 devnull printattr(f, nf);
660 ce94dbe6 2005-02-13 devnull print("%s %.*[ %s\n", type, m.p-m.bp, m.bp, p);
661 acb880af 2006-03-21 devnull mreset(&m);
662 ce94dbe6 2005-02-13 devnull return 0;
663 ce94dbe6 2005-02-13 devnull }
664 ce94dbe6 2005-02-13 devnull
665 ce94dbe6 2005-02-13 devnull DSApub*
666 ce94dbe6 2005-02-13 devnull getdsapub(Msg *m)
667 ce94dbe6 2005-02-13 devnull {
668 ce94dbe6 2005-02-13 devnull DSApub *k;
669 fa325e9b 2020-01-10 cross
670 ce94dbe6 2005-02-13 devnull k = dsapuballoc();
671 ce94dbe6 2005-02-13 devnull if(k == nil)
672 ce94dbe6 2005-02-13 devnull return nil;
673 ce94dbe6 2005-02-13 devnull k->p = getmp2(m);
674 ce94dbe6 2005-02-13 devnull k->q = getmp2(m);
675 ce94dbe6 2005-02-13 devnull k->alpha = getmp2(m);
676 ce94dbe6 2005-02-13 devnull k->key = getmp2(m);
677 ce94dbe6 2005-02-13 devnull if(!k->p || !k->q || !k->alpha || !k->key){
678 ce94dbe6 2005-02-13 devnull dsapubfree(k);
679 ce94dbe6 2005-02-13 devnull return nil;
680 ce94dbe6 2005-02-13 devnull }
681 ce94dbe6 2005-02-13 devnull return k;
682 ce94dbe6 2005-02-13 devnull }
683 ce94dbe6 2005-02-13 devnull
684 ce94dbe6 2005-02-13 devnull static int
685 ce94dbe6 2005-02-13 devnull listkeys(Msg *m, int version)
686 ce94dbe6 2005-02-13 devnull {
687 ce94dbe6 2005-02-13 devnull char buf[8192+1], *line[100], *f[20], *p, *s;
688 acb880af 2006-03-21 devnull int pnk;
689 ce94dbe6 2005-02-13 devnull int i, n, nl, nf, nk;
690 ce94dbe6 2005-02-13 devnull CFid *fid;
691 ce94dbe6 2005-02-13 devnull
692 ce94dbe6 2005-02-13 devnull nk = 0;
693 acb880af 2006-03-21 devnull pnk = m->p - m->bp;
694 ce94dbe6 2005-02-13 devnull put4(m, 0);
695 e1a22963 2005-02-13 devnull if((fid = nsopen(factotum, nil, "ctl", OREAD)) == nil){
696 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: open factotum: %r\n");
697 ce94dbe6 2005-02-13 devnull return -1;
698 ce94dbe6 2005-02-13 devnull }
699 ce94dbe6 2005-02-13 devnull for(;;){
700 ce94dbe6 2005-02-13 devnull if((n = fsread(fid, buf, sizeof buf-1)) <= 0)
701 ce94dbe6 2005-02-13 devnull break;
702 ce94dbe6 2005-02-13 devnull buf[n] = 0;
703 ce94dbe6 2005-02-13 devnull nl = getfields(buf, line, nelem(line), 1, "\n");
704 ce94dbe6 2005-02-13 devnull for(i=0; i<nl; i++){
705 ce94dbe6 2005-02-13 devnull nf = tokenize(line[i], f, nelem(f));
706 ce94dbe6 2005-02-13 devnull if(nf == 0 || strcmp(f[0], "key") != 0)
707 ce94dbe6 2005-02-13 devnull continue;
708 ce94dbe6 2005-02-13 devnull p = find(f, nf, "proto");
709 ce94dbe6 2005-02-13 devnull if(p == nil)
710 ce94dbe6 2005-02-13 devnull continue;
711 ce94dbe6 2005-02-13 devnull s = find(f, nf, "service");
712 ce94dbe6 2005-02-13 devnull if(s == nil)
713 ce94dbe6 2005-02-13 devnull continue;
714 ce94dbe6 2005-02-13 devnull
715 ce94dbe6 2005-02-13 devnull if(version == 1 && strcmp(p, "rsa") == 0 && strcmp(s, "ssh") == 0)
716 ce94dbe6 2005-02-13 devnull if(putrsa1(m, f, nf) >= 0)
717 ce94dbe6 2005-02-13 devnull nk++;
718 ce94dbe6 2005-02-13 devnull if(version == 2 && strcmp(p, "rsa") == 0 && strcmp(s, "ssh-rsa") == 0)
719 ce94dbe6 2005-02-13 devnull if(putkey2(m, putrsa, f, nf) >= 0)
720 ce94dbe6 2005-02-13 devnull nk++;
721 ce94dbe6 2005-02-13 devnull if(version == 2 && strcmp(p, "dsa") == 0 && strcmp(s, "ssh-dss") == 0)
722 ce94dbe6 2005-02-13 devnull if(putkey2(m, putdsa, f, nf) >= 0)
723 ce94dbe6 2005-02-13 devnull nk++;
724 ce94dbe6 2005-02-13 devnull }
725 ce94dbe6 2005-02-13 devnull }
726 acb880af 2006-03-21 devnull if(chatty)
727 acb880af 2006-03-21 devnull fprint(2, "sending %d keys\n", nk);
728 ce94dbe6 2005-02-13 devnull fsclose(fid);
729 acb880af 2006-03-21 devnull m->bp[pnk+0] = (nk>>24)&0xFF;
730 acb880af 2006-03-21 devnull m->bp[pnk+1] = (nk>>16)&0xFF;
731 acb880af 2006-03-21 devnull m->bp[pnk+2] = (nk>>8)&0xFF;
732 acb880af 2006-03-21 devnull m->bp[pnk+3] = nk&0xFF;
733 ce94dbe6 2005-02-13 devnull return nk;
734 ce94dbe6 2005-02-13 devnull }
735 ce94dbe6 2005-02-13 devnull
736 ce94dbe6 2005-02-13 devnull void
737 ce94dbe6 2005-02-13 devnull listkeystext(void)
738 ce94dbe6 2005-02-13 devnull {
739 acb880af 2006-03-21 devnull char buf[8192+1], *line[100], *f[20], *p, *s;
740 ce94dbe6 2005-02-13 devnull int i, n, nl, nf;
741 ce94dbe6 2005-02-13 devnull CFid *fid;
742 ce94dbe6 2005-02-13 devnull
743 ce94dbe6 2005-02-13 devnull if((fid = nsopen(factotum, nil, "ctl", OREAD)) == nil){
744 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: open factotum: %r\n");
745 ce94dbe6 2005-02-13 devnull return;
746 ce94dbe6 2005-02-13 devnull }
747 ce94dbe6 2005-02-13 devnull for(;;){
748 ce94dbe6 2005-02-13 devnull if((n = fsread(fid, buf, sizeof buf-1)) <= 0)
749 ce94dbe6 2005-02-13 devnull break;
750 ce94dbe6 2005-02-13 devnull buf[n] = 0;
751 ce94dbe6 2005-02-13 devnull nl = getfields(buf, line, nelem(line), 1, "\n");
752 ce94dbe6 2005-02-13 devnull for(i=0; i<nl; i++){
753 ce94dbe6 2005-02-13 devnull nf = tokenize(line[i], f, nelem(f));
754 ce94dbe6 2005-02-13 devnull if(nf == 0 || strcmp(f[0], "key") != 0)
755 ce94dbe6 2005-02-13 devnull continue;
756 ce94dbe6 2005-02-13 devnull p = find(f, nf, "proto");
757 ce94dbe6 2005-02-13 devnull if(p == nil)
758 ce94dbe6 2005-02-13 devnull continue;
759 ce94dbe6 2005-02-13 devnull s = find(f, nf, "service");
760 ce94dbe6 2005-02-13 devnull if(s == nil)
761 ce94dbe6 2005-02-13 devnull continue;
762 ce94dbe6 2005-02-13 devnull
763 ce94dbe6 2005-02-13 devnull if(strcmp(p, "rsa") == 0 && strcmp(s, "ssh") == 0)
764 ce94dbe6 2005-02-13 devnull printrsa1(f, nf);
765 ce94dbe6 2005-02-13 devnull if(strcmp(p, "rsa") == 0 && strcmp(s, "ssh-rsa") == 0)
766 ce94dbe6 2005-02-13 devnull printkey("ssh-rsa", putrsa, f, nf);
767 ce94dbe6 2005-02-13 devnull if(strcmp(p, "dsa") == 0 && strcmp(s, "ssh-dss") == 0)
768 ce94dbe6 2005-02-13 devnull printkey("ssh-dss", putdsa, f, nf);
769 ce94dbe6 2005-02-13 devnull }
770 ce94dbe6 2005-02-13 devnull }
771 ce94dbe6 2005-02-13 devnull fsclose(fid);
772 ce94dbe6 2005-02-13 devnull threadexitsall(nil);
773 ce94dbe6 2005-02-13 devnull }
774 ce94dbe6 2005-02-13 devnull
775 ce94dbe6 2005-02-13 devnull mpint*
776 ce94dbe6 2005-02-13 devnull rsaunpad(mpint *b)
777 ce94dbe6 2005-02-13 devnull {
778 ce94dbe6 2005-02-13 devnull int i, n;
779 ce94dbe6 2005-02-13 devnull uchar buf[2560];
780 ce94dbe6 2005-02-13 devnull
781 ce94dbe6 2005-02-13 devnull n = (mpsignif(b)+7)/8;
782 ce94dbe6 2005-02-13 devnull if(n > sizeof buf){
783 ce94dbe6 2005-02-13 devnull werrstr("rsaunpad: too big");
784 ce94dbe6 2005-02-13 devnull return nil;
785 ce94dbe6 2005-02-13 devnull }
786 ce94dbe6 2005-02-13 devnull mptobe(b, buf, n, nil);
787 ce94dbe6 2005-02-13 devnull
788 ce94dbe6 2005-02-13 devnull /* the initial zero has been eaten by the betomp -> mptobe sequence */
789 ce94dbe6 2005-02-13 devnull if(buf[0] != 2){
790 ce94dbe6 2005-02-13 devnull werrstr("rsaunpad: expected leading 2");
791 ce94dbe6 2005-02-13 devnull return nil;
792 ce94dbe6 2005-02-13 devnull }
793 ce94dbe6 2005-02-13 devnull for(i=1; i<n; i++)
794 ce94dbe6 2005-02-13 devnull if(buf[i]==0)
795 ce94dbe6 2005-02-13 devnull break;
796 ce94dbe6 2005-02-13 devnull return betomp(buf+i, n-i, nil);
797 ce94dbe6 2005-02-13 devnull }
798 ce94dbe6 2005-02-13 devnull
799 ce94dbe6 2005-02-13 devnull void
800 ce94dbe6 2005-02-13 devnull mptoberjust(mpint *b, uchar *buf, int len)
801 ce94dbe6 2005-02-13 devnull {
802 ce94dbe6 2005-02-13 devnull int n;
803 ce94dbe6 2005-02-13 devnull
804 ce94dbe6 2005-02-13 devnull n = mptobe(b, buf, len, nil);
805 ce94dbe6 2005-02-13 devnull assert(n >= 0);
806 ce94dbe6 2005-02-13 devnull if(n < len){
807 ce94dbe6 2005-02-13 devnull len -= n;
808 ce94dbe6 2005-02-13 devnull memmove(buf+len, buf, n);
809 ce94dbe6 2005-02-13 devnull memset(buf, 0, len);
810 ce94dbe6 2005-02-13 devnull }
811 ce94dbe6 2005-02-13 devnull }
812 ce94dbe6 2005-02-13 devnull
813 ce94dbe6 2005-02-13 devnull static int
814 ce94dbe6 2005-02-13 devnull dorsa(Aconn *a, mpint *mod, mpint *exp, mpint *chal, uchar chalbuf[32])
815 ce94dbe6 2005-02-13 devnull {
816 ce94dbe6 2005-02-13 devnull AuthRpc *rpc;
817 ce94dbe6 2005-02-13 devnull char buf[4096], *p;
818 ce94dbe6 2005-02-13 devnull mpint *decr, *unpad;
819 ce94dbe6 2005-02-13 devnull
820 ce94dbe6 2005-02-13 devnull USED(exp);
821 ce94dbe6 2005-02-13 devnull if((rpc = auth_allocrpc()) == nil){
822 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: auth_allocrpc: %r\n");
823 ce94dbe6 2005-02-13 devnull return -1;
824 ce94dbe6 2005-02-13 devnull }
825 e1a22963 2005-02-13 devnull snprint(buf, sizeof buf, "proto=rsa service=ssh role=decrypt n=%lB ek=%lB", mod, exp);
826 ce94dbe6 2005-02-13 devnull if(chatty)
827 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: start %s\n", buf);
828 ce94dbe6 2005-02-13 devnull if(auth_rpc(rpc, "start", buf, strlen(buf)) != ARok){
829 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: auth 'start' failed: %r\n");
830 ce94dbe6 2005-02-13 devnull Die:
831 ce94dbe6 2005-02-13 devnull auth_freerpc(rpc);
832 ce94dbe6 2005-02-13 devnull return -1;
833 ce94dbe6 2005-02-13 devnull }
834 fa325e9b 2020-01-10 cross
835 ce94dbe6 2005-02-13 devnull p = mptoa(chal, 16, nil, 0);
836 ce94dbe6 2005-02-13 devnull if(p == nil){
837 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: dorsa: mptoa: %r\n");
838 ce94dbe6 2005-02-13 devnull goto Die;
839 ce94dbe6 2005-02-13 devnull }
840 ce94dbe6 2005-02-13 devnull if(chatty)
841 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: challenge %B => %s\n", chal, p);
842 e1a22963 2005-02-13 devnull if(auth_rpc(rpc, "writehex", p, strlen(p)) != ARok){
843 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: dorsa: auth 'write': %r\n");
844 ce94dbe6 2005-02-13 devnull free(p);
845 ce94dbe6 2005-02-13 devnull goto Die;
846 ce94dbe6 2005-02-13 devnull }
847 ce94dbe6 2005-02-13 devnull free(p);
848 e1a22963 2005-02-13 devnull if(auth_rpc(rpc, "readhex", nil, 0) != ARok){
849 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: dorsa: auth 'read': %r\n");
850 ce94dbe6 2005-02-13 devnull goto Die;
851 ce94dbe6 2005-02-13 devnull }
852 ce94dbe6 2005-02-13 devnull decr = strtomp(rpc->arg, nil, 16, nil);
853 ce94dbe6 2005-02-13 devnull if(chatty)
854 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: response %s => %B\n", rpc->arg, decr);
855 ce94dbe6 2005-02-13 devnull if(decr == nil){
856 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: dorsa: strtomp: %r\n");
857 ce94dbe6 2005-02-13 devnull goto Die;
858 ce94dbe6 2005-02-13 devnull }
859 ce94dbe6 2005-02-13 devnull unpad = rsaunpad(decr);
860 ce94dbe6 2005-02-13 devnull if(chatty)
861 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: unpad %B => %B\n", decr, unpad);
862 ce94dbe6 2005-02-13 devnull if(unpad == nil){
863 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: dorsa: rsaunpad: %r\n");
864 ce94dbe6 2005-02-13 devnull mpfree(decr);
865 ce94dbe6 2005-02-13 devnull goto Die;
866 ce94dbe6 2005-02-13 devnull }
867 ce94dbe6 2005-02-13 devnull mpfree(decr);
868 ce94dbe6 2005-02-13 devnull mptoberjust(unpad, chalbuf, 32);
869 ce94dbe6 2005-02-13 devnull mpfree(unpad);
870 ce94dbe6 2005-02-13 devnull auth_freerpc(rpc);
871 ce94dbe6 2005-02-13 devnull return 0;
872 ce94dbe6 2005-02-13 devnull }
873 ce94dbe6 2005-02-13 devnull
874 ce94dbe6 2005-02-13 devnull int
875 ce94dbe6 2005-02-13 devnull keysign(Msg *mkey, Msg *mdata, Msg *msig)
876 ce94dbe6 2005-02-13 devnull {
877 ce94dbe6 2005-02-13 devnull char *s;
878 ce94dbe6 2005-02-13 devnull AuthRpc *rpc;
879 ce94dbe6 2005-02-13 devnull RSApub *rsa;
880 ce94dbe6 2005-02-13 devnull DSApub *dsa;
881 ce94dbe6 2005-02-13 devnull char buf[4096];
882 ce94dbe6 2005-02-13 devnull uchar digest[SHA1dlen];
883 fa325e9b 2020-01-10 cross
884 ce94dbe6 2005-02-13 devnull s = getstr(mkey);
885 ce94dbe6 2005-02-13 devnull if(strcmp(s, "ssh-rsa") == 0){
886 ce94dbe6 2005-02-13 devnull rsa = getrsapub(mkey);
887 ce94dbe6 2005-02-13 devnull if(rsa == nil)
888 ce94dbe6 2005-02-13 devnull return -1;
889 ce94dbe6 2005-02-13 devnull snprint(buf, sizeof buf, "proto=rsa service=ssh-rsa role=sign n=%lB ek=%lB",
890 ce94dbe6 2005-02-13 devnull rsa->n, rsa->ek);
891 ce94dbe6 2005-02-13 devnull rsapubfree(rsa);
892 ce94dbe6 2005-02-13 devnull }else if(strcmp(s, "ssh-dss") == 0){
893 ce94dbe6 2005-02-13 devnull dsa = getdsapub(mkey);
894 ce94dbe6 2005-02-13 devnull if(dsa == nil)
895 ce94dbe6 2005-02-13 devnull return -1;
896 ce94dbe6 2005-02-13 devnull snprint(buf, sizeof buf, "proto=dsa service=ssh-dss role=sign p=%lB q=%lB alpha=%lB key=%lB",
897 ce94dbe6 2005-02-13 devnull dsa->p, dsa->q, dsa->alpha, dsa->key);
898 ce94dbe6 2005-02-13 devnull dsapubfree(dsa);
899 ce94dbe6 2005-02-13 devnull }else{
900 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: cannot sign key type %s\n", s);
901 ce94dbe6 2005-02-13 devnull werrstr("unknown key type %s", s);
902 ce94dbe6 2005-02-13 devnull return -1;
903 ce94dbe6 2005-02-13 devnull }
904 ce94dbe6 2005-02-13 devnull
905 ce94dbe6 2005-02-13 devnull if((rpc = auth_allocrpc()) == nil){
906 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: auth_allocrpc: %r\n");
907 ce94dbe6 2005-02-13 devnull return -1;
908 ce94dbe6 2005-02-13 devnull }
909 ce94dbe6 2005-02-13 devnull if(chatty)
910 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: start %s\n", buf);
911 ce94dbe6 2005-02-13 devnull if(auth_rpc(rpc, "start", buf, strlen(buf)) != ARok){
912 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: auth 'start' failed: %r\n");
913 ce94dbe6 2005-02-13 devnull Die:
914 ce94dbe6 2005-02-13 devnull auth_freerpc(rpc);
915 ce94dbe6 2005-02-13 devnull return -1;
916 ce94dbe6 2005-02-13 devnull }
917 ce94dbe6 2005-02-13 devnull sha1(mdata->bp, mdata->ep-mdata->bp, digest, nil);
918 ce94dbe6 2005-02-13 devnull if(auth_rpc(rpc, "write", digest, SHA1dlen) != ARok){
919 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: auth 'write in sign failed: %r\n");
920 ce94dbe6 2005-02-13 devnull goto Die;
921 ce94dbe6 2005-02-13 devnull }
922 ce94dbe6 2005-02-13 devnull if(auth_rpc(rpc, "read", nil, 0) != ARok){
923 ce94dbe6 2005-02-13 devnull fprint(2, "ssh-agent: auth 'read' failed: %r\n");
924 ce94dbe6 2005-02-13 devnull goto Die;
925 ce94dbe6 2005-02-13 devnull }
926 ce94dbe6 2005-02-13 devnull newmsg(msig);
927 ce94dbe6 2005-02-13 devnull putstr(msig, s);
928 ce94dbe6 2005-02-13 devnull put4(msig, rpc->narg);
929 ce94dbe6 2005-02-13 devnull putn(msig, rpc->arg, rpc->narg);
930 ce94dbe6 2005-02-13 devnull auth_freerpc(rpc);
931 ce94dbe6 2005-02-13 devnull return 0;
932 ce94dbe6 2005-02-13 devnull }
933 ce94dbe6 2005-02-13 devnull
934 ce94dbe6 2005-02-13 devnull int
935 ce94dbe6 2005-02-13 devnull runmsg(Aconn *a)
936 ce94dbe6 2005-02-13 devnull {
937 ce94dbe6 2005-02-13 devnull char *p;
938 ce94dbe6 2005-02-13 devnull int n, nk, type, rt, vers;
939 ce94dbe6 2005-02-13 devnull mpint *ek, *mod, *chal;
940 ce94dbe6 2005-02-13 devnull uchar sessid[16], chalbuf[32], digest[MD5dlen];
941 ce94dbe6 2005-02-13 devnull uint len, flags;
942 ce94dbe6 2005-02-13 devnull DigestState *s;
943 ce94dbe6 2005-02-13 devnull Msg m, mkey, mdata, msig;
944 fa325e9b 2020-01-10 cross
945 ce94dbe6 2005-02-13 devnull if(a->ndata < 4)
946 ce94dbe6 2005-02-13 devnull return 0;
947 ce94dbe6 2005-02-13 devnull len = (a->data[0]<<24)|(a->data[1]<<16)|(a->data[2]<<8)|a->data[3];
948 ce94dbe6 2005-02-13 devnull if(a->ndata < 4+len)
949 ce94dbe6 2005-02-13 devnull return 0;
950 ce94dbe6 2005-02-13 devnull m.p = a->data+4;
951 ce94dbe6 2005-02-13 devnull m.ep = m.p+len;
952 ce94dbe6 2005-02-13 devnull type = get1(&m);
953 ce94dbe6 2005-02-13 devnull if(chatty)
954 ce94dbe6 2005-02-13 devnull fprint(2, "msg %d: %.*H\n", type, len, m.p);
955 ce94dbe6 2005-02-13 devnull switch(type){
956 ce94dbe6 2005-02-13 devnull default:
957 ce94dbe6 2005-02-13 devnull Failure:
958 ce94dbe6 2005-02-13 devnull newreply(&m, SSH_AGENT_FAILURE);
959 ce94dbe6 2005-02-13 devnull reply(a, &m);
960 ce94dbe6 2005-02-13 devnull break;
961 ce94dbe6 2005-02-13 devnull
962 ce94dbe6 2005-02-13 devnull case SSH_AGENTC_REQUEST_RSA_IDENTITIES:
963 ce94dbe6 2005-02-13 devnull vers = 1;
964 ce94dbe6 2005-02-13 devnull newreply(&m, SSH_AGENT_RSA_IDENTITIES_ANSWER);
965 ce94dbe6 2005-02-13 devnull goto Identities;
966 ce94dbe6 2005-02-13 devnull case SSH2_AGENTC_REQUEST_IDENTITIES:
967 ce94dbe6 2005-02-13 devnull vers = 2;
968 ce94dbe6 2005-02-13 devnull newreply(&m, SSH2_AGENT_IDENTITIES_ANSWER);
969 ce94dbe6 2005-02-13 devnull Identities:
970 ce94dbe6 2005-02-13 devnull nk = listkeys(&m, vers);
971 ce94dbe6 2005-02-13 devnull if(nk < 0){
972 acb880af 2006-03-21 devnull mreset(&m);
973 ce94dbe6 2005-02-13 devnull goto Failure;
974 ce94dbe6 2005-02-13 devnull }
975 ce94dbe6 2005-02-13 devnull if(chatty)
976 ce94dbe6 2005-02-13 devnull fprint(2, "request identities\n", nk);
977 ce94dbe6 2005-02-13 devnull reply(a, &m);
978 ce94dbe6 2005-02-13 devnull break;
979 ce94dbe6 2005-02-13 devnull
980 ce94dbe6 2005-02-13 devnull case SSH_AGENTC_RSA_CHALLENGE:
981 ce94dbe6 2005-02-13 devnull n = get4(&m);
982 c5bfba48 2012-10-21 rsc USED(n);
983 ce94dbe6 2005-02-13 devnull ek = getmp(&m);
984 ce94dbe6 2005-02-13 devnull mod = getmp(&m);
985 ce94dbe6 2005-02-13 devnull chal = getmp(&m);
986 2b604081 2005-05-07 devnull if((p = (char*)getn(&m, 16)) == nil){
987 ce94dbe6 2005-02-13 devnull Failchal:
988 ce94dbe6 2005-02-13 devnull mpfree(ek);
989 ce94dbe6 2005-02-13 devnull mpfree(mod);
990 ce94dbe6 2005-02-13 devnull mpfree(chal);
991 ce94dbe6 2005-02-13 devnull goto Failure;
992 ce94dbe6 2005-02-13 devnull }
993 ce94dbe6 2005-02-13 devnull memmove(sessid, p, 16);
994 ce94dbe6 2005-02-13 devnull rt = get4(&m);
995 ce94dbe6 2005-02-13 devnull if(rt != 1 || dorsa(a, mod, ek, chal, chalbuf) < 0)
996 ce94dbe6 2005-02-13 devnull goto Failchal;
997 ce94dbe6 2005-02-13 devnull s = md5(chalbuf, 32, nil, nil);
998 ce94dbe6 2005-02-13 devnull if(s == nil)
999 ce94dbe6 2005-02-13 devnull goto Failchal;
1000 ce94dbe6 2005-02-13 devnull md5(sessid, 16, digest, s);
1001 e1a22963 2005-02-13 devnull print("md5 %.*H %.*H => %.*H\n", 32, chalbuf, 16, sessid, MD5dlen, digest);
1002 fa325e9b 2020-01-10 cross
1003 ce94dbe6 2005-02-13 devnull newreply(&m, SSH_AGENT_RSA_RESPONSE);
1004 ce94dbe6 2005-02-13 devnull putn(&m, digest, 16);
1005 ce94dbe6 2005-02-13 devnull reply(a, &m);
1006 ce94dbe6 2005-02-13 devnull
1007 ce94dbe6 2005-02-13 devnull mpfree(ek);
1008 ce94dbe6 2005-02-13 devnull mpfree(mod);
1009 ce94dbe6 2005-02-13 devnull mpfree(chal);
1010 ce94dbe6 2005-02-13 devnull break;
1011 ce94dbe6 2005-02-13 devnull
1012 ce94dbe6 2005-02-13 devnull case SSH2_AGENTC_SIGN_REQUEST:
1013 2b604081 2005-05-07 devnull if(getm(&m, &mkey) == nil
1014 2b604081 2005-05-07 devnull || getm(&m, &mdata) == nil)
1015 ce94dbe6 2005-02-13 devnull goto Failure;
1016 ce94dbe6 2005-02-13 devnull flags = get4(&m);
1017 ce94dbe6 2005-02-13 devnull if(flags & SSH_AGENT_OLD_SIGNATURE)
1018 ce94dbe6 2005-02-13 devnull goto Failure;
1019 ce94dbe6 2005-02-13 devnull if(keysign(&mkey, &mdata, &msig) < 0)
1020 ce94dbe6 2005-02-13 devnull goto Failure;
1021 ce94dbe6 2005-02-13 devnull if(chatty)
1022 ce94dbe6 2005-02-13 devnull fprint(2, "signature: %.*H\n",
1023 ce94dbe6 2005-02-13 devnull msig.p-msig.bp, msig.bp);
1024 ce94dbe6 2005-02-13 devnull newreply(&m, SSH2_AGENT_SIGN_RESPONSE);
1025 ce94dbe6 2005-02-13 devnull putm(&m, &msig);
1026 acb880af 2006-03-21 devnull mreset(&msig);
1027 ce94dbe6 2005-02-13 devnull reply(a, &m);
1028 ce94dbe6 2005-02-13 devnull break;
1029 fa325e9b 2020-01-10 cross
1030 ce94dbe6 2005-02-13 devnull case SSH_AGENTC_ADD_RSA_IDENTITY:
1031 ce94dbe6 2005-02-13 devnull /*
1032 ce94dbe6 2005-02-13 devnull msg: n[4] mod[mp] pubexp[exp] privexp[mp]
1033 ce94dbe6 2005-02-13 devnull p^-1 mod q[mp] p[mp] q[mp] comment[str]
1034 ce94dbe6 2005-02-13 devnull */
1035 ce94dbe6 2005-02-13 devnull goto Failure;
1036 fa325e9b 2020-01-10 cross
1037 ce94dbe6 2005-02-13 devnull case SSH_AGENTC_REMOVE_RSA_IDENTITY:
1038 ce94dbe6 2005-02-13 devnull /*
1039 ce94dbe6 2005-02-13 devnull msg: n[4] mod[mp] pubexp[mp]
1040 ce94dbe6 2005-02-13 devnull */
1041 ce94dbe6 2005-02-13 devnull goto Failure;
1042 fa325e9b 2020-01-10 cross
1043 ce94dbe6 2005-02-13 devnull }
1044 fa325e9b 2020-01-10 cross
1045 ce94dbe6 2005-02-13 devnull a->ndata -= 4+len;
1046 ce94dbe6 2005-02-13 devnull memmove(a->data, a->data+4+len, a->ndata);
1047 ce94dbe6 2005-02-13 devnull return 1;
1048 ce94dbe6 2005-02-13 devnull }
1049 ce94dbe6 2005-02-13 devnull
1050 ce94dbe6 2005-02-13 devnull void*
1051 ce94dbe6 2005-02-13 devnull emalloc(int n)
1052 ce94dbe6 2005-02-13 devnull {
1053 ce94dbe6 2005-02-13 devnull void *v;
1054 ce94dbe6 2005-02-13 devnull
1055 ce94dbe6 2005-02-13 devnull v = mallocz(n, 1);
1056 ce94dbe6 2005-02-13 devnull if(v == nil){
1057 ce94dbe6 2005-02-13 devnull abort();
1058 ce94dbe6 2005-02-13 devnull sysfatal("out of memory allocating %d", n);
1059 ce94dbe6 2005-02-13 devnull }
1060 ce94dbe6 2005-02-13 devnull return v;
1061 ce94dbe6 2005-02-13 devnull }
1062 ce94dbe6 2005-02-13 devnull
1063 ce94dbe6 2005-02-13 devnull void*
1064 ce94dbe6 2005-02-13 devnull erealloc(void *v, int n)
1065 ce94dbe6 2005-02-13 devnull {
1066 ce94dbe6 2005-02-13 devnull v = realloc(v, n);
1067 ce94dbe6 2005-02-13 devnull if(v == nil){
1068 ce94dbe6 2005-02-13 devnull abort();
1069 ce94dbe6 2005-02-13 devnull sysfatal("out of memory reallocating %d", n);
1070 ce94dbe6 2005-02-13 devnull }
1071 ce94dbe6 2005-02-13 devnull return v;
1072 ce94dbe6 2005-02-13 devnull }