Blame


1 2277c5d7 2004-03-21 devnull #include "dat.h"
2 2277c5d7 2004-03-21 devnull #include <mp.h>
3 2277c5d7 2004-03-21 devnull #include <libsec.h>
4 2277c5d7 2004-03-21 devnull
5 2277c5d7 2004-03-21 devnull typedef struct Sshrsastate Sshrsastate;
6 2277c5d7 2004-03-21 devnull
7 2277c5d7 2004-03-21 devnull enum {
8 2277c5d7 2004-03-21 devnull CReadpub,
9 2277c5d7 2004-03-21 devnull CWritechal,
10 2277c5d7 2004-03-21 devnull CReadresp,
11 2277c5d7 2004-03-21 devnull };
12 2277c5d7 2004-03-21 devnull struct State
13 2277c5d7 2004-03-21 devnull {
14 2277c5d7 2004-03-21 devnull RSApriv *priv;
15 2277c5d7 2004-03-21 devnull Key *k;
16 2277c5d7 2004-03-21 devnull mpint *resp;
17 2277c5d7 2004-03-21 devnull int phase;
18 2277c5d7 2004-03-21 devnull };
19 2277c5d7 2004-03-21 devnull
20 2277c5d7 2004-03-21 devnull static RSApriv*
21 2277c5d7 2004-03-21 devnull readrsapriv(char *s)
22 2277c5d7 2004-03-21 devnull {
23 2277c5d7 2004-03-21 devnull RSApriv *priv;
24 2277c5d7 2004-03-21 devnull
25 2277c5d7 2004-03-21 devnull priv = rsaprivalloc();
26 2277c5d7 2004-03-21 devnull
27 2277c5d7 2004-03-21 devnull strtoul(s, &s, 10);
28 2277c5d7 2004-03-21 devnull if((priv->pub.ek=strtomp(s, &s, 16, nil)) == nil)
29 2277c5d7 2004-03-21 devnull goto Error;
30 2277c5d7 2004-03-21 devnull if((priv->dk=strtomp(s, &s, 16, nil)) == nil)
31 2277c5d7 2004-03-21 devnull goto Error;
32 2277c5d7 2004-03-21 devnull if((priv->pub.n=strtomp(s, &s, 16, nil)) == nil)
33 2277c5d7 2004-03-21 devnull goto Error;
34 2277c5d7 2004-03-21 devnull if((priv->p=strtomp(s, &s, 16, nil)) == nil)
35 2277c5d7 2004-03-21 devnull goto Error;
36 2277c5d7 2004-03-21 devnull if((priv->q=strtomp(s, &s, 16, nil)) == nil)
37 2277c5d7 2004-03-21 devnull goto Error;
38 2277c5d7 2004-03-21 devnull if((priv->kp=strtomp(s, &s, 16, nil)) == nil)
39 2277c5d7 2004-03-21 devnull goto Error;
40 2277c5d7 2004-03-21 devnull if((priv->kq=strtomp(s, &s, 16, nil)) == nil)
41 2277c5d7 2004-03-21 devnull goto Error;
42 2277c5d7 2004-03-21 devnull if((priv->c2=strtomp(s, &s, 16, nil)) == nil)
43 2277c5d7 2004-03-21 devnull goto Error;
44 2277c5d7 2004-03-21 devnull
45 2277c5d7 2004-03-21 devnull return priv;
46 2277c5d7 2004-03-21 devnull
47 2277c5d7 2004-03-21 devnull Error:
48 2277c5d7 2004-03-21 devnull rsaprivfree(priv);
49 2277c5d7 2004-03-21 devnull return nil;
50 2277c5d7 2004-03-21 devnull }
51 2277c5d7 2004-03-21 devnull
52 2277c5d7 2004-03-21 devnull int
53 2277c5d7 2004-03-21 devnull sshinit(Fsstate *fss,
54 2277c5d7 2004-03-21 devnull sshrsaopen(Key *k, char*, int client)
55 2277c5d7 2004-03-21 devnull {
56 2277c5d7 2004-03-21 devnull Sshrsastate *s;
57 2277c5d7 2004-03-21 devnull
58 2277c5d7 2004-03-21 devnull fmtinstall('B', mpconv);
59 2277c5d7 2004-03-21 devnull assert(client);
60 2277c5d7 2004-03-21 devnull s = emalloc(sizeof *s);
61 2277c5d7 2004-03-21 devnull s->priv = readrsapriv(s_to_c(k->data));
62 2277c5d7 2004-03-21 devnull s->k = k;
63 2277c5d7 2004-03-21 devnull if(s->priv == nil){
64 2277c5d7 2004-03-21 devnull agentlog("error parsing ssh key %s", k->file);
65 2277c5d7 2004-03-21 devnull free(s);
66 2277c5d7 2004-03-21 devnull return nil;
67 2277c5d7 2004-03-21 devnull }
68 2277c5d7 2004-03-21 devnull return s;
69 2277c5d7 2004-03-21 devnull }
70 2277c5d7 2004-03-21 devnull
71 2277c5d7 2004-03-21 devnull int
72 2277c5d7 2004-03-21 devnull sshrsaread(void *va, void *buf, int n)
73 2277c5d7 2004-03-21 devnull {
74 2277c5d7 2004-03-21 devnull Sshrsastate *s;
75 2277c5d7 2004-03-21 devnull
76 2277c5d7 2004-03-21 devnull s = va;
77 2277c5d7 2004-03-21 devnull switch(s->phase){
78 2277c5d7 2004-03-21 devnull case Readpub:
79 2277c5d7 2004-03-21 devnull s->phase = Done;
80 2277c5d7 2004-03-21 devnull return snprint(buf, n, "%B", s->priv->pub.n);
81 2277c5d7 2004-03-21 devnull case Readresp:
82 2277c5d7 2004-03-21 devnull s->phase = Done;
83 2277c5d7 2004-03-21 devnull return snprint(buf, n, "%B", s->resp);
84 2277c5d7 2004-03-21 devnull default:
85 2277c5d7 2004-03-21 devnull return 0;
86 2277c5d7 2004-03-21 devnull }
87 2277c5d7 2004-03-21 devnull }
88 2277c5d7 2004-03-21 devnull
89 2277c5d7 2004-03-21 devnull int
90 2277c5d7 2004-03-21 devnull sshrsawrite(void *va, void *vbuf, int n)
91 2277c5d7 2004-03-21 devnull {
92 2277c5d7 2004-03-21 devnull mpint *m;
93 2277c5d7 2004-03-21 devnull char *buf;
94 2277c5d7 2004-03-21 devnull Sshrsastate *s;
95 2277c5d7 2004-03-21 devnull
96 2277c5d7 2004-03-21 devnull s = va;
97 2277c5d7 2004-03-21 devnull if((s->k->flags&Fconfirmuse) && confirm("ssh use") < 0)
98 2277c5d7 2004-03-21 devnull return -1;
99 2277c5d7 2004-03-21 devnull
100 2277c5d7 2004-03-21 devnull buf = emalloc(n+1);
101 2277c5d7 2004-03-21 devnull memmove(buf, vbuf, n);
102 2277c5d7 2004-03-21 devnull buf[n] = '\0';
103 2277c5d7 2004-03-21 devnull m = strtomp(buf, nil, 16, nil);
104 2277c5d7 2004-03-21 devnull free(buf);
105 2277c5d7 2004-03-21 devnull if(m == nil){
106 2277c5d7 2004-03-21 devnull werrstr("bad bignum");
107 2277c5d7 2004-03-21 devnull return -1;
108 2277c5d7 2004-03-21 devnull }
109 2277c5d7 2004-03-21 devnull
110 2277c5d7 2004-03-21 devnull agentlog("ssh use");
111 2277c5d7 2004-03-21 devnull m = rsadecrypt(s->priv, m, m);
112 2277c5d7 2004-03-21 devnull s->resp = m;
113 2277c5d7 2004-03-21 devnull s->phase = Readresp;
114 2277c5d7 2004-03-21 devnull return n;
115 2277c5d7 2004-03-21 devnull }
116 2277c5d7 2004-03-21 devnull
117 2277c5d7 2004-03-21 devnull void
118 2277c5d7 2004-03-21 devnull sshrsaclose(void *v)
119 2277c5d7 2004-03-21 devnull {
120 2277c5d7 2004-03-21 devnull Sshrsastate *s;
121 2277c5d7 2004-03-21 devnull
122 2277c5d7 2004-03-21 devnull s = v;
123 2277c5d7 2004-03-21 devnull rsaprivfree(s->priv);
124 2277c5d7 2004-03-21 devnull mpfree(s->resp);
125 2277c5d7 2004-03-21 devnull free(s);
126 2277c5d7 2004-03-21 devnull }
127 2277c5d7 2004-03-21 devnull
128 2277c5d7 2004-03-21 devnull Proto sshrsa = {
129 2277c5d7 2004-03-21 devnull .name= "ssh-rsa",
130 2277c5d7 2004-03-21 devnull .perm= 0666,
131 2277c5d7 2004-03-21 devnull .open= sshrsaopen,
132 2277c5d7 2004-03-21 devnull .read= sshrsaread,
133 2277c5d7 2004-03-21 devnull .write= sshrsawrite,
134 2277c5d7 2004-03-21 devnull .close= sshrsaclose,
135 2277c5d7 2004-03-21 devnull };