| @@ -7,7 +7,7 @@ · 6 unmodified lines |
| 7 | 7 | #include "fns.h" |
| 8 | 8 | #include "error.h" |
| 9 | 9 | |
| 10 | | −#include "libsec.h" |
| 10 | +#include <libsec.h> |
| 11 | 11 | |
| 12 | 12 | #define NOSPOOKS 1 |
| 13 | 13 | |
| @@ -72,15 +72,15 @@ struct Dstate · 58 unmodified lines |
| 72 | 72 | enum |
| 73 | 73 | { |
| 74 | 74 | Maxdmsg= 1<<16, |
| 75 | | − Maxdstate= 128, /* must be a power of 2 */ |
| 75 | + Maxdstate= 512, /* max. open ssl conn's; must be a power of 2 */ |
| 76 | 76 | }; |
| 77 | 77 | |
| 78 | | −Lock dslock; |
| 79 | | −int dshiwat; |
| 80 | | −char *dsname[Maxdstate]; |
| 81 | | −Dstate *dstate[Maxdstate]; |
| 82 | | −char *encalgs; |
| 83 | | −char *hashalgs; |
| 78 | +static Lock dslock; |
| 79 | +static int dshiwat; |
| 80 | +static char *dsname[Maxdstate]; |
| 81 | +static Dstate *dstate[Maxdstate]; |
| 82 | +static char *encalgs; |
| 83 | +static char *hashalgs; |
| 84 | 84 | |
| 85 | 85 | enum{ |
| 86 | 86 | Qtopdir = 1, /* top level directory */ |
| @@ -113,17 +113,13 @@ static void dsnew(Chan *c, Dstate **); · 26 unmodified lines |
| 113 | 113 | static long sslput(Dstate *s, Block * volatile b); |
| 114 | 114 | |
| 115 | 115 | char *sslnames[] = { |
| 116 | | − /* unused */ 0, |
| 117 | | − /* topdir */ 0, |
| 118 | | − /* protodir */ 0, |
| 119 | | − "clone", |
| 120 | | − /* convdir */ 0, |
| 121 | | − "data", |
| 122 | | − "ctl", |
| 123 | | − "secretin", |
| 124 | | − "secretout", |
| 125 | | − "encalgs", |
| 126 | | − "hashalgs", |
| 116 | +[Qclonus] "clone", |
| 117 | +[Qdata] "data", |
| 118 | +[Qctl] "ctl", |
| 119 | +[Qsecretin] "secretin", |
| 120 | +[Qsecretout] "secretout", |
| 121 | +[Qencalgs] "encalgs", |
| 122 | +[Qhashalgs] "hashalgs", |
| 127 | 123 | }; |
| 128 | 124 | |
| 129 | 125 | static int |
| @@ -237,7 +233,6 @@ sslgen(Chan *c, char *n, Dirtab *d, int nd, int s, Dir *dp) · 107 unmodified lines |
| 237 | 233 | devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, nm, 0660, dp); |
| 238 | 234 | return 1; |
| 239 | 235 | } |
| 240 | | − return -1; |
| 241 | 236 | } |
| 242 | 237 | |
| 243 | 238 | static Chan* |
| @@ -358,7 +353,7 @@ sslwstat(Chan *c, uchar *db, int n) · 114 unmodified lines |
| 358 | 353 | |
| 359 | 354 | if(!emptystr(dir->uid)) |
| 360 | 355 | kstrdup(&s->user, dir->uid); |
| 361 | | − if(dir->mode != ~0) |
| 356 | + if(dir->mode != ~0UL) |
| 362 | 357 | s->perm = dir->mode; |
| 363 | 358 | |
| 364 | 359 | free(dir); |
| @@ -766,9 +761,8 @@ sslput(Dstate *s, Block * volatile b) · 401 unmodified lines |
| 766 | 761 | int offset; |
| 767 | 762 | |
| 768 | 763 | if(waserror()){ |
| 769 | | −iprint("error: %s\n", up->errstr); |
| 770 | 764 | if(b != nil) |
| 771 | | − free(b); |
| 765 | + freeb(b); |
| 772 | 766 | nexterror(); |
| 773 | 767 | } |
| 774 | 768 | |
| @@ -900,7 +894,7 @@ initDESkey_40(OneWay *w) · 125 unmodified lines |
| 900 | 894 | key[6] &= 0x0f; |
| 901 | 895 | } |
| 902 | 896 | |
| 903 | | − w->state = malloc(sizeof(DESstate)); |
| 897 | + w->state = smalloc(sizeof(DESstate)); |
| 904 | 898 | if(w->slen >= 16) |
| 905 | 899 | setupDESstate(w->state, key, w->secret+8); |
| 906 | 900 | else if(w->slen >= 8) |
| @@ -936,7 +930,7 @@ initRC4key_40(OneWay *w) · 29 unmodified lines |
| 936 | 930 | if(w->slen > 5) |
| 937 | 931 | w->slen = 5; |
| 938 | 932 | |
| 939 | | − w->state = malloc(sizeof(RC4state)); |
| 933 | + w->state = smalloc(sizeof(RC4state)); |
| 940 | 934 | setupRC4state(w->state, w->secret, w->slen); |
| 941 | 935 | } |
| 942 | 936 | |
| @@ -955,7 +949,7 @@ initRC4key_128(OneWay *w) · 12 unmodified lines |
| 955 | 949 | if(w->slen > 16) |
| 956 | 950 | w->slen = 16; |
| 957 | 951 | |
| 958 | | − w->state = malloc(sizeof(RC4state)); |
| 952 | + w->state = smalloc(sizeof(RC4state)); |
| 959 | 953 | setupRC4state(w->state, w->secret, w->slen); |
| 960 | 954 | } |
| 961 | 955 | |
| @@ -1004,6 +998,7 @@ struct Encalg · 42 unmodified lines |
| 1004 | 998 | }; |
| 1005 | 999 | |
| 1006 | 1000 | #ifdef NOSPOOKS |
| 1001 | +static |
| 1007 | 1002 | Encalg encrypttab[] = |
| 1008 | 1003 | { |
| 1009 | 1004 | { "descbc", 8, DESCBC, initDESkey, }, /* DEPRECATED -- use des_56_cbc */ |
| @@ -1019,6 +1014,7 @@ Encalg encrypttab[] = · 9 unmodified lines |
| 1019 | 1014 | { 0 } |
| 1020 | 1015 | }; |
| 1021 | 1016 | #else |
| 1017 | +static |
| 1022 | 1018 | Encalg encrypttab[] = |
| 1023 | 1019 | { |
| 1024 | 1020 | { "des_40_cbc", 8, DESCBC, initDESkey_40, }, |
| @@ -1048,14 +1044,31 @@ parseencryptalg(char *p, Dstate *s) · 23 unmodified lines |
| 1048 | 1044 | return -1; |
| 1049 | 1045 | } |
| 1050 | 1046 | |
| 1047 | +enum { |
| 1048 | + Cfd, |
| 1049 | + Calg, |
| 1050 | + Csin, |
| 1051 | + Csout, |
| 1052 | +}; |
| 1053 | + |
| 1054 | +static |
| 1055 | +Cmdtab sslcmds[] = { |
| 1056 | + {Cfd, "fd", 2 }, |
| 1057 | + {Calg, "alg", 0 }, |
| 1058 | + {Csin, "secretin", 2 }, |
| 1059 | + {Csout, "secretout", 2 }, |
| 1060 | +}; |
| 1061 | + |
| 1051 | 1062 | static long |
| 1052 | 1063 | sslwrite(Chan *c, void *a, long n, vlong o) |
| 1053 | 1064 | { |
| 1054 | 1065 | Dstate * volatile s; |
| 1055 | 1066 | Block * volatile b; |
| 1056 | | − int m, t; |
| 1057 | | − char *p, *np, *e, buf[128]; |
| 1067 | + int m, t, i; |
| 1068 | + char *p, *e; |
| 1058 | 1069 | uchar *x; |
| 1070 | + Cmdbuf *cb; |
| 1071 | + Cmdtab *ct; |
| 1059 | 1072 | |
| 1060 | 1073 | USED(o); |
| 1061 | 1074 | s = dstate[CONV(c->qid)]; |
| @@ -1073,9 +1086,8 @@ sslwrite(Chan *c, void *a, long n, vlong o) · 11 unmodified lines |
| 1073 | 1086 | nexterror(); |
| 1074 | 1087 | } |
| 1075 | 1088 | qlock(&s->out.q); |
| 1089 | + |
| 1076 | 1090 | p = a; |
| 1077 | | −if(0) iprint("write %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", |
| 1078 | | − n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); |
| 1079 | 1091 | e = p + n; |
| 1080 | 1092 | do { |
| 1081 | 1093 | m = e - p; |
| @@ -1095,9 +1107,7 @@ if(0) iprint("write %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", · 13 unmodified lines |
| 1095 | 1107 | |
| 1096 | 1108 | p += m; |
| 1097 | 1109 | } while(p < e); |
| 1098 | | − p = a; |
| 1099 | | −if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", |
| 1100 | | − n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); |
| 1110 | + |
| 1101 | 1111 | poperror(); |
| 1102 | 1112 | qunlock(&s->out.q); |
| 1103 | 1113 | return n; |
| @@ -1125,19 +1135,15 @@ if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", · 21 unmodified lines |
| 1125 | 1135 | break; |
| 1126 | 1136 | } |
| 1127 | 1137 | |
| 1128 | | − if(n >= sizeof(buf)) |
| 1129 | | − error("arg too long"); |
| 1130 | | − strncpy(buf, a, n); |
| 1131 | | − buf[n] = 0; |
| 1132 | | − p = strchr(buf, '\n'); |
| 1133 | | − if(p) |
| 1134 | | − *p = 0; |
| 1135 | | − p = strchr(buf, ' '); |
| 1136 | | − if(p) |
| 1137 | | − *p++ = 0; |
| 1138 | | − |
| 1139 | | − if(strcmp(buf, "fd") == 0){ |
| 1140 | | − s->c = buftochan(p); |
| 1138 | + cb = parsecmd(a, n); |
| 1139 | + if(waserror()){ |
| 1140 | + free(cb); |
| 1141 | + nexterror(); |
| 1142 | + } |
| 1143 | + ct = lookupcmd(cb, sslcmds, nelem(sslcmds)); |
| 1144 | + switch(ct->index){ |
| 1145 | + case Cfd: |
| 1146 | + s->c = buftochan(cb->f[1]); |
| 1141 | 1147 | |
| 1142 | 1148 | /* default is clear (msg delimiters only) */ |
| 1143 | 1149 | s->state = Sclear; |
| @@ -1146,7 +1152,11 @@ if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", · 2 unmodified lines |
| 1146 | 1152 | s->maxpad = s->max = (1<<15) - s->diglen - 1; |
| 1147 | 1153 | s->in.mid = 0; |
| 1148 | 1154 | s->out.mid = 0; |
| 1149 | | − } else if(strcmp(buf, "alg") == 0 && p != 0){ |
| 1155 | + break; |
| 1156 | + case Calg: |
| 1157 | + if(cb->nf < 2) |
| 1158 | + cmderror(cb, "no algorithms"); |
| 1159 | + |
| 1150 | 1160 | s->blocklen = 1; |
| 1151 | 1161 | s->diglen = 0; |
| 1152 | 1162 | |
| @@ -1155,9 +1165,8 @@ if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", · 2 unmodified lines |
| 1155 | 1165 | |
| 1156 | 1166 | s->state = Sclear; |
| 1157 | 1167 | s->maxpad = s->max = (1<<15) - s->diglen - 1; |
| 1158 | | − if(strcmp(p, "clear") == 0){ |
| 1159 | | − goto out; |
| 1160 | | − } |
| 1168 | + if(strcmp(cb->f[1], "clear") == 0) |
| 1169 | + break; |
| 1161 | 1170 | |
| 1162 | 1171 | if(s->in.secret && s->out.secret == 0) |
| 1163 | 1172 | setsecret(&s->out, s->in.secret, s->in.slen); |
| @@ -1170,18 +1179,11 @@ if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", · 6 unmodified lines |
| 1170 | 1179 | s->encryptalg = Noencryption; |
| 1171 | 1180 | s->blocklen = 1; |
| 1172 | 1181 | |
| 1173 | | − for(;;){ |
| 1174 | | − np = strchr(p, ' '); |
| 1175 | | − if(np) |
| 1176 | | − *np++ = 0; |
| 1177 | | − |
| 1182 | + for(i=1; i<cb->nf; i++){ |
| 1183 | + p = cb->f[i]; |
| 1178 | 1184 | if(parsehashalg(p, s) < 0) |
| 1179 | 1185 | if(parseencryptalg(p, s) < 0) |
| 1180 | 1186 | error("bad algorithm"); |
| 1181 | | − |
| 1182 | | − if(np == 0) |
| 1183 | | − break; |
| 1184 | | − p = np; |
| 1185 | 1187 | } |
| 1186 | 1188 | |
| 1187 | 1189 | if(s->hf == 0 && s->encryptalg == Noencryption) |
| @@ -1194,20 +1196,34 @@ if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", · 6 unmodified lines |
| 1194 | 1196 | s->maxpad -= s->maxpad % s->blocklen; |
| 1195 | 1197 | } else |
| 1196 | 1198 | s->maxpad = s->max = (1<<15) - s->diglen - 1; |
| 1197 | | − } else if(strcmp(buf, "secretin") == 0 && p != 0) { |
| 1199 | + break; |
| 1200 | + case Csin: |
| 1201 | + p = cb->f[1]; |
| 1198 | 1202 | m = (strlen(p)*3)/2; |
| 1199 | 1203 | x = smalloc(m); |
| 1200 | 1204 | t = dec64(x, m, p, strlen(p)); |
| 1205 | + if(t <= 0){ |
| 1206 | + free(x); |
| 1207 | + error(Ebadarg); |
| 1208 | + } |
| 1201 | 1209 | setsecret(&s->in, x, t); |
| 1202 | 1210 | free(x); |
| 1203 | | − } else if(strcmp(buf, "secretout") == 0 && p != 0) { |
| 1211 | + break; |
| 1212 | + case Csout: |
| 1213 | + p = cb->f[1]; |
| 1204 | 1214 | m = (strlen(p)*3)/2 + 1; |
| 1205 | 1215 | x = smalloc(m); |
| 1206 | 1216 | t = dec64(x, m, p, strlen(p)); |
| 1217 | + if(t <= 0){ |
| 1218 | + free(x); |
| 1219 | + error(Ebadarg); |
| 1220 | + } |
| 1207 | 1221 | setsecret(&s->out, x, t); |
| 1208 | 1222 | free(x); |
| 1209 | | − } else |
| 1210 | | − error(Ebadarg); |
| 1223 | + break; |
| 1224 | + } |
| 1225 | + poperror(); |
| 1226 | + free(cb); |
| 1211 | 1227 | |
| 1212 | 1228 | out: |
| 1213 | 1229 | qunlock(&s->in.ctlq); |
| @@ -1426,7 +1442,7 @@ checkdigestb(Dstate *s, Block *bin) · 212 unmodified lines |
| 1426 | 1442 | *p = n; |
| 1427 | 1443 | (*s->hf)(msgid, 4, digest, &ss); |
| 1428 | 1444 | |
| 1429 | | − if(memcmp(digest, bin->rp, s->diglen) != 0) |
| 1445 | + if(tsmemcmp(digest, bin->rp, s->diglen) != 0) |
| 1430 | 1446 | error("bad digest"); |
| 1431 | 1447 | } |
| 1432 | 1448 | |