devtls.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. /*
  10. * devtls - record layer for transport layer security 1.0 and secure sockets layer 3.0
  11. */
  12. #include "u.h"
  13. #include "../port/lib.h"
  14. #include "mem.h"
  15. #include "dat.h"
  16. #include "fns.h"
  17. #include "../port/error.h"
  18. #include <libsec.h>
  19. typedef struct OneWay OneWay;
  20. typedef struct Secret Secret;
  21. typedef struct TlsRec TlsRec;
  22. typedef struct TlsErrs TlsErrs;
  23. enum {
  24. Statlen= 1024, /* max. length of status or stats message */
  25. /* buffer limits */
  26. MaxRecLen = 1<<14, /* max payload length of a record layer message */
  27. MaxCipherRecLen = MaxRecLen + 2048,
  28. RecHdrLen = 5,
  29. MaxMacLen = SHA1dlen,
  30. /* protocol versions we can accept */
  31. TLSVersion = 0x0301,
  32. SSL3Version = 0x0300,
  33. ProtocolVersion = 0x0301, /* maximum version we speak */
  34. MinProtoVersion = 0x0300, /* limits on version we accept */
  35. MaxProtoVersion = 0x03ff,
  36. /* connection states */
  37. SHandshake = 1 << 0, /* doing handshake */
  38. SOpen = 1 << 1, /* application data can be sent */
  39. SRClose = 1 << 2, /* remote side has closed down */
  40. SLClose = 1 << 3, /* sent a close notify alert */
  41. SAlert = 1 << 5, /* sending or sent a fatal alert */
  42. SError = 1 << 6, /* some sort of error has occured */
  43. SClosed = 1 << 7, /* it is all over */
  44. /* record types */
  45. RChangeCipherSpec = 20,
  46. RAlert,
  47. RHandshake,
  48. RApplication,
  49. SSL2ClientHello = 1,
  50. HSSL2ClientHello = 9, /* local convention; see tlshand.c */
  51. /* alerts */
  52. ECloseNotify = 0,
  53. EUnexpectedMessage = 10,
  54. EBadRecordMac = 20,
  55. EDecryptionFailed = 21,
  56. ERecordOverflow = 22,
  57. EDecompressionFailure = 30,
  58. EHandshakeFailure = 40,
  59. ENoCertificate = 41,
  60. EBadCertificate = 42,
  61. EUnsupportedCertificate = 43,
  62. ECertificateRevoked = 44,
  63. ECertificateExpired = 45,
  64. ECertificateUnknown = 46,
  65. EIllegalParameter = 47,
  66. EUnknownCa = 48,
  67. EAccessDenied = 49,
  68. EDecodeError = 50,
  69. EDecryptError = 51,
  70. EExportRestriction = 60,
  71. EProtocolVersion = 70,
  72. EInsufficientSecurity = 71,
  73. EInternalError = 80,
  74. EUserCanceled = 90,
  75. ENoRenegotiation = 100,
  76. EMAX = 256
  77. };
  78. struct Secret
  79. {
  80. char *encalg; /* name of encryption alg */
  81. char *hashalg; /* name of hash alg */
  82. int (*enc)(Secret*, uint8_t*, int);
  83. int (*dec)(Secret*, uint8_t*, int);
  84. int (*unpad)(uint8_t*, int, int);
  85. DigestState *(*mac)(uint8_t*, uint32_t, uint8_t*, uint32_t,
  86. uint8_t*, DigestState*);
  87. int block; /* encryption block len, 0 if none */
  88. int maclen;
  89. void *enckey;
  90. uint8_t mackey[MaxMacLen];
  91. };
  92. struct OneWay
  93. {
  94. QLock io; /* locks io access */
  95. QLock seclock; /* locks secret paramaters */
  96. uint32_t seq;
  97. Secret *sec; /* cipher in use */
  98. Secret *new; /* cipher waiting for enable */
  99. };
  100. struct TlsRec
  101. {
  102. Chan *c; /* io channel */
  103. int ref; /* serialized by tdlock for atomic destroy */
  104. int version; /* version of the protocol we are speaking */
  105. char verset; /* version has been set */
  106. char opened; /* opened command every issued? */
  107. char err[ERRMAX]; /* error message to return to handshake requests */
  108. int64_t handin; /* bytes communicated by the record layer */
  109. int64_t handout;
  110. int64_t datain;
  111. int64_t dataout;
  112. Lock statelk;
  113. int state;
  114. int debug;
  115. /* record layer mac functions for different protocol versions */
  116. void (*packMac)(Secret*, uint8_t*, uint8_t*,
  117. uint8_t*, uint8_t*, int, uint8_t*);
  118. /* input side -- protected by in.io */
  119. OneWay in;
  120. Block *processed; /* next bunch of application data */
  121. Block *unprocessed; /* data read from c but not parsed into records */
  122. /* handshake queue */
  123. Lock hqlock; /* protects hqref, alloc & free of handq, hprocessed */
  124. int hqref;
  125. Queue *handq; /* queue of handshake messages */
  126. Block *hprocessed; /* remainder of last block read from handq */
  127. QLock hqread; /* protects reads for hprocessed, handq */
  128. /* output side */
  129. OneWay out;
  130. /* protections */
  131. char *user;
  132. int perm;
  133. };
  134. struct TlsErrs{
  135. int err;
  136. int sslerr;
  137. int tlserr;
  138. int fatal;
  139. char *msg;
  140. };
  141. static TlsErrs tlserrs[] = {
  142. {ECloseNotify, ECloseNotify, ECloseNotify, 0, "close notify"},
  143. {EUnexpectedMessage, EUnexpectedMessage, EUnexpectedMessage, 1, "unexpected message"},
  144. {EBadRecordMac, EBadRecordMac, EBadRecordMac, 1, "bad record mac"},
  145. {EDecryptionFailed, EIllegalParameter, EDecryptionFailed, 1, "decryption failed"},
  146. {ERecordOverflow, EIllegalParameter, ERecordOverflow, 1, "record too long"},
  147. {EDecompressionFailure, EDecompressionFailure, EDecompressionFailure, 1, "decompression failed"},
  148. {EHandshakeFailure, EHandshakeFailure, EHandshakeFailure, 1, "could not negotiate acceptable security parameters"},
  149. {ENoCertificate, ENoCertificate, ECertificateUnknown, 1, "no appropriate certificate available"},
  150. {EBadCertificate, EBadCertificate, EBadCertificate, 1, "corrupted or invalid certificate"},
  151. {EUnsupportedCertificate, EUnsupportedCertificate, EUnsupportedCertificate, 1, "unsupported certificate type"},
  152. {ECertificateRevoked, ECertificateRevoked, ECertificateRevoked, 1, "revoked certificate"},
  153. {ECertificateExpired, ECertificateExpired, ECertificateExpired, 1, "expired certificate"},
  154. {ECertificateUnknown, ECertificateUnknown, ECertificateUnknown, 1, "unacceptable certificate"},
  155. {EIllegalParameter, EIllegalParameter, EIllegalParameter, 1, "illegal parameter"},
  156. {EUnknownCa, EHandshakeFailure, EUnknownCa, 1, "unknown certificate authority"},
  157. {EAccessDenied, EHandshakeFailure, EAccessDenied, 1, "access denied"},
  158. {EDecodeError, EIllegalParameter, EDecodeError, 1, "error decoding message"},
  159. {EDecryptError, EIllegalParameter, EDecryptError, 1, "error decrypting message"},
  160. {EExportRestriction, EHandshakeFailure, EExportRestriction, 1, "export restriction violated"},
  161. {EProtocolVersion, EIllegalParameter, EProtocolVersion, 1, "protocol version not supported"},
  162. {EInsufficientSecurity, EHandshakeFailure, EInsufficientSecurity, 1, "stronger security routines required"},
  163. {EInternalError, EHandshakeFailure, EInternalError, 1, "internal error"},
  164. {EUserCanceled, ECloseNotify, EUserCanceled, 0, "handshake canceled by user"},
  165. {ENoRenegotiation, EUnexpectedMessage, ENoRenegotiation, 0, "no renegotiation"},
  166. };
  167. enum
  168. {
  169. /* max. open tls connections */
  170. MaxTlsDevs = 1024
  171. };
  172. static Lock tdlock;
  173. static int tdhiwat;
  174. static int maxtlsdevs = 128;
  175. static TlsRec **tlsdevs;
  176. static char **trnames;
  177. static char *encalgs;
  178. static char *hashalgs;
  179. enum{
  180. Qtopdir = 1, /* top level directory */
  181. Qprotodir,
  182. Qclonus,
  183. Qencalgs,
  184. Qhashalgs,
  185. Qconvdir, /* directory for a conversation */
  186. Qdata,
  187. Qctl,
  188. Qhand,
  189. Qstatus,
  190. Qstats,
  191. };
  192. #define TYPE(x) ((x).path & 0xf)
  193. #define CONV(x) (((x).path >> 5)&(MaxTlsDevs-1))
  194. #define QID(c, y) (((c)<<5) | (y))
  195. static void checkstate(TlsRec *, int, int);
  196. static void ensure(TlsRec*, Block**, int);
  197. static void consume(Block**, uint8_t*, int);
  198. static Chan* buftochan(char*);
  199. static void tlshangup(TlsRec*);
  200. static void tlsError(TlsRec*, char *);
  201. static void alertHand(TlsRec*, char *);
  202. static TlsRec *newtls(Chan *c);
  203. static TlsRec *mktlsrec(void);
  204. static DigestState*sslmac_md5(uint8_t *p, uint32_t len, uint8_t *key,
  205. uint32_t klen, uint8_t *digest, DigestState *s);
  206. static DigestState*sslmac_sha1(uint8_t *p, uint32_t len, uint8_t *key,
  207. uint32_t klen, uint8_t *digest,
  208. DigestState *s);
  209. static DigestState*nomac(uint8_t *p, uint32_t len, uint8_t *key,
  210. uint32_t klen,
  211. uint8_t *digest, DigestState *s);
  212. static void sslPackMac(Secret *sec, uint8_t *mackey, uint8_t *seq,
  213. uint8_t *header, uint8_t *body, int len,
  214. uint8_t *mac);
  215. static void tlsPackMac(Secret *sec, uint8_t *mackey, uint8_t *seq,
  216. uint8_t *header, uint8_t *body, int len,
  217. uint8_t *mac);
  218. static void put64(uint8_t *p, int64_t x);
  219. static void put32(uint8_t *p, uint32_t);
  220. static void put24(uint8_t *p, int);
  221. static void put16(uint8_t *p, int);
  222. //static uint32_t get32(uint8_t *p);
  223. static int get16(uint8_t *p);
  224. static void tlsSetState(TlsRec *tr, int new, int old);
  225. static void rcvAlert(TlsRec *tr, int err);
  226. static void sendAlert(TlsRec *tr, int err);
  227. static void rcvError(TlsRec *tr, int err, char *msg, ...);
  228. static int rc4enc(Secret *sec, uint8_t *buf, int n);
  229. static int des3enc(Secret *sec, uint8_t *buf, int n);
  230. static int des3dec(Secret *sec, uint8_t *buf, int n);
  231. static int noenc(Secret *sec, uint8_t *buf, int n);
  232. static int sslunpad(uint8_t *buf, int n, int block);
  233. static int tlsunpad(uint8_t *buf, int n, int block);
  234. static void freeSec(Secret *sec);
  235. static char *tlsstate(int s);
  236. static void pdump(int, void*, char*);
  237. #pragma varargck argpos rcvError 3
  238. static char *tlsnames[] = {
  239. [Qclonus] = "clone",
  240. [Qencalgs] = "encalgs",
  241. [Qhashalgs] = "hashalgs",
  242. [Qdata] = "data",
  243. [Qctl] = "ctl",
  244. [Qhand] = "hand",
  245. [Qstatus] = "status",
  246. [Qstats] = "stats",
  247. };
  248. static int convdir[] = { Qctl, Qdata, Qhand, Qstatus, Qstats };
  249. static int
  250. tlsgen(Chan *c, char* d, Dirtab *dir, int j, int s, Dir *dp)
  251. {
  252. Qid q;
  253. TlsRec *tr;
  254. char *name, *nm;
  255. int perm, t;
  256. q.vers = 0;
  257. q.type = QTFILE;
  258. t = TYPE(c->qid);
  259. switch(t) {
  260. case Qtopdir:
  261. if(s == DEVDOTDOT){
  262. q.path = QID(0, Qtopdir);
  263. q.type = QTDIR;
  264. devdir(c, q, "#a", 0, eve, 0555, dp);
  265. return 1;
  266. }
  267. if(s > 0)
  268. return -1;
  269. q.path = QID(0, Qprotodir);
  270. q.type = QTDIR;
  271. devdir(c, q, "tls", 0, eve, 0555, dp);
  272. return 1;
  273. case Qprotodir:
  274. if(s == DEVDOTDOT){
  275. q.path = QID(0, Qtopdir);
  276. q.type = QTDIR;
  277. devdir(c, q, ".", 0, eve, 0555, dp);
  278. return 1;
  279. }
  280. if(s < 3){
  281. switch(s) {
  282. default:
  283. return -1;
  284. case 0:
  285. q.path = QID(0, Qclonus);
  286. break;
  287. case 1:
  288. q.path = QID(0, Qencalgs);
  289. break;
  290. case 2:
  291. q.path = QID(0, Qhashalgs);
  292. break;
  293. }
  294. perm = 0444;
  295. if(TYPE(q) == Qclonus)
  296. perm = 0555;
  297. devdir(c, q, tlsnames[TYPE(q)], 0, eve, perm, dp);
  298. return 1;
  299. }
  300. s -= 3;
  301. if(s >= tdhiwat)
  302. return -1;
  303. q.path = QID(s, Qconvdir);
  304. q.type = QTDIR;
  305. lock(&tdlock);
  306. tr = tlsdevs[s];
  307. if(tr != nil)
  308. nm = tr->user;
  309. else
  310. nm = eve;
  311. if((name = trnames[s]) == nil){
  312. name = trnames[s] = smalloc(16);
  313. sprint(name, "%d", s);
  314. }
  315. devdir(c, q, name, 0, nm, 0555, dp);
  316. unlock(&tdlock);
  317. return 1;
  318. case Qconvdir:
  319. if(s == DEVDOTDOT){
  320. q.path = QID(0, Qprotodir);
  321. q.type = QTDIR;
  322. devdir(c, q, "tls", 0, eve, 0555, dp);
  323. return 1;
  324. }
  325. if(s < 0 || s >= nelem(convdir))
  326. return -1;
  327. lock(&tdlock);
  328. tr = tlsdevs[CONV(c->qid)];
  329. if(tr != nil){
  330. nm = tr->user;
  331. perm = tr->perm;
  332. }else{
  333. perm = 0;
  334. nm = eve;
  335. }
  336. t = convdir[s];
  337. if(t == Qstatus || t == Qstats)
  338. perm &= 0444;
  339. q.path = QID(CONV(c->qid), t);
  340. devdir(c, q, tlsnames[t], 0, nm, perm, dp);
  341. unlock(&tdlock);
  342. return 1;
  343. case Qclonus:
  344. case Qencalgs:
  345. case Qhashalgs:
  346. perm = 0444;
  347. if(t == Qclonus)
  348. perm = 0555;
  349. devdir(c, c->qid, tlsnames[t], 0, eve, perm, dp);
  350. return 1;
  351. default:
  352. lock(&tdlock);
  353. tr = tlsdevs[CONV(c->qid)];
  354. if(tr != nil){
  355. nm = tr->user;
  356. perm = tr->perm;
  357. }else{
  358. perm = 0;
  359. nm = eve;
  360. }
  361. if(t == Qstatus || t == Qstats)
  362. perm &= 0444;
  363. devdir(c, c->qid, tlsnames[t], 0, nm, perm, dp);
  364. unlock(&tdlock);
  365. return 1;
  366. }
  367. }
  368. static Chan*
  369. tlsattach(char *spec)
  370. {
  371. Chan *c;
  372. c = devattach('a', spec);
  373. c->qid.path = QID(0, Qtopdir);
  374. c->qid.type = QTDIR;
  375. c->qid.vers = 0;
  376. return c;
  377. }
  378. static Walkqid*
  379. tlswalk(Chan *c, Chan *nc, char **name, int nname)
  380. {
  381. return devwalk(c, nc, name, nname, nil, 0, tlsgen);
  382. }
  383. static int32_t
  384. tlsstat(Chan *c, uint8_t *db, int32_t n)
  385. {
  386. return devstat(c, db, n, nil, 0, tlsgen);
  387. }
  388. static Chan*
  389. tlsopen(Chan *c, int omode)
  390. {
  391. Proc *up = externup();
  392. TlsRec *tr, **pp;
  393. int t, perm;
  394. perm = 0;
  395. omode &= 3;
  396. switch(omode) {
  397. case OREAD:
  398. perm = 4;
  399. break;
  400. case OWRITE:
  401. perm = 2;
  402. break;
  403. case ORDWR:
  404. perm = 6;
  405. break;
  406. }
  407. t = TYPE(c->qid);
  408. switch(t) {
  409. default:
  410. panic("tlsopen");
  411. case Qtopdir:
  412. case Qprotodir:
  413. case Qconvdir:
  414. if(omode != OREAD)
  415. error(Eperm);
  416. break;
  417. case Qclonus:
  418. tr = newtls(c);
  419. if(tr == nil)
  420. error(Enodev);
  421. break;
  422. case Qctl:
  423. case Qdata:
  424. case Qhand:
  425. case Qstatus:
  426. case Qstats:
  427. if((t == Qstatus || t == Qstats) && omode != OREAD)
  428. error(Eperm);
  429. if(waserror()) {
  430. unlock(&tdlock);
  431. nexterror();
  432. }
  433. lock(&tdlock);
  434. pp = &tlsdevs[CONV(c->qid)];
  435. tr = *pp;
  436. if(tr == nil)
  437. error("must open connection using clone");
  438. if((perm & (tr->perm>>6)) != perm
  439. && (strcmp(up->user, tr->user) != 0
  440. || (perm & tr->perm) != perm))
  441. error(Eperm);
  442. if(t == Qhand){
  443. if(waserror()){
  444. unlock(&tr->hqlock);
  445. nexterror();
  446. }
  447. lock(&tr->hqlock);
  448. if(tr->handq != nil)
  449. error(Einuse);
  450. tr->handq = qopen(2 * MaxCipherRecLen, 0, nil, nil);
  451. if(tr->handq == nil)
  452. error("cannot allocate handshake queue");
  453. tr->hqref = 1;
  454. unlock(&tr->hqlock);
  455. poperror();
  456. }
  457. tr->ref++;
  458. unlock(&tdlock);
  459. poperror();
  460. break;
  461. case Qencalgs:
  462. case Qhashalgs:
  463. if(omode != OREAD)
  464. error(Eperm);
  465. break;
  466. }
  467. c->mode = openmode(omode);
  468. c->flag |= COPEN;
  469. c->offset = 0;
  470. c->iounit = qiomaxatomic;
  471. return c;
  472. }
  473. static int32_t
  474. tlswstat(Chan *c, uint8_t *dp, int32_t n)
  475. {
  476. Proc *up = externup();
  477. Dir *d;
  478. TlsRec *tr;
  479. int rv;
  480. d = nil;
  481. if(waserror()){
  482. free(d);
  483. unlock(&tdlock);
  484. nexterror();
  485. }
  486. lock(&tdlock);
  487. tr = tlsdevs[CONV(c->qid)];
  488. if(tr == nil)
  489. error(Ebadusefd);
  490. if(strcmp(tr->user, up->user) != 0)
  491. error(Eperm);
  492. d = smalloc(n + sizeof *d);
  493. rv = convM2D(dp, n, &d[0], (char*) &d[1]);
  494. if(rv == 0)
  495. error(Eshortstat);
  496. if(!emptystr(d->uid))
  497. kstrdup(&tr->user, d->uid);
  498. if(d->mode != (uint32_t)~0UL)
  499. tr->perm = d->mode;
  500. free(d);
  501. poperror();
  502. unlock(&tdlock);
  503. return rv;
  504. }
  505. static void
  506. dechandq(TlsRec *tr)
  507. {
  508. lock(&tr->hqlock);
  509. if(--tr->hqref == 0){
  510. if(tr->handq != nil){
  511. qfree(tr->handq);
  512. tr->handq = nil;
  513. }
  514. if(tr->hprocessed != nil){
  515. freeb(tr->hprocessed);
  516. tr->hprocessed = nil;
  517. }
  518. }
  519. unlock(&tr->hqlock);
  520. }
  521. static void
  522. tlsclose(Chan *c)
  523. {
  524. Proc *up = externup();
  525. TlsRec *tr;
  526. int t;
  527. t = TYPE(c->qid);
  528. switch(t) {
  529. case Qctl:
  530. case Qdata:
  531. case Qhand:
  532. case Qstatus:
  533. case Qstats:
  534. if((c->flag & COPEN) == 0)
  535. break;
  536. tr = tlsdevs[CONV(c->qid)];
  537. if(tr == nil)
  538. break;
  539. if(t == Qhand)
  540. dechandq(tr);
  541. lock(&tdlock);
  542. if(--tr->ref > 0) {
  543. unlock(&tdlock);
  544. return;
  545. }
  546. tlsdevs[CONV(c->qid)] = nil;
  547. unlock(&tdlock);
  548. if(tr->c != nil && !waserror()){
  549. checkstate(tr, 0, SOpen|SHandshake|SRClose);
  550. sendAlert(tr, ECloseNotify);
  551. poperror();
  552. }
  553. tlshangup(tr);
  554. if(tr->c != nil)
  555. cclose(tr->c);
  556. freeSec(tr->in.sec);
  557. freeSec(tr->in.new);
  558. freeSec(tr->out.sec);
  559. freeSec(tr->out.new);
  560. free(tr->user);
  561. free(tr);
  562. break;
  563. }
  564. }
  565. /*
  566. * make sure we have at least 'n' bytes in list 'l'
  567. */
  568. static void
  569. ensure(TlsRec *s, Block **l, int n)
  570. {
  571. int sofar, i;
  572. Block *b, *bl;
  573. sofar = 0;
  574. for(b = *l; b; b = b->next){
  575. sofar += BLEN(b);
  576. if(sofar >= n)
  577. return;
  578. l = &b->next;
  579. }
  580. while(sofar < n){
  581. bl = s->c->dev->bread(s->c, MaxCipherRecLen + RecHdrLen, 0);
  582. if(bl == 0)
  583. error(Ehungup);
  584. *l = bl;
  585. i = 0;
  586. for(b = bl; b; b = b->next){
  587. i += BLEN(b);
  588. l = &b->next;
  589. }
  590. if(i == 0)
  591. error(Ehungup);
  592. sofar += i;
  593. }
  594. if(s->debug) pprint("ensure read %d\n", sofar);
  595. }
  596. /*
  597. * copy 'n' bytes from 'l' into 'p' and free
  598. * the bytes in 'l'
  599. */
  600. static void
  601. consume(Block **l, uint8_t *p, int n)
  602. {
  603. Block *b;
  604. int i;
  605. for(; *l && n > 0; n -= i){
  606. b = *l;
  607. i = BLEN(b);
  608. if(i > n)
  609. i = n;
  610. memmove(p, b->rp, i);
  611. b->rp += i;
  612. p += i;
  613. if(BLEN(b) < 0)
  614. panic("consume");
  615. if(BLEN(b))
  616. break;
  617. *l = b->next;
  618. freeb(b);
  619. }
  620. }
  621. /*
  622. * give back n bytes
  623. */
  624. static void
  625. regurgitate(TlsRec *s, uint8_t *p, int n)
  626. {
  627. Block *b;
  628. if(n <= 0)
  629. return;
  630. b = s->unprocessed;
  631. if(s->unprocessed == nil || b->rp - b->base < n) {
  632. b = allocb(n);
  633. memmove(b->wp, p, n);
  634. b->wp += n;
  635. b->next = s->unprocessed;
  636. s->unprocessed = b;
  637. } else {
  638. b->rp -= n;
  639. memmove(b->rp, p, n);
  640. }
  641. }
  642. /*
  643. * remove at most n bytes from the queue
  644. */
  645. static Block*
  646. qgrab(Block **l, int n)
  647. {
  648. Block *bb, *b;
  649. int i;
  650. b = *l;
  651. if(BLEN(b) == n){
  652. *l = b->next;
  653. b->next = nil;
  654. return b;
  655. }
  656. i = 0;
  657. for(bb = b; bb != nil && i < n; bb = bb->next)
  658. i += BLEN(bb);
  659. if(i > n)
  660. i = n;
  661. bb = allocb(i);
  662. consume(l, bb->wp, i);
  663. bb->wp += i;
  664. return bb;
  665. }
  666. static void
  667. tlsclosed(TlsRec *tr, int new)
  668. {
  669. lock(&tr->statelk);
  670. if(tr->state == SOpen || tr->state == SHandshake)
  671. tr->state = new;
  672. else if((new | tr->state) == (SRClose|SLClose))
  673. tr->state = SClosed;
  674. unlock(&tr->statelk);
  675. alertHand(tr, "close notify");
  676. }
  677. /*
  678. * read and process one tls record layer message
  679. * must be called with tr->in.io held
  680. * We can't let Eintrs lose data, since doing so will get
  681. * us out of sync with the sender and break the reliablity
  682. * of the channel. Eintr only happens during the reads in
  683. * consume. Therefore we put back any bytes consumed before
  684. * the last call to ensure.
  685. */
  686. static void
  687. tlsrecread(TlsRec *tr)
  688. {
  689. Proc *up = externup();
  690. OneWay *volatile in;
  691. Block *volatile b;
  692. uint8_t *p, seq[8], header[RecHdrLen], hmac[MD5dlen];
  693. int volatile nconsumed;
  694. int len, type, ver, unpad_len;
  695. nconsumed = 0;
  696. if(waserror()){
  697. if(strcmp(up->errstr, Eintr) == 0 && !waserror()){
  698. regurgitate(tr, header, nconsumed);
  699. poperror();
  700. }else
  701. tlsError(tr, "channel error");
  702. nexterror();
  703. }
  704. ensure(tr, &tr->unprocessed, RecHdrLen);
  705. consume(&tr->unprocessed, header, RecHdrLen);
  706. if(tr->debug)pprint("consumed %d header\n", RecHdrLen);
  707. nconsumed = RecHdrLen;
  708. if((tr->handin == 0) && (header[0] & 0x80)){
  709. /* Cope with an SSL3 ClientHello expressed in SSL2 record format.
  710. This is sent by some clients that we must interoperate
  711. with, such as Java's JSSE and Microsoft's Internet Explorer. */
  712. len = (get16(header) & ~0x8000) - 3;
  713. type = header[2];
  714. ver = get16(header + 3);
  715. if(type != SSL2ClientHello || len < 22)
  716. rcvError(tr, EProtocolVersion, "invalid initial SSL2-like message");
  717. }else{ /* normal SSL3 record format */
  718. type = header[0];
  719. ver = get16(header+1);
  720. len = get16(header+3);
  721. }
  722. if(ver != tr->version && (tr->verset || ver < MinProtoVersion || ver > MaxProtoVersion))
  723. rcvError(tr, EProtocolVersion, "devtls expected ver=%x%s, saw (len=%d) type=%x ver=%x '%.12s'",
  724. tr->version, tr->verset?"/set":"", len, type, ver,
  725. (char*)header);
  726. if(len > MaxCipherRecLen || len < 0)
  727. rcvError(tr, ERecordOverflow, "record message too long %d", len);
  728. ensure(tr, &tr->unprocessed, len);
  729. nconsumed = 0;
  730. poperror();
  731. /*
  732. * If an Eintr happens after this, we'll get out of sync.
  733. * Make sure nothing we call can sleep.
  734. * Errors are ok, as they kill the connection.
  735. * Luckily, allocb won't sleep, it'll just error out.
  736. */
  737. b = nil;
  738. if(waserror()){
  739. if(b != nil)
  740. freeb(b);
  741. tlsError(tr, "channel error");
  742. nexterror();
  743. }
  744. b = qgrab(&tr->unprocessed, len);
  745. if(tr->debug) pprint("consumed unprocessed %d\n", len);
  746. in = &tr->in;
  747. if(waserror()){
  748. qunlock(&in->seclock);
  749. nexterror();
  750. }
  751. qlock(&in->seclock);
  752. p = b->rp;
  753. if(in->sec != nil) {
  754. /* to avoid Canvel-Hiltgen-Vaudenay-Vuagnoux attack, all errors here
  755. should look alike, including timing of the response. */
  756. unpad_len = (*in->sec->dec)(in->sec, p, len);
  757. if(unpad_len >= in->sec->maclen)
  758. len = unpad_len - in->sec->maclen;
  759. if(tr->debug) pprint("decrypted %d\n", unpad_len);
  760. if(tr->debug) pdump(unpad_len, p, "decrypted:");
  761. /* update length */
  762. put16(header+3, len);
  763. put64(seq, in->seq);
  764. in->seq++;
  765. (*tr->packMac)(in->sec, in->sec->mackey, seq, header, p, len, hmac);
  766. if(unpad_len < in->sec->maclen)
  767. rcvError(tr, EBadRecordMac, "short record mac");
  768. if(memcmp(hmac, p+len, in->sec->maclen) != 0)
  769. rcvError(tr, EBadRecordMac, "record mac mismatch");
  770. b->wp = b->rp + len;
  771. }
  772. qunlock(&in->seclock);
  773. poperror();
  774. if(len < 0)
  775. rcvError(tr, EDecodeError, "runt record message");
  776. switch(type) {
  777. default:
  778. rcvError(tr, EIllegalParameter, "invalid record message %#x", type);
  779. break;
  780. case RChangeCipherSpec:
  781. if(len != 1 || p[0] != 1)
  782. rcvError(tr, EDecodeError, "invalid change cipher spec");
  783. qlock(&in->seclock);
  784. if(in->new == nil){
  785. qunlock(&in->seclock);
  786. rcvError(tr, EUnexpectedMessage, "unexpected change cipher spec");
  787. }
  788. freeSec(in->sec);
  789. in->sec = in->new;
  790. in->new = nil;
  791. in->seq = 0;
  792. qunlock(&in->seclock);
  793. break;
  794. case RAlert:
  795. if(len != 2)
  796. rcvError(tr, EDecodeError, "invalid alert");
  797. if(p[0] == 2)
  798. rcvAlert(tr, p[1]);
  799. if(p[0] != 1)
  800. rcvError(tr, EIllegalParameter, "invalid alert fatal code");
  801. /*
  802. * propate non-fatal alerts to handshaker
  803. */
  804. if(p[1] == ECloseNotify) {
  805. tlsclosed(tr, SRClose);
  806. if(tr->opened)
  807. error("tls hungup");
  808. error("close notify");
  809. }
  810. if(p[1] == ENoRenegotiation)
  811. alertHand(tr, "no renegotiation");
  812. else if(p[1] == EUserCanceled)
  813. alertHand(tr, "handshake canceled by user");
  814. else
  815. rcvError(tr, EIllegalParameter, "invalid alert code");
  816. break;
  817. case RHandshake:
  818. /*
  819. * don't worry about dropping the block
  820. * qbwrite always queues even if flow controlled and interrupted.
  821. *
  822. * if there isn't any handshaker, ignore the request,
  823. * but notify the other side we are doing so.
  824. */
  825. lock(&tr->hqlock);
  826. if(tr->handq != nil){
  827. tr->hqref++;
  828. unlock(&tr->hqlock);
  829. if(waserror()){
  830. dechandq(tr);
  831. nexterror();
  832. }
  833. b = padblock(b, 1);
  834. *b->rp = RHandshake;
  835. qbwrite(tr->handq, b);
  836. b = nil;
  837. poperror();
  838. dechandq(tr);
  839. }else{
  840. unlock(&tr->hqlock);
  841. if(tr->verset && tr->version != SSL3Version && !waserror()){
  842. sendAlert(tr, ENoRenegotiation);
  843. poperror();
  844. }
  845. }
  846. break;
  847. case SSL2ClientHello:
  848. lock(&tr->hqlock);
  849. if(tr->handq != nil){
  850. tr->hqref++;
  851. unlock(&tr->hqlock);
  852. if(waserror()){
  853. dechandq(tr);
  854. nexterror();
  855. }
  856. /* Pass the SSL2 format data, so that the handshake code can compute
  857. the correct checksums. HSSL2ClientHello = HandshakeType 9 is
  858. unused in RFC2246. */
  859. b = padblock(b, 8);
  860. b->rp[0] = RHandshake;
  861. b->rp[1] = HSSL2ClientHello;
  862. put24(&b->rp[2], len+3);
  863. b->rp[5] = SSL2ClientHello;
  864. put16(&b->rp[6], ver);
  865. qbwrite(tr->handq, b);
  866. b = nil;
  867. poperror();
  868. dechandq(tr);
  869. }else{
  870. unlock(&tr->hqlock);
  871. if(tr->verset && tr->version != SSL3Version && !waserror()){
  872. sendAlert(tr, ENoRenegotiation);
  873. poperror();
  874. }
  875. }
  876. break;
  877. case RApplication:
  878. if(!tr->opened)
  879. rcvError(tr, EUnexpectedMessage, "application message received before handshake completed");
  880. if(BLEN(b) > 0){
  881. tr->processed = b;
  882. b = nil;
  883. }
  884. break;
  885. }
  886. if(b != nil)
  887. freeb(b);
  888. poperror();
  889. }
  890. /*
  891. * got a fatal alert message
  892. */
  893. static void
  894. rcvAlert(TlsRec *tr, int err)
  895. {
  896. char *s;
  897. int i;
  898. s = "unknown error";
  899. for(i=0; i < nelem(tlserrs); i++){
  900. if(tlserrs[i].err == err){
  901. s = tlserrs[i].msg;
  902. break;
  903. }
  904. }
  905. if(tr->debug) pprint("rcvAlert: %s\n", s);
  906. tlsError(tr, s);
  907. if(!tr->opened)
  908. error(s);
  909. error("tls error");
  910. }
  911. /*
  912. * found an error while decoding the input stream
  913. */
  914. static void
  915. rcvError(TlsRec *tr, int err, char *fmt, ...)
  916. {
  917. char msg[ERRMAX];
  918. va_list arg;
  919. va_start(arg, fmt);
  920. vseprint(msg, msg+sizeof(msg), fmt, arg);
  921. va_end(arg);
  922. if(tr->debug) pprint("rcvError: %s\n", msg);
  923. sendAlert(tr, err);
  924. if(!tr->opened)
  925. error(msg);
  926. error("tls error");
  927. }
  928. /*
  929. * make sure the next hand operation returns with a 'msg' error
  930. */
  931. static void
  932. alertHand(TlsRec *tr, char *msg)
  933. {
  934. Proc *up = externup();
  935. Block *b;
  936. int n;
  937. lock(&tr->hqlock);
  938. if(tr->handq == nil){
  939. unlock(&tr->hqlock);
  940. return;
  941. }
  942. tr->hqref++;
  943. unlock(&tr->hqlock);
  944. n = strlen(msg);
  945. if(waserror()){
  946. dechandq(tr);
  947. nexterror();
  948. }
  949. b = allocb(n + 2);
  950. *b->wp++ = RAlert;
  951. memmove(b->wp, msg, n + 1);
  952. b->wp += n + 1;
  953. qbwrite(tr->handq, b);
  954. poperror();
  955. dechandq(tr);
  956. }
  957. static void
  958. checkstate(TlsRec *tr, int ishand, int ok)
  959. {
  960. int state;
  961. lock(&tr->statelk);
  962. state = tr->state;
  963. unlock(&tr->statelk);
  964. if(state & ok)
  965. return;
  966. switch(state){
  967. case SHandshake:
  968. case SOpen:
  969. break;
  970. case SError:
  971. case SAlert:
  972. if(ishand)
  973. error(tr->err);
  974. error("tls error");
  975. case SRClose:
  976. case SLClose:
  977. case SClosed:
  978. error("tls hungup");
  979. }
  980. error("tls improperly configured");
  981. }
  982. static Block*
  983. tlsbread(Chan *c, int32_t n, int64_t offset)
  984. {
  985. Proc *up = externup();
  986. int ty;
  987. Block *b;
  988. TlsRec *volatile tr;
  989. ty = TYPE(c->qid);
  990. switch(ty) {
  991. default:
  992. return devbread(c, n, offset);
  993. case Qhand:
  994. case Qdata:
  995. break;
  996. }
  997. tr = tlsdevs[CONV(c->qid)];
  998. if(tr == nil)
  999. panic("tlsbread");
  1000. if(waserror()){
  1001. qunlock(&tr->in.io);
  1002. nexterror();
  1003. }
  1004. qlock(&tr->in.io);
  1005. if(ty == Qdata){
  1006. checkstate(tr, 0, SOpen);
  1007. while(tr->processed == nil)
  1008. tlsrecread(tr);
  1009. /* return at most what was asked for */
  1010. b = qgrab(&tr->processed, n);
  1011. if(tr->debug) pprint("consumed processed %ld\n", BLEN(b));
  1012. if(tr->debug) pdump(BLEN(b), b->rp, "consumed:");
  1013. qunlock(&tr->in.io);
  1014. poperror();
  1015. tr->datain += BLEN(b);
  1016. }else{
  1017. checkstate(tr, 1, SOpen|SHandshake|SLClose);
  1018. /*
  1019. * it's ok to look at state without the lock
  1020. * since it only protects reading records,
  1021. * and we have that tr->in.io held.
  1022. */
  1023. while(!tr->opened && tr->hprocessed == nil && !qcanread(tr->handq))
  1024. tlsrecread(tr);
  1025. qunlock(&tr->in.io);
  1026. poperror();
  1027. if(waserror()){
  1028. qunlock(&tr->hqread);
  1029. nexterror();
  1030. }
  1031. qlock(&tr->hqread);
  1032. if(tr->hprocessed == nil){
  1033. b = qbread(tr->handq, MaxRecLen + 1);
  1034. if(*b->rp++ == RAlert){
  1035. kstrcpy(up->errstr, (char*)b->rp, ERRMAX);
  1036. freeb(b);
  1037. nexterror();
  1038. }
  1039. tr->hprocessed = b;
  1040. }
  1041. b = qgrab(&tr->hprocessed, n);
  1042. poperror();
  1043. qunlock(&tr->hqread);
  1044. tr->handin += BLEN(b);
  1045. }
  1046. return b;
  1047. }
  1048. static int32_t
  1049. tlsread(Chan *c, void *a, int32_t n, int64_t off)
  1050. {
  1051. Proc *up = externup();
  1052. Block *volatile b;
  1053. Block *nb;
  1054. uint8_t *va;
  1055. int i, ty;
  1056. char *buf, *s, *e;
  1057. int32_t offset;
  1058. TlsRec * tr;
  1059. if(c->qid.type & QTDIR)
  1060. return devdirread(c, a, n, 0, 0, tlsgen);
  1061. offset = off;
  1062. tr = tlsdevs[CONV(c->qid)];
  1063. ty = TYPE(c->qid);
  1064. switch(ty) {
  1065. default:
  1066. error(Ebadusefd);
  1067. case Qstatus:
  1068. buf = smalloc(Statlen);
  1069. qlock(&tr->in.seclock);
  1070. qlock(&tr->out.seclock);
  1071. s = buf;
  1072. e = buf + Statlen;
  1073. s = seprint(s, e, "State: %s\n", tlsstate(tr->state));
  1074. s = seprint(s, e, "Version: %#x\n", tr->version);
  1075. if(tr->in.sec != nil)
  1076. s = seprint(s, e, "EncIn: %s\nHashIn: %s\n", tr->in.sec->encalg, tr->in.sec->hashalg);
  1077. if(tr->in.new != nil)
  1078. s = seprint(s, e, "NewEncIn: %s\nNewHashIn: %s\n", tr->in.new->encalg, tr->in.new->hashalg);
  1079. if(tr->out.sec != nil)
  1080. s = seprint(s, e, "EncOut: %s\nHashOut: %s\n", tr->out.sec->encalg, tr->out.sec->hashalg);
  1081. if(tr->out.new != nil)
  1082. seprint(s, e, "NewEncOut: %s\nNewHashOut: %s\n", tr->out.new->encalg, tr->out.new->hashalg);
  1083. qunlock(&tr->in.seclock);
  1084. qunlock(&tr->out.seclock);
  1085. n = readstr(offset, a, n, buf);
  1086. free(buf);
  1087. return n;
  1088. case Qstats:
  1089. buf = smalloc(Statlen);
  1090. s = buf;
  1091. e = buf + Statlen;
  1092. s = seprint(s, e, "DataIn: %lld\n", tr->datain);
  1093. s = seprint(s, e, "DataOut: %lld\n", tr->dataout);
  1094. s = seprint(s, e, "HandIn: %lld\n", tr->handin);
  1095. seprint(s, e, "HandOut: %lld\n", tr->handout);
  1096. n = readstr(offset, a, n, buf);
  1097. free(buf);
  1098. return n;
  1099. case Qctl:
  1100. buf = smalloc(Statlen);
  1101. snprint(buf, Statlen, "%llu", CONV(c->qid));
  1102. n = readstr(offset, a, n, buf);
  1103. free(buf);
  1104. return n;
  1105. case Qdata:
  1106. case Qhand:
  1107. b = tlsbread(c, n, offset);
  1108. break;
  1109. case Qencalgs:
  1110. return readstr(offset, a, n, encalgs);
  1111. case Qhashalgs:
  1112. return readstr(offset, a, n, hashalgs);
  1113. }
  1114. if(waserror()){
  1115. freeblist(b);
  1116. nexterror();
  1117. }
  1118. n = 0;
  1119. va = a;
  1120. for(nb = b; nb; nb = nb->next){
  1121. i = BLEN(nb);
  1122. memmove(va+n, nb->rp, i);
  1123. n += i;
  1124. }
  1125. freeblist(b);
  1126. poperror();
  1127. return n;
  1128. }
  1129. /*
  1130. * write a block in tls records
  1131. */
  1132. static void
  1133. tlsrecwrite(TlsRec *tr, int type, Block *b)
  1134. {
  1135. Proc *up = externup();
  1136. Block *volatile bb;
  1137. Block *nb;
  1138. uint8_t *p, seq[8];
  1139. OneWay *volatile out;
  1140. int n, maclen, pad, ok;
  1141. out = &tr->out;
  1142. bb = b;
  1143. if(waserror()){
  1144. qunlock(&out->io);
  1145. if(bb != nil)
  1146. freeb(bb);
  1147. nexterror();
  1148. }
  1149. qlock(&out->io);
  1150. if(tr->debug)pprint("send %ld\n", BLEN(b));
  1151. if(tr->debug)pdump(BLEN(b), b->rp, "sent:");
  1152. ok = SHandshake|SOpen|SRClose;
  1153. if(type == RAlert)
  1154. ok |= SAlert;
  1155. while(bb != nil){
  1156. checkstate(tr, type != RApplication, ok);
  1157. /*
  1158. * get at most one maximal record's input,
  1159. * with padding on the front for header and
  1160. * back for mac and maximal block padding.
  1161. */
  1162. if(waserror()){
  1163. qunlock(&out->seclock);
  1164. nexterror();
  1165. }
  1166. qlock(&out->seclock);
  1167. maclen = 0;
  1168. pad = 0;
  1169. if(out->sec != nil){
  1170. maclen = out->sec->maclen;
  1171. pad = maclen + out->sec->block;
  1172. }
  1173. n = BLEN(bb);
  1174. if(n > MaxRecLen){
  1175. n = MaxRecLen;
  1176. nb = allocb(n + pad + RecHdrLen);
  1177. memmove(nb->wp + RecHdrLen, bb->rp, n);
  1178. bb->rp += n;
  1179. }else{
  1180. /*
  1181. * carefully reuse bb so it will get freed if we're out of memory
  1182. */
  1183. bb = padblock(bb, RecHdrLen);
  1184. if(pad)
  1185. nb = padblock(bb, -pad);
  1186. else
  1187. nb = bb;
  1188. bb = nil;
  1189. }
  1190. p = nb->rp;
  1191. p[0] = type;
  1192. put16(p+1, tr->version);
  1193. put16(p+3, n);
  1194. if(out->sec != nil){
  1195. put64(seq, out->seq);
  1196. out->seq++;
  1197. (*tr->packMac)(out->sec, out->sec->mackey, seq, p, p + RecHdrLen, n, p + RecHdrLen + n);
  1198. n += maclen;
  1199. /* encrypt */
  1200. n = (*out->sec->enc)(out->sec, p + RecHdrLen, n);
  1201. nb->wp = p + RecHdrLen + n;
  1202. /* update length */
  1203. put16(p+3, n);
  1204. }
  1205. if(type == RChangeCipherSpec){
  1206. if(out->new == nil)
  1207. error("change cipher without a new cipher");
  1208. freeSec(out->sec);
  1209. out->sec = out->new;
  1210. out->new = nil;
  1211. out->seq = 0;
  1212. }
  1213. qunlock(&out->seclock);
  1214. poperror();
  1215. /*
  1216. * if bwrite error's, we assume the block is queued.
  1217. * if not, we're out of sync with the receiver and will not recover.
  1218. */
  1219. if(waserror()){
  1220. if(strcmp(up->errstr, "interrupted") != 0)
  1221. tlsError(tr, "channel error");
  1222. nexterror();
  1223. }
  1224. tr->c->dev->bwrite(tr->c, nb, 0);
  1225. poperror();
  1226. }
  1227. qunlock(&out->io);
  1228. poperror();
  1229. }
  1230. static int32_t
  1231. tlsbwrite(Chan *c, Block *b, int64_t offset)
  1232. {
  1233. int ty;
  1234. uint32_t n;
  1235. TlsRec *tr;
  1236. n = BLEN(b);
  1237. tr = tlsdevs[CONV(c->qid)];
  1238. if(tr == nil)
  1239. panic("tlsbread");
  1240. ty = TYPE(c->qid);
  1241. switch(ty) {
  1242. default:
  1243. return devbwrite(c, b, offset);
  1244. case Qhand:
  1245. tlsrecwrite(tr, RHandshake, b);
  1246. tr->handout += n;
  1247. break;
  1248. case Qdata:
  1249. checkstate(tr, 0, SOpen);
  1250. tlsrecwrite(tr, RApplication, b);
  1251. tr->dataout += n;
  1252. break;
  1253. }
  1254. return n;
  1255. }
  1256. typedef struct Hashalg Hashalg;
  1257. struct Hashalg
  1258. {
  1259. char *name;
  1260. int maclen;
  1261. void (*initkey)(Hashalg *, int, Secret *, uint8_t*);
  1262. };
  1263. static void
  1264. initmd5key(Hashalg *ha, int version, Secret *s, uint8_t *p)
  1265. {
  1266. s->maclen = ha->maclen;
  1267. if(version == SSL3Version)
  1268. s->mac = sslmac_md5;
  1269. else
  1270. s->mac = hmac_md5;
  1271. memmove(s->mackey, p, ha->maclen);
  1272. }
  1273. static void
  1274. initclearmac(Hashalg *ha, int version, Secret *s, uint8_t *p)
  1275. {
  1276. s->maclen = 0;
  1277. s->mac = nomac;
  1278. }
  1279. static void
  1280. initsha1key(Hashalg *ha, int version, Secret *s, uint8_t *p)
  1281. {
  1282. s->maclen = ha->maclen;
  1283. if(version == SSL3Version)
  1284. s->mac = sslmac_sha1;
  1285. else
  1286. s->mac = hmac_sha1;
  1287. memmove(s->mackey, p, ha->maclen);
  1288. }
  1289. static Hashalg hashtab[] =
  1290. {
  1291. { "clear", 0, initclearmac, },
  1292. { "md5", MD5dlen, initmd5key, },
  1293. { "sha1", SHA1dlen, initsha1key, },
  1294. { 0 }
  1295. };
  1296. static Hashalg*
  1297. parsehashalg(char *p)
  1298. {
  1299. Hashalg *ha;
  1300. for(ha = hashtab; ha->name; ha++)
  1301. if(strcmp(p, ha->name) == 0)
  1302. return ha;
  1303. error("unsupported hash algorithm");
  1304. return nil;
  1305. }
  1306. typedef struct Encalg Encalg;
  1307. struct Encalg
  1308. {
  1309. char *name;
  1310. int keylen;
  1311. int ivlen;
  1312. void (*initkey)(Encalg *ea, Secret *, uint8_t*, uint8_t*);
  1313. };
  1314. static void
  1315. initRC4key(Encalg *ea, Secret *s, uint8_t *p, uint8_t *iv)
  1316. {
  1317. s->enckey = smalloc(sizeof(RC4state));
  1318. s->enc = rc4enc;
  1319. s->dec = rc4enc;
  1320. s->block = 0;
  1321. setupRC4state(s->enckey, p, ea->keylen);
  1322. }
  1323. static void
  1324. initDES3key(Encalg *ea, Secret *s, uint8_t *p, uint8_t *iv)
  1325. {
  1326. s->enckey = smalloc(sizeof(DES3state));
  1327. s->enc = des3enc;
  1328. s->dec = des3dec;
  1329. s->block = 8;
  1330. setupDES3state(s->enckey, (uint8_t (*)[8])p, iv);
  1331. }
  1332. static void
  1333. initclearenc(Encalg *ea, Secret *s, uint8_t *p, uint8_t *iv)
  1334. {
  1335. s->enc = noenc;
  1336. s->dec = noenc;
  1337. s->block = 0;
  1338. }
  1339. static Encalg encrypttab[] =
  1340. {
  1341. { "clear", 0, 0, initclearenc },
  1342. { "rc4_128", 128/8, 0, initRC4key },
  1343. { "3des_ede_cbc", 3 * 8, 8, initDES3key },
  1344. { 0 }
  1345. };
  1346. static Encalg*
  1347. parseencalg(char *p)
  1348. {
  1349. Encalg *ea;
  1350. for(ea = encrypttab; ea->name; ea++)
  1351. if(strcmp(p, ea->name) == 0)
  1352. return ea;
  1353. error("unsupported encryption algorithm");
  1354. return nil;
  1355. }
  1356. static int32_t
  1357. tlswrite(Chan *c, void *a, int32_t n, int64_t off)
  1358. {
  1359. Proc *up = externup();
  1360. Encalg *ea;
  1361. Hashalg *ha;
  1362. TlsRec *volatile tr;
  1363. Secret *volatile tos, *volatile toc;
  1364. Block *volatile b;
  1365. Cmdbuf *volatile cb;
  1366. int m, ty;
  1367. char *p, *e;
  1368. uint8_t *volatile x;
  1369. uint32_t offset = off;
  1370. tr = tlsdevs[CONV(c->qid)];
  1371. if(tr == nil)
  1372. panic("tlswrite");
  1373. ty = TYPE(c->qid);
  1374. switch(ty){
  1375. case Qdata:
  1376. case Qhand:
  1377. p = a;
  1378. e = p + n;
  1379. do{
  1380. m = e - p;
  1381. if(m > MaxRecLen)
  1382. m = MaxRecLen;
  1383. b = allocb(m);
  1384. if(waserror()){
  1385. freeb(b);
  1386. nexterror();
  1387. }
  1388. memmove(b->wp, p, m);
  1389. poperror();
  1390. b->wp += m;
  1391. tlsbwrite(c, b, offset);
  1392. p += m;
  1393. }while(p < e);
  1394. return n;
  1395. case Qctl:
  1396. break;
  1397. default:
  1398. error(Ebadusefd);
  1399. return -1;
  1400. }
  1401. cb = parsecmd(a, n);
  1402. if(waserror()){
  1403. free(cb);
  1404. nexterror();
  1405. }
  1406. if(cb->nf < 1)
  1407. error("short control request");
  1408. /* mutex with operations using what we're about to change */
  1409. if(waserror()){
  1410. qunlock(&tr->in.seclock);
  1411. qunlock(&tr->out.seclock);
  1412. nexterror();
  1413. }
  1414. qlock(&tr->in.seclock);
  1415. qlock(&tr->out.seclock);
  1416. if(strcmp(cb->f[0], "fd") == 0){
  1417. if(cb->nf != 3)
  1418. error("usage: fd open-fd version");
  1419. if(tr->c != nil)
  1420. error(Einuse);
  1421. m = strtol(cb->f[2], nil, 0);
  1422. if(m < MinProtoVersion || m > MaxProtoVersion)
  1423. error("unsupported version");
  1424. tr->c = buftochan(cb->f[1]);
  1425. tr->version = m;
  1426. tlsSetState(tr, SHandshake, SClosed);
  1427. }else if(strcmp(cb->f[0], "version") == 0){
  1428. if(cb->nf != 2)
  1429. error("usage: version vers");
  1430. if(tr->c == nil)
  1431. error("must set fd before version");
  1432. if(tr->verset)
  1433. error("version already set");
  1434. m = strtol(cb->f[1], nil, 0);
  1435. if(m == SSL3Version)
  1436. tr->packMac = sslPackMac;
  1437. else if(m == TLSVersion)
  1438. tr->packMac = tlsPackMac;
  1439. else
  1440. error("unsupported version");
  1441. tr->verset = 1;
  1442. tr->version = m;
  1443. }else if(strcmp(cb->f[0], "secret") == 0){
  1444. if(cb->nf != 5)
  1445. error("usage: secret hashalg encalg isclient secretdata");
  1446. if(tr->c == nil || !tr->verset)
  1447. error("must set fd and version before secrets");
  1448. if(tr->in.new != nil){
  1449. freeSec(tr->in.new);
  1450. tr->in.new = nil;
  1451. }
  1452. if(tr->out.new != nil){
  1453. freeSec(tr->out.new);
  1454. tr->out.new = nil;
  1455. }
  1456. ha = parsehashalg(cb->f[1]);
  1457. ea = parseencalg(cb->f[2]);
  1458. p = cb->f[4];
  1459. m = (strlen(p)*3)/2;
  1460. x = smalloc(m);
  1461. tos = nil;
  1462. toc = nil;
  1463. if(waserror()){
  1464. freeSec(tos);
  1465. freeSec(toc);
  1466. free(x);
  1467. nexterror();
  1468. }
  1469. m = dec64(x, m, p, strlen(p));
  1470. if(m < 2 * ha->maclen + 2 * ea->keylen + 2 * ea->ivlen)
  1471. error("not enough secret data provided");
  1472. tos = smalloc(sizeof(Secret));
  1473. toc = smalloc(sizeof(Secret));
  1474. if(!ha->initkey || !ea->initkey)
  1475. error("misimplemented secret algorithm");
  1476. (*ha->initkey)(ha, tr->version, tos, &x[0]);
  1477. (*ha->initkey)(ha, tr->version, toc, &x[ha->maclen]);
  1478. (*ea->initkey)(ea, tos, &x[2 * ha->maclen], &x[2 * ha->maclen + 2 * ea->keylen]);
  1479. (*ea->initkey)(ea, toc, &x[2 * ha->maclen + ea->keylen], &x[2 * ha->maclen + 2 * ea->keylen + ea->ivlen]);
  1480. if(!tos->mac || !tos->enc || !tos->dec
  1481. || !toc->mac || !toc->enc || !toc->dec)
  1482. error("missing algorithm implementations");
  1483. if(strtol(cb->f[3], nil, 0) == 0){
  1484. tr->in.new = tos;
  1485. tr->out.new = toc;
  1486. }else{
  1487. tr->in.new = toc;
  1488. tr->out.new = tos;
  1489. }
  1490. if(tr->version == SSL3Version){
  1491. toc->unpad = sslunpad;
  1492. tos->unpad = sslunpad;
  1493. }else{
  1494. toc->unpad = tlsunpad;
  1495. tos->unpad = tlsunpad;
  1496. }
  1497. toc->encalg = ea->name;
  1498. toc->hashalg = ha->name;
  1499. tos->encalg = ea->name;
  1500. tos->hashalg = ha->name;
  1501. free(x);
  1502. poperror();
  1503. }else if(strcmp(cb->f[0], "changecipher") == 0){
  1504. if(cb->nf != 1)
  1505. error("usage: changecipher");
  1506. if(tr->out.new == nil)
  1507. error("cannot change cipher spec without setting secret");
  1508. qunlock(&tr->in.seclock);
  1509. qunlock(&tr->out.seclock);
  1510. poperror();
  1511. free(cb);
  1512. poperror();
  1513. /*
  1514. * the real work is done as the message is written
  1515. * so the stream is encrypted in sync.
  1516. */
  1517. b = allocb(1);
  1518. *b->wp++ = 1;
  1519. tlsrecwrite(tr, RChangeCipherSpec, b);
  1520. return n;
  1521. }else if(strcmp(cb->f[0], "opened") == 0){
  1522. if(cb->nf != 1)
  1523. error("usage: opened");
  1524. if(tr->in.sec == nil || tr->out.sec == nil)
  1525. error("cipher must be configured before enabling data messages");
  1526. lock(&tr->statelk);
  1527. if(tr->state != SHandshake && tr->state != SOpen){
  1528. unlock(&tr->statelk);
  1529. error("cannot enable data messages");
  1530. }
  1531. tr->state = SOpen;
  1532. unlock(&tr->statelk);
  1533. tr->opened = 1;
  1534. }else if(strcmp(cb->f[0], "alert") == 0){
  1535. if(cb->nf != 2)
  1536. error("usage: alert n");
  1537. if(tr->c == nil)
  1538. error("must set fd before sending alerts");
  1539. m = strtol(cb->f[1], nil, 0);
  1540. qunlock(&tr->in.seclock);
  1541. qunlock(&tr->out.seclock);
  1542. poperror();
  1543. free(cb);
  1544. poperror();
  1545. sendAlert(tr, m);
  1546. if(m == ECloseNotify)
  1547. tlsclosed(tr, SLClose);
  1548. return n;
  1549. } else if(strcmp(cb->f[0], "debug") == 0){
  1550. if(cb->nf == 2){
  1551. if(strcmp(cb->f[1], "on") == 0)
  1552. tr->debug = 1;
  1553. else
  1554. tr->debug = 0;
  1555. } else
  1556. tr->debug = 1;
  1557. } else
  1558. error(Ebadarg);
  1559. qunlock(&tr->in.seclock);
  1560. qunlock(&tr->out.seclock);
  1561. poperror();
  1562. free(cb);
  1563. poperror();
  1564. return n;
  1565. }
  1566. static void
  1567. tlsinit(void)
  1568. {
  1569. struct Encalg *e;
  1570. struct Hashalg *h;
  1571. int n;
  1572. char *cp;
  1573. static int already;
  1574. if(!already){
  1575. // fmtinstall('H', encodefmt);
  1576. already = 1;
  1577. }
  1578. tlsdevs = smalloc(sizeof(TlsRec*) * maxtlsdevs);
  1579. trnames = smalloc((sizeof *trnames) * maxtlsdevs);
  1580. n = 1;
  1581. for(e = encrypttab; e->name != nil; e++)
  1582. n += strlen(e->name) + 1;
  1583. cp = encalgs = smalloc(n);
  1584. for(e = encrypttab;;){
  1585. strcpy(cp, e->name);
  1586. cp += strlen(e->name);
  1587. e++;
  1588. if(e->name == nil)
  1589. break;
  1590. *cp++ = ' ';
  1591. }
  1592. *cp = 0;
  1593. n = 1;
  1594. for(h = hashtab; h->name != nil; h++)
  1595. n += strlen(h->name) + 1;
  1596. cp = hashalgs = smalloc(n);
  1597. for(h = hashtab;;){
  1598. strcpy(cp, h->name);
  1599. cp += strlen(h->name);
  1600. h++;
  1601. if(h->name == nil)
  1602. break;
  1603. *cp++ = ' ';
  1604. }
  1605. *cp = 0;
  1606. }
  1607. Dev tlsdevtab = {
  1608. .dc = 'a',
  1609. .name = "tls",
  1610. .reset = devreset,
  1611. .init = tlsinit,
  1612. .shutdown = devshutdown,
  1613. .attach = tlsattach,
  1614. .walk = tlswalk,
  1615. .stat = tlsstat,
  1616. .open = tlsopen,
  1617. .create = devcreate,
  1618. .close = tlsclose,
  1619. .read = tlsread,
  1620. .bread = tlsbread,
  1621. .write = tlswrite,
  1622. .bwrite = tlsbwrite,
  1623. .remove = devremove,
  1624. .wstat = tlswstat,
  1625. };
  1626. /* get channel associated with an fd */
  1627. static Chan*
  1628. buftochan(char *p)
  1629. {
  1630. Chan *c;
  1631. int fd;
  1632. if(p == 0)
  1633. error(Ebadarg);
  1634. fd = strtoul(p, 0, 0);
  1635. if(fd < 0)
  1636. error(Ebadarg);
  1637. c = fdtochan(fd, -1, 0, 1); /* error check and inc ref */
  1638. return c;
  1639. }
  1640. static void
  1641. sendAlert(TlsRec *tr, int err)
  1642. {
  1643. Proc *up = externup();
  1644. Block *b;
  1645. int i, fatal;
  1646. char *msg;
  1647. if(tr->debug)pprint("sendAlert %d\n", err);
  1648. fatal = 1;
  1649. msg = "tls unknown alert";
  1650. for(i=0; i < nelem(tlserrs); i++) {
  1651. if(tlserrs[i].err == err) {
  1652. msg = tlserrs[i].msg;
  1653. if(tr->version == SSL3Version)
  1654. err = tlserrs[i].sslerr;
  1655. else
  1656. err = tlserrs[i].tlserr;
  1657. fatal = tlserrs[i].fatal;
  1658. break;
  1659. }
  1660. }
  1661. if(!waserror()){
  1662. b = allocb(2);
  1663. *b->wp++ = fatal + 1;
  1664. *b->wp++ = err;
  1665. if(fatal)
  1666. tlsSetState(tr, SAlert, SOpen|SHandshake|SRClose);
  1667. tlsrecwrite(tr, RAlert, b);
  1668. poperror();
  1669. }
  1670. if(fatal)
  1671. tlsError(tr, msg);
  1672. }
  1673. static void
  1674. tlsError(TlsRec *tr, char *msg)
  1675. {
  1676. int s;
  1677. if(tr->debug)pprint("tleError %s\n", msg);
  1678. lock(&tr->statelk);
  1679. s = tr->state;
  1680. tr->state = SError;
  1681. if(s != SError){
  1682. strncpy(tr->err, msg, ERRMAX - 1);
  1683. tr->err[ERRMAX - 1] = '\0';
  1684. }
  1685. unlock(&tr->statelk);
  1686. if(s != SError)
  1687. alertHand(tr, msg);
  1688. }
  1689. static void
  1690. tlsSetState(TlsRec *tr, int new, int old)
  1691. {
  1692. lock(&tr->statelk);
  1693. if(tr->state & old)
  1694. tr->state = new;
  1695. unlock(&tr->statelk);
  1696. }
  1697. /* hand up a digest connection */
  1698. static void
  1699. tlshangup(TlsRec *tr)
  1700. {
  1701. Block *b;
  1702. qlock(&tr->in.io);
  1703. for(b = tr->processed; b; b = tr->processed){
  1704. tr->processed = b->next;
  1705. freeb(b);
  1706. }
  1707. if(tr->unprocessed != nil){
  1708. freeb(tr->unprocessed);
  1709. tr->unprocessed = nil;
  1710. }
  1711. qunlock(&tr->in.io);
  1712. tlsSetState(tr, SClosed, ~0);
  1713. }
  1714. static TlsRec*
  1715. newtls(Chan *ch)
  1716. {
  1717. Proc *up = externup();
  1718. TlsRec **pp, **ep, **np;
  1719. char **nmp;
  1720. int t, newmax;
  1721. if(waserror()) {
  1722. unlock(&tdlock);
  1723. nexterror();
  1724. }
  1725. lock(&tdlock);
  1726. ep = &tlsdevs[maxtlsdevs];
  1727. for(pp = tlsdevs; pp < ep; pp++)
  1728. if(*pp == nil)
  1729. break;
  1730. if(pp >= ep) {
  1731. if(maxtlsdevs >= MaxTlsDevs) {
  1732. unlock(&tdlock);
  1733. poperror();
  1734. return nil;
  1735. }
  1736. newmax = 2 * maxtlsdevs;
  1737. if(newmax > MaxTlsDevs)
  1738. newmax = MaxTlsDevs;
  1739. np = smalloc(sizeof(TlsRec*) * newmax);
  1740. memmove(np, tlsdevs, sizeof(TlsRec*) * maxtlsdevs);
  1741. tlsdevs = np;
  1742. pp = &tlsdevs[maxtlsdevs];
  1743. memset(pp, 0, sizeof(TlsRec*)*(newmax - maxtlsdevs));
  1744. nmp = smalloc(sizeof *nmp * newmax);
  1745. memmove(nmp, trnames, sizeof *nmp * maxtlsdevs);
  1746. trnames = nmp;
  1747. maxtlsdevs = newmax;
  1748. }
  1749. *pp = mktlsrec();
  1750. if(pp - tlsdevs >= tdhiwat)
  1751. tdhiwat++;
  1752. t = TYPE(ch->qid);
  1753. if(t == Qclonus)
  1754. t = Qctl;
  1755. ch->qid.path = QID(pp - tlsdevs, t);
  1756. ch->qid.vers = 0;
  1757. unlock(&tdlock);
  1758. poperror();
  1759. return *pp;
  1760. }
  1761. static TlsRec *
  1762. mktlsrec(void)
  1763. {
  1764. Proc *up = externup();
  1765. TlsRec *tr;
  1766. tr = mallocz(sizeof(*tr), 1);
  1767. if(tr == nil)
  1768. error(Enomem);
  1769. tr->state = SClosed;
  1770. tr->ref = 1;
  1771. kstrdup(&tr->user, up->user);
  1772. tr->perm = 0660;
  1773. return tr;
  1774. }
  1775. static char*
  1776. tlsstate(int s)
  1777. {
  1778. switch(s){
  1779. case SHandshake:
  1780. return "Handshaking";
  1781. case SOpen:
  1782. return "Established";
  1783. case SRClose:
  1784. return "RemoteClosed";
  1785. case SLClose:
  1786. return "LocalClosed";
  1787. case SAlert:
  1788. return "Alerting";
  1789. case SError:
  1790. return "Errored";
  1791. case SClosed:
  1792. return "Closed";
  1793. }
  1794. return "Unknown";
  1795. }
  1796. static void
  1797. freeSec(Secret *s)
  1798. {
  1799. if(s != nil){
  1800. free(s->enckey);
  1801. free(s);
  1802. }
  1803. }
  1804. static int
  1805. noenc(Secret *sec, uint8_t *buf, int n)
  1806. {
  1807. return n;
  1808. }
  1809. static int
  1810. rc4enc(Secret *sec, uint8_t *buf, int n)
  1811. {
  1812. rc4(sec->enckey, buf, n);
  1813. return n;
  1814. }
  1815. static int
  1816. tlsunpad(uint8_t *buf, int n, int block)
  1817. {
  1818. int pad, nn;
  1819. pad = buf[n - 1];
  1820. nn = n - 1 - pad;
  1821. if(nn <= 0 || n % block)
  1822. return -1;
  1823. while(--n > nn)
  1824. if(pad != buf[n - 1])
  1825. return -1;
  1826. return nn;
  1827. }
  1828. static int
  1829. sslunpad(uint8_t *buf, int n, int block)
  1830. {
  1831. int pad, nn;
  1832. pad = buf[n - 1];
  1833. nn = n - 1 - pad;
  1834. if(nn <= 0 || n % block)
  1835. return -1;
  1836. return nn;
  1837. }
  1838. static int
  1839. blockpad(uint8_t *buf, int n, int block)
  1840. {
  1841. int pad, nn;
  1842. nn = n + block;
  1843. nn -= nn % block;
  1844. pad = nn - (n + 1);
  1845. while(n < nn)
  1846. buf[n++] = pad;
  1847. return nn;
  1848. }
  1849. static int
  1850. des3enc(Secret *sec, uint8_t *buf, int n)
  1851. {
  1852. n = blockpad(buf, n, 8);
  1853. des3CBCencrypt(buf, n, sec->enckey);
  1854. return n;
  1855. }
  1856. static int
  1857. des3dec(Secret *sec, uint8_t *buf, int n)
  1858. {
  1859. des3CBCdecrypt(buf, n, sec->enckey);
  1860. return (*sec->unpad)(buf, n, 8);
  1861. }
  1862. static DigestState*
  1863. nomac(uint8_t *i, uint32_t j, uint8_t *k, uint32_t l, uint8_t *m, DigestState *ds)
  1864. {
  1865. return nil;
  1866. }
  1867. /*
  1868. * sslmac: mac calculations for ssl 3.0 only; tls 1.0 uses the standard hmac.
  1869. */
  1870. static DigestState*
  1871. sslmac_x(uint8_t *p, uint32_t len, uint8_t *key, uint32_t klen,
  1872. uint8_t *digest,
  1873. DigestState *s,
  1874. DigestState*(*x)(uint8_t*, uint32_t, uint8_t*, DigestState*),
  1875. int xlen,
  1876. int padlen)
  1877. {
  1878. int i;
  1879. uint8_t pad[48], innerdigest[20];
  1880. if(xlen > sizeof(innerdigest)
  1881. || padlen > sizeof(pad))
  1882. return nil;
  1883. if(klen>64)
  1884. return nil;
  1885. /* first time through */
  1886. if(s == nil){
  1887. for(i=0; i<padlen; i++)
  1888. pad[i] = 0x36;
  1889. s = (*x)(key, klen, nil, nil);
  1890. s = (*x)(pad, padlen, nil, s);
  1891. if(s == nil)
  1892. return nil;
  1893. }
  1894. s = (*x)(p, len, nil, s);
  1895. if(digest == nil)
  1896. return s;
  1897. /* last time through */
  1898. for(i=0; i<padlen; i++)
  1899. pad[i] = 0x5c;
  1900. (*x)(nil, 0, innerdigest, s);
  1901. s = (*x)(key, klen, nil, nil);
  1902. s = (*x)(pad, padlen, nil, s);
  1903. (*x)(innerdigest, xlen, digest, s);
  1904. return nil;
  1905. }
  1906. static DigestState*
  1907. sslmac_sha1(uint8_t *p, uint32_t len, uint8_t *key, uint32_t klen,
  1908. uint8_t *digest, DigestState *s)
  1909. {
  1910. return sslmac_x(p, len, key, klen, digest, s, sha1, SHA1dlen, 40);
  1911. }
  1912. static DigestState*
  1913. sslmac_md5(uint8_t *p, uint32_t len, uint8_t *key, uint32_t klen,
  1914. uint8_t *digest, DigestState *s)
  1915. {
  1916. return sslmac_x(p, len, key, klen, digest, s, md5, MD5dlen, 48);
  1917. }
  1918. static void
  1919. sslPackMac(Secret *sec, uint8_t *mackey, uint8_t *seq, uint8_t *header,
  1920. uint8_t *body, int len, uint8_t *mac)
  1921. {
  1922. DigestState *s;
  1923. uint8_t buf[11];
  1924. memmove(buf, seq, 8);
  1925. buf[8] = header[0];
  1926. buf[9] = header[3];
  1927. buf[10] = header[4];
  1928. s = (*sec->mac)(buf, 11, mackey, sec->maclen, 0, 0);
  1929. (*sec->mac)(body, len, mackey, sec->maclen, mac, s);
  1930. }
  1931. static void
  1932. tlsPackMac(Secret *sec, uint8_t *mackey, uint8_t *seq, uint8_t *header,
  1933. uint8_t *body, int len, uint8_t *mac)
  1934. {
  1935. DigestState *s;
  1936. uint8_t buf[13];
  1937. memmove(buf, seq, 8);
  1938. memmove(&buf[8], header, 5);
  1939. s = (*sec->mac)(buf, 13, mackey, sec->maclen, 0, 0);
  1940. (*sec->mac)(body, len, mackey, sec->maclen, mac, s);
  1941. }
  1942. static void
  1943. put32(uint8_t *p, uint32_t x)
  1944. {
  1945. p[0] = x>>24;
  1946. p[1] = x>>16;
  1947. p[2] = x>>8;
  1948. p[3] = x;
  1949. }
  1950. static void
  1951. put64(uint8_t *p, int64_t x)
  1952. {
  1953. put32(p, (uint32_t)(x >> 32));
  1954. put32(p+4, (uint32_t)x);
  1955. }
  1956. static void
  1957. put24(uint8_t *p, int x)
  1958. {
  1959. p[0] = x>>16;
  1960. p[1] = x>>8;
  1961. p[2] = x;
  1962. }
  1963. static void
  1964. put16(uint8_t *p, int x)
  1965. {
  1966. p[0] = x>>8;
  1967. p[1] = x;
  1968. }
  1969. #if 0
  1970. static uint32_t
  1971. get32(uint8_t *p)
  1972. {
  1973. return (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
  1974. }
  1975. #endif
  1976. static int
  1977. get16(uint8_t *p)
  1978. {
  1979. return (p[0]<<8)|p[1];
  1980. }
  1981. static char *charmap = "0123456789abcdef";
  1982. static void
  1983. pdump(int len, void *a, char *tag)
  1984. {
  1985. uint8_t *p;
  1986. int i;
  1987. char buf[65+32];
  1988. char *q;
  1989. p = a;
  1990. strcpy(buf, tag);
  1991. while(len > 0){
  1992. q = buf + strlen(tag);
  1993. for(i = 0; len > 0 && i < 32; i++){
  1994. if(*p >= ' ' && *p < 0x7f){
  1995. *q++ = ' ';
  1996. *q++ = *p;
  1997. } else {
  1998. *q++ = charmap[*p>>4];
  1999. *q++ = charmap[*p & 0xf];
  2000. }
  2001. len--;
  2002. p++;
  2003. }
  2004. *q = 0;
  2005. if(len > 0)
  2006. pprint("%s...\n", buf);
  2007. else
  2008. pprint("%s\n", buf);
  2009. }
  2010. }