tlshand.c 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061
  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. * Portions of this file are copyright cinap_lenrek <cinap_lenrek@felloff.net>
  9. * and mischief <mischief@offblast.org>, and are made available
  10. * under the terms of the MIT license that can be found in the LICENSE.mit file.
  11. */
  12. #include <u.h>
  13. #include <libc.h>
  14. #include <bio.h>
  15. #include <auth.h>
  16. #include <mp.h>
  17. #include <libsec.h>
  18. // The main groups of functions are:
  19. // client/server - main handshake protocol definition
  20. // message functions - formating handshake messages
  21. // cipher choices - catalog of digest and encrypt algorithms
  22. // security functions - PKCS#1, sslHMAC, session keygen
  23. // general utility functions - malloc, serialization
  24. // The handshake protocol builds on the TLS/SSL3 record layer protocol,
  25. // which is implemented in kernel device #a. See also /lib/rfc/rfc2246.
  26. enum {
  27. TLSFinishedLen = 12,
  28. SSL3FinishedLen = MD5dlen+SHA1dlen,
  29. MaxKeyData = 160, // amount of secret we may need
  30. MaxChunk = 1<<15,
  31. MAXdlen = SHA2_512dlen,
  32. RandomSize = 32,
  33. MasterSecretSize = 48,
  34. AQueue = 0,
  35. AFlush = 1,
  36. };
  37. typedef struct Bytes{
  38. int len;
  39. uint8_t data[1]; // [len]
  40. } Bytes;
  41. typedef struct Ints{
  42. int len;
  43. int data[1]; // [len]
  44. } Ints;
  45. typedef struct Algs{
  46. char *enc;
  47. char *digest;
  48. int nsecret;
  49. int tlsid;
  50. int ok;
  51. } Algs;
  52. typedef struct Namedcurve{
  53. int tlsid;
  54. void (*init)(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h);
  55. } Namedcurve;
  56. typedef struct Finished{
  57. uint8_t verify[SSL3FinishedLen];
  58. int n;
  59. } Finished;
  60. typedef struct HandshakeHash {
  61. MD5state md5;
  62. SHAstate sha1;
  63. SHA2_256state sha2_256;
  64. } HandshakeHash;
  65. typedef struct TlsSec TlsSec;
  66. struct TlsSec {
  67. RSApub *rsapub;
  68. AuthRpc *rpc; // factotum for rsa private key
  69. uint8_t *psk; // pre-shared key
  70. int psklen;
  71. int clientVers; // version in ClientHello
  72. uint8_t sec[MasterSecretSize]; // master secret
  73. uint8_t crandom[RandomSize]; // client random
  74. uint8_t srandom[RandomSize]; // server random
  75. // diffie hellman state
  76. DHstate dh;
  77. struct {
  78. ECdomain dom;
  79. ECpriv Q;
  80. } ec;
  81. // byte generation and handshake checksum
  82. void (*prf)(uint8_t*, int, uint8_t*, int, char*, uint8_t*, int, uint8_t*, int);
  83. void (*setFinished)(TlsSec*, HandshakeHash, uint8_t*, int);
  84. int nfin;
  85. };
  86. typedef struct TlsConnection{
  87. TlsSec sec[1]; // security management goo
  88. int hand, ctl; // record layer file descriptors
  89. int erred; // set when tlsError called
  90. int (*trace)(char*fmt, ...); // for debugging
  91. int version; // protocol we are speaking
  92. Bytes *cert; // server certificate; only last - no chain
  93. int cipher;
  94. int nsecret; // amount of secret data to init keys
  95. char *digest; // name of digest algorithm to use
  96. char *enc; // name of encryption algorithm to use
  97. // for finished messages
  98. HandshakeHash handhash;
  99. Finished finished;
  100. // input buffer for handshake messages
  101. uint8_t recvbuf[MaxChunk];
  102. uint8_t *rp, *ep;
  103. // output buffer
  104. uint8_t sendbuf[MaxChunk];
  105. uint8_t *sendp;
  106. } TlsConnection;
  107. typedef struct Msg{
  108. int tag;
  109. union {
  110. struct {
  111. int version;
  112. uint8_t random[RandomSize];
  113. Bytes* sid;
  114. Ints* ciphers;
  115. Bytes* compressors;
  116. Bytes* extensions;
  117. } clientHello;
  118. struct {
  119. int version;
  120. uint8_t random[RandomSize];
  121. Bytes* sid;
  122. int cipher;
  123. int compressor;
  124. Bytes* extensions;
  125. } serverHello;
  126. struct {
  127. int ncert;
  128. Bytes **certs;
  129. } certificate;
  130. struct {
  131. Bytes *types;
  132. Ints *sigalgs;
  133. int nca;
  134. Bytes **cas;
  135. } certificateRequest;
  136. struct {
  137. Bytes *pskid;
  138. Bytes *key;
  139. } clientKeyExchange;
  140. struct {
  141. Bytes *pskid;
  142. Bytes *dh_p;
  143. Bytes *dh_g;
  144. Bytes *dh_Ys;
  145. Bytes *dh_parameters;
  146. Bytes *dh_signature;
  147. int sigalg;
  148. int curve;
  149. } serverKeyExchange;
  150. struct {
  151. int sigalg;
  152. Bytes *signature;
  153. } certificateVerify;
  154. Finished finished;
  155. } u;
  156. } Msg;
  157. enum {
  158. SSL3Version = 0x0300,
  159. TLS10Version = 0x0301,
  160. TLS11Version = 0x0302,
  161. TLS12Version = 0x0303,
  162. ProtocolVersion = TLS12Version, // maximum version we speak
  163. MinProtoVersion = 0x0300, // limits on version we accept
  164. MaxProtoVersion = 0x03ff,
  165. };
  166. // handshake type
  167. enum {
  168. HHelloRequest,
  169. HClientHello,
  170. HServerHello,
  171. HSSL2ClientHello = 9, /* local convention; see devtls.c */
  172. HCertificate = 11,
  173. HServerKeyExchange,
  174. HCertificateRequest,
  175. HServerHelloDone,
  176. HCertificateVerify,
  177. HClientKeyExchange,
  178. HFinished = 20,
  179. HMax
  180. };
  181. // alerts
  182. enum {
  183. ECloseNotify = 0,
  184. EUnexpectedMessage = 10,
  185. EBadRecordMac = 20,
  186. EDecryptionFailed = 21,
  187. ERecordOverflow = 22,
  188. EDecompressionFailure = 30,
  189. EHandshakeFailure = 40,
  190. ENoCertificate = 41,
  191. EBadCertificate = 42,
  192. EUnsupportedCertificate = 43,
  193. ECertificateRevoked = 44,
  194. ECertificateExpired = 45,
  195. ECertificateUnknown = 46,
  196. EIllegalParameter = 47,
  197. EUnknownCa = 48,
  198. EAccessDenied = 49,
  199. EDecodeError = 50,
  200. EDecryptError = 51,
  201. EExportRestriction = 60,
  202. EProtocolVersion = 70,
  203. EInsufficientSecurity = 71,
  204. EInternalError = 80,
  205. EInappropriateFallback = 86,
  206. EUserCanceled = 90,
  207. ENoRenegotiation = 100,
  208. EUnknownPSKidentity = 115,
  209. EMax = 256
  210. };
  211. // cipher suites
  212. enum {
  213. TLS_NULL_WITH_NULL_NULL = 0x0000,
  214. TLS_RSA_WITH_NULL_MD5 = 0x0001,
  215. TLS_RSA_WITH_NULL_SHA = 0x0002,
  216. TLS_RSA_EXPORT_WITH_RC4_40_MD5 = 0x0003,
  217. TLS_RSA_WITH_RC4_128_MD5 = 0x0004,
  218. TLS_RSA_WITH_RC4_128_SHA = 0x0005,
  219. TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 0X0006,
  220. TLS_RSA_WITH_IDEA_CBC_SHA = 0X0007,
  221. TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = 0X0008,
  222. TLS_RSA_WITH_DES_CBC_SHA = 0X0009,
  223. TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0X000A,
  224. TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 0X000B,
  225. TLS_DH_DSS_WITH_DES_CBC_SHA = 0X000C,
  226. TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0X000D,
  227. TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 0X000E,
  228. TLS_DH_RSA_WITH_DES_CBC_SHA = 0X000F,
  229. TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0X0010,
  230. TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 0X0011,
  231. TLS_DHE_DSS_WITH_DES_CBC_SHA = 0X0012,
  232. TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0X0013, // ZZZ must be implemented for tls1.0 compliance
  233. TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 0X0014,
  234. TLS_DHE_RSA_WITH_DES_CBC_SHA = 0X0015,
  235. TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0X0016,
  236. TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = 0x0017,
  237. TLS_DH_anon_WITH_RC4_128_MD5 = 0x0018,
  238. TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = 0X0019,
  239. TLS_DH_anon_WITH_DES_CBC_SHA = 0X001A,
  240. TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = 0X001B,
  241. TLS_RSA_WITH_AES_128_CBC_SHA = 0X002F, // aes, aka rijndael with 128 bit blocks
  242. TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0X0030,
  243. TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0X0031,
  244. TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0X0032,
  245. TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0X0033,
  246. TLS_DH_anon_WITH_AES_128_CBC_SHA = 0X0034,
  247. TLS_RSA_WITH_AES_256_CBC_SHA = 0X0035,
  248. TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0X0036,
  249. TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0X0037,
  250. TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0X0038,
  251. TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0X0039,
  252. TLS_DH_anon_WITH_AES_256_CBC_SHA = 0X003A,
  253. TLS_RSA_WITH_AES_128_CBC_SHA256 = 0X003C,
  254. TLS_RSA_WITH_AES_256_CBC_SHA256 = 0X003D,
  255. TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0X0067,
  256. TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C,
  257. TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D,
  258. TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E,
  259. TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F,
  260. TLS_DH_RSA_WITH_AES_128_GCM_SHA256 = 0x00A0,
  261. TLS_DH_RSA_WITH_AES_256_GCM_SHA384 = 0x00A1,
  262. TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2,
  263. TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3,
  264. TLS_DH_DSS_WITH_AES_128_GCM_SHA256 = 0x00A4,
  265. TLS_DH_DSS_WITH_AES_256_GCM_SHA384 = 0x00A5,
  266. TLS_DH_anon_WITH_AES_128_GCM_SHA256 = 0x00A6,
  267. TLS_DH_anon_WITH_AES_256_GCM_SHA384 = 0x00A7,
  268. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
  269. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F,
  270. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013,
  271. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014,
  272. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027,
  273. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023,
  274. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 = 0xCCA8,
  275. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 = 0xCCA9,
  276. TLS_DHE_RSA_WITH_CHACHA20_POLY1305 = 0xCCAA,
  277. GOOGLE_ECDHE_RSA_WITH_CHACHA20_POLY1305 = 0xCC13,
  278. GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 = 0xCC14,
  279. GOOGLE_DHE_RSA_WITH_CHACHA20_POLY1305 = 0xCC15,
  280. TLS_PSK_WITH_CHACHA20_POLY1305 = 0xCCAB,
  281. TLS_PSK_WITH_AES_128_CBC_SHA256 = 0x00AE,
  282. TLS_PSK_WITH_AES_128_CBC_SHA = 0x008C,
  283. TLS_FALLBACK_SCSV = 0x5600,
  284. };
  285. // compression methods
  286. enum {
  287. CompressionNull = 0,
  288. CompressionMax
  289. };
  290. static Algs cipherAlgs[] = {
  291. // ECDHE-ECDSA
  292. {"ccpoly96_aead", "clear", 2*(32+12), TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305},
  293. {"ccpoly64_aead", "clear", 2*32, GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305},
  294. {"aes_128_gcm_aead", "clear", 2*(16+4), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
  295. {"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256},
  296. // ECDHE-RSA
  297. {"ccpoly96_aead", "clear", 2*(32+12), TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305},
  298. {"ccpoly64_aead", "clear", 2*32, GOOGLE_ECDHE_RSA_WITH_CHACHA20_POLY1305},
  299. {"aes_128_gcm_aead", "clear", 2*(16+4), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
  300. {"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256},
  301. {"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
  302. {"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA},
  303. // DHE-RSA
  304. {"ccpoly96_aead", "clear", 2*(32+12), TLS_DHE_RSA_WITH_CHACHA20_POLY1305},
  305. {"ccpoly64_aead", "clear", 2*32, GOOGLE_DHE_RSA_WITH_CHACHA20_POLY1305},
  306. {"aes_128_gcm_aead", "clear", 2*(16+4), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
  307. {"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256},
  308. {"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_DHE_RSA_WITH_AES_128_CBC_SHA},
  309. {"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_DHE_RSA_WITH_AES_256_CBC_SHA},
  310. {"3des_ede_cbc","sha1", 2*(4*8+SHA1dlen), TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA},
  311. // RSA
  312. {"aes_128_gcm_aead", "clear", 2*(16+4), TLS_RSA_WITH_AES_128_GCM_SHA256},
  313. {"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_RSA_WITH_AES_128_CBC_SHA256},
  314. {"aes_256_cbc", "sha256", 2*(32+16+SHA2_256dlen), TLS_RSA_WITH_AES_256_CBC_SHA256},
  315. {"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_RSA_WITH_AES_128_CBC_SHA},
  316. {"aes_256_cbc", "sha1", 2*(32+16+SHA1dlen), TLS_RSA_WITH_AES_256_CBC_SHA},
  317. {"3des_ede_cbc","sha1", 2*(4*8+SHA1dlen), TLS_RSA_WITH_3DES_EDE_CBC_SHA},
  318. // PSK
  319. {"ccpoly96_aead", "clear", 2*(32+12), TLS_PSK_WITH_CHACHA20_POLY1305},
  320. {"aes_128_cbc", "sha256", 2*(16+16+SHA2_256dlen), TLS_PSK_WITH_AES_128_CBC_SHA256},
  321. {"aes_128_cbc", "sha1", 2*(16+16+SHA1dlen), TLS_PSK_WITH_AES_128_CBC_SHA},
  322. };
  323. static uint8_t compressors[] = {
  324. CompressionNull,
  325. };
  326. static Namedcurve namedcurves[] = {
  327. {0x0017, secp256r1},
  328. {0x0018, secp384r1},
  329. };
  330. static uint8_t pointformats[] = {
  331. CompressionNull /* support of uncompressed point format is mandatory */
  332. };
  333. static struct {
  334. DigestState* (*fun)(uint8_t*, uint32_t, uint8_t*, DigestState*);
  335. int len;
  336. } hashfun[] = {
  337. /* [0] is reserved for MD5+SHA1 for < TLS1.2 */
  338. [1] = {md5, MD5dlen},
  339. [2] = {sha1, SHA1dlen},
  340. [3] = {sha2_224, SHA2_224dlen},
  341. [4] = {sha2_256, SHA2_256dlen},
  342. [5] = {sha2_384, SHA2_384dlen},
  343. [6] = {sha2_512, SHA2_512dlen},
  344. };
  345. // signature algorithms (only RSA and ECDSA at the moment)
  346. static int sigalgs[] = {
  347. 0x0603, /* SHA512 ECDSA */
  348. 0x0503, /* SHA384 ECDSA */
  349. 0x0403, /* SHA256 ECDSA */
  350. 0x0203, /* SHA1 ECDSA */
  351. 0x0601, /* SHA512 RSA */
  352. 0x0501, /* SHA384 RSA */
  353. 0x0401, /* SHA256 RSA */
  354. 0x0201, /* SHA1 RSA */
  355. };
  356. static TlsConnection *tlsServer2(int ctl, int hand,
  357. uint8_t *cert, int certlen,
  358. char *pskid, uint8_t *psk, int psklen,
  359. int (*trace)(char*fmt, ...), PEMChain *chain);
  360. static TlsConnection *tlsClient2(int ctl, int hand,
  361. uint8_t *cert, int certlen,
  362. char *pskid, uint8_t *psk, int psklen,
  363. uint8_t *ext, int extlen, int (*trace)(char*fmt, ...));
  364. static void msgClear(Msg *m);
  365. static char* msgPrint(char *buf, int n, Msg *m);
  366. static int msgRecv(TlsConnection *c, Msg *m);
  367. static int msgSend(TlsConnection *c, Msg *m, int act);
  368. static void tlsError(TlsConnection *c, int err, char *msg, ...);
  369. //#pragma varargck argpos tlsError 3
  370. static int setVersion(TlsConnection *c, int version);
  371. static int setSecrets(TlsConnection *c, int isclient);
  372. static int finishedMatch(TlsConnection *c, Finished *f);
  373. static void tlsConnectionFree(TlsConnection *c);
  374. static int isDHE(int tlsid);
  375. static int isECDHE(int tlsid);
  376. static int isPSK(int tlsid);
  377. static int isECDSA(int tlsid);
  378. static int setAlgs(TlsConnection *c, int a);
  379. static int okCipher(Ints *cv, int ispsk);
  380. static int okCompression(Bytes *cv);
  381. static int initCiphers(void);
  382. static Ints* makeciphers(int ispsk);
  383. static AuthRpc* factotum_rsa_open(RSApub *rsapub);
  384. static mpint* factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher);
  385. static void factotum_rsa_close(AuthRpc *rpc);
  386. static void tlsSecInits(TlsSec *sec, int cvers, uint8_t *crandom);
  387. static int tlsSecRSAs(TlsSec *sec, Bytes *epm);
  388. static Bytes* tlsSecECDHEs1(TlsSec *sec, Namedcurve *nc);
  389. static int tlsSecECDHEs2(TlsSec *sec, Bytes *Yc);
  390. static void tlsSecInitc(TlsSec *sec, int cvers);
  391. static Bytes* tlsSecRSAc(TlsSec *sec, uint8_t *cert, int ncert);
  392. static Bytes* tlsSecDHEc(TlsSec *sec, Bytes *p, Bytes *g, Bytes *Ys);
  393. static Bytes* tlsSecECDHEc(TlsSec *sec, int curve, Bytes *Ys);
  394. static void tlsSecVers(TlsSec *sec, int v);
  395. static int tlsSecFinished(TlsSec *sec, HandshakeHash hsh, uint8_t *fin, int nfin, int isclient);
  396. static void setMasterSecret(TlsSec *sec, Bytes *pm);
  397. static int digestDHparams(TlsSec *sec, Bytes *par, uint8_t digest[MAXdlen], int sigalg);
  398. static char* verifyDHparams(TlsSec *sec, Bytes *par, Bytes *cert, Bytes *sig, int sigalg);
  399. static Bytes* pkcs1_encrypt(Bytes* data, RSApub* key);
  400. static Bytes* pkcs1_decrypt(TlsSec *sec, Bytes *data);
  401. static Bytes* pkcs1_sign(TlsSec *sec, uint8_t *digest, int digestlen, int sigalg);
  402. static void* emalloc(int);
  403. static void* erealloc(void*, int);
  404. static void put32(uint8_t *p, uint32_t);
  405. static void put24(uint8_t *p, int);
  406. static void put16(uint8_t *p, int);
  407. static int get24(uint8_t *p);
  408. static int get16(uint8_t *p);
  409. static Bytes* newbytes(int len);
  410. static Bytes* makebytes(uint8_t* buf, int len);
  411. static Bytes* mptobytes(mpint* big);
  412. static mpint* bytestomp(Bytes* bytes);
  413. static void freebytes(Bytes* b);
  414. static Ints* newints(int len);
  415. static void freeints(Ints* b);
  416. static int lookupid(Ints* b, int id);
  417. /* x509.c */
  418. extern mpint* pkcs1padbuf(uint8_t *buf, int len, mpint *modulus, int blocktype);
  419. extern int pkcs1unpadbuf(uint8_t *buf, int len, mpint *modulus, int blocktype);
  420. extern int asn1encodedigest(DigestState* (*fun)(uint8_t*, uint32_t, uint8_t*, DigestState*), uint8_t *digest, uint8_t *buf, int len);
  421. //================= client/server ========================
  422. // push TLS onto fd, returning new (application) file descriptor
  423. // or -1 if error.
  424. int
  425. tlsServer(int fd, TLSconn *conn)
  426. {
  427. char buf[8];
  428. char dname[64];
  429. int n, data, ctl, hand;
  430. TlsConnection *tls;
  431. if(conn == nil)
  432. return -1;
  433. ctl = open("#a/tls/clone", ORDWR);
  434. if(ctl < 0)
  435. return -1;
  436. n = read(ctl, buf, sizeof(buf)-1);
  437. if(n < 0){
  438. close(ctl);
  439. return -1;
  440. }
  441. buf[n] = 0;
  442. snprint(conn->dir, sizeof(conn->dir), "#a/tls/%s", buf);
  443. snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf);
  444. hand = open(dname, ORDWR);
  445. if(hand < 0){
  446. close(ctl);
  447. return -1;
  448. }
  449. data = -1;
  450. fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion);
  451. tls = tlsServer2(ctl, hand,
  452. conn->cert, conn->certlen,
  453. conn->pskID, conn->psk, conn->psklen,
  454. conn->trace, conn->chain);
  455. if(tls != nil){
  456. snprint(dname, sizeof(dname), "#a/tls/%s/data", buf);
  457. data = open(dname, ORDWR);
  458. }
  459. close(hand);
  460. close(ctl);
  461. if(data < 0){
  462. tlsConnectionFree(tls);
  463. return -1;
  464. }
  465. free(conn->cert);
  466. conn->cert = nil; // client certificates are not yet implemented
  467. conn->certlen = 0;
  468. conn->sessionIDlen = 0;
  469. conn->sessionID = nil;
  470. if(conn->sessionKey != nil
  471. && conn->sessionType != nil
  472. && strcmp(conn->sessionType, "ttls") == 0)
  473. tls->sec->prf(
  474. conn->sessionKey, conn->sessionKeylen,
  475. tls->sec->sec, MasterSecretSize,
  476. conn->sessionConst,
  477. tls->sec->crandom, RandomSize,
  478. tls->sec->srandom, RandomSize);
  479. tlsConnectionFree(tls);
  480. close(fd);
  481. return data;
  482. }
  483. static uint8_t*
  484. tlsClientExtensions(TLSconn *conn, int *plen)
  485. {
  486. uint8_t *b, *p;
  487. int i, n, m;
  488. p = b = nil;
  489. // RFC6066 - Server Name Identification
  490. if(conn->serverName != nil){
  491. n = strlen(conn->serverName);
  492. m = p - b;
  493. b = erealloc(b, m + 2+2+2+1+2+n);
  494. p = b + m;
  495. put16(p, 0), p += 2; /* Type: server_name */
  496. put16(p, 2+1+2+n), p += 2; /* Length */
  497. put16(p, 1+2+n), p += 2; /* Server Name list length */
  498. *p++ = 0; /* Server Name Type: host_name */
  499. put16(p, n), p += 2; /* Server Name length */
  500. memmove(p, conn->serverName, n);
  501. p += n;
  502. }
  503. // ECDHE
  504. if(ProtocolVersion >= TLS10Version){
  505. m = p - b;
  506. b = erealloc(b, m + 2+2+2+nelem(namedcurves)*2 + 2+2+1+nelem(pointformats));
  507. p = b + m;
  508. n = nelem(namedcurves);
  509. put16(p, 0x000a), p += 2; /* Type: elliptic_curves */
  510. put16(p, (n+1)*2), p += 2; /* Length */
  511. put16(p, n*2), p += 2; /* Elliptic Curves Length */
  512. for(i=0; i < n; i++){ /* Elliptic curves */
  513. put16(p, namedcurves[i].tlsid);
  514. p += 2;
  515. }
  516. n = nelem(pointformats);
  517. put16(p, 0x000b), p += 2; /* Type: ec_point_formats */
  518. put16(p, n+1), p += 2; /* Length */
  519. *p++ = n; /* EC point formats Length */
  520. for(i=0; i < n; i++) /* Elliptic curves point formats */
  521. *p++ = pointformats[i];
  522. }
  523. // signature algorithms
  524. if(ProtocolVersion >= TLS12Version){
  525. n = nelem(sigalgs);
  526. m = p - b;
  527. b = erealloc(b, m + 2+2+2+n*2);
  528. p = b + m;
  529. put16(p, 0x000d), p += 2;
  530. put16(p, n*2 + 2), p += 2;
  531. put16(p, n*2), p += 2;
  532. for(i=0; i < n; i++){
  533. put16(p, sigalgs[i]);
  534. p += 2;
  535. }
  536. }
  537. *plen = p - b;
  538. return b;
  539. }
  540. // push TLS onto fd, returning new (application) file descriptor
  541. // or -1 if error.
  542. int
  543. tlsClient(int fd, TLSconn *conn)
  544. {
  545. char buf[8];
  546. char dname[64];
  547. int n, data, ctl, hand;
  548. TlsConnection *tls;
  549. uint8_t *ext;
  550. if(conn == nil)
  551. return -1;
  552. ctl = open("#a/tls/clone", ORDWR);
  553. if(ctl < 0)
  554. return -1;
  555. n = read(ctl, buf, sizeof(buf)-1);
  556. if(n < 0){
  557. close(ctl);
  558. return -1;
  559. }
  560. buf[n] = 0;
  561. snprint(conn->dir, sizeof(conn->dir), "#a/tls/%s", buf);
  562. snprint(dname, sizeof(dname), "#a/tls/%s/hand", buf);
  563. hand = open(dname, ORDWR);
  564. if(hand < 0){
  565. close(ctl);
  566. return -1;
  567. }
  568. snprint(dname, sizeof(dname), "#a/tls/%s/data", buf);
  569. data = open(dname, ORDWR);
  570. if(data < 0){
  571. close(hand);
  572. close(ctl);
  573. return -1;
  574. }
  575. fprint(ctl, "fd %d 0x%x", fd, ProtocolVersion);
  576. ext = tlsClientExtensions(conn, &n);
  577. tls = tlsClient2(ctl, hand,
  578. conn->cert, conn->certlen,
  579. conn->pskID, conn->psk, conn->psklen,
  580. ext, n, conn->trace);
  581. free(ext);
  582. close(hand);
  583. close(ctl);
  584. if(tls == nil){
  585. close(data);
  586. return -1;
  587. }
  588. free(conn->cert);
  589. if(tls->cert != nil){
  590. conn->certlen = tls->cert->len;
  591. conn->cert = emalloc(conn->certlen);
  592. memcpy(conn->cert, tls->cert->data, conn->certlen);
  593. } else {
  594. conn->certlen = 0;
  595. conn->cert = nil;
  596. }
  597. conn->sessionIDlen = 0;
  598. conn->sessionID = nil;
  599. if(conn->sessionKey != nil
  600. && conn->sessionType != nil
  601. && strcmp(conn->sessionType, "ttls") == 0)
  602. tls->sec->prf(
  603. conn->sessionKey, conn->sessionKeylen,
  604. tls->sec->sec, MasterSecretSize,
  605. conn->sessionConst,
  606. tls->sec->crandom, RandomSize,
  607. tls->sec->srandom, RandomSize);
  608. tlsConnectionFree(tls);
  609. close(fd);
  610. return data;
  611. }
  612. static int
  613. countchain(PEMChain *p)
  614. {
  615. int i = 0;
  616. while (p) {
  617. i++;
  618. p = p->next;
  619. }
  620. return i;
  621. }
  622. static TlsConnection *
  623. tlsServer2(int ctl, int hand,
  624. uint8_t *cert, int certlen,
  625. char *pskid, uint8_t *psk, int psklen,
  626. int (*trace)(char*fmt, ...), PEMChain *chp)
  627. {
  628. int cipher, compressor, numcerts, i;
  629. TlsConnection *c;
  630. Msg m;
  631. if(trace)
  632. trace("tlsServer2\n");
  633. if(!initCiphers())
  634. return nil;
  635. c = emalloc(sizeof(TlsConnection));
  636. c->ctl = ctl;
  637. c->hand = hand;
  638. c->trace = trace;
  639. c->version = ProtocolVersion;
  640. memset(&m, 0, sizeof(m));
  641. if(!msgRecv(c, &m)){
  642. if(trace)
  643. trace("initial msgRecv failed\n");
  644. goto Err;
  645. }
  646. if(m.tag != HClientHello) {
  647. tlsError(c, EUnexpectedMessage, "expected a client hello");
  648. goto Err;
  649. }
  650. if(trace)
  651. trace("ClientHello version %x\n", m.u.clientHello.version);
  652. if(setVersion(c, m.u.clientHello.version) < 0) {
  653. tlsError(c, EIllegalParameter, "incompatible version");
  654. goto Err;
  655. }
  656. if(c->version < ProtocolVersion
  657. && lookupid(m.u.clientHello.ciphers, TLS_FALLBACK_SCSV) >= 0){
  658. tlsError(c, EInappropriateFallback, "inappropriate fallback");
  659. goto Err;
  660. }
  661. cipher = okCipher(m.u.clientHello.ciphers, psklen > 0);
  662. if(cipher < 0 || !setAlgs(c, cipher)) {
  663. tlsError(c, EHandshakeFailure, "no matching cipher suite");
  664. goto Err;
  665. }
  666. compressor = okCompression(m.u.clientHello.compressors);
  667. if(compressor < 0) {
  668. tlsError(c, EHandshakeFailure, "no matching compressor");
  669. goto Err;
  670. }
  671. if(trace)
  672. trace(" cipher %x, compressor %x\n", cipher, compressor);
  673. tlsSecInits(c->sec, m.u.clientHello.version, m.u.clientHello.random);
  674. tlsSecVers(c->sec, c->version);
  675. if(psklen > 0){
  676. c->sec->psk = psk;
  677. c->sec->psklen = psklen;
  678. }
  679. if(certlen > 0){
  680. /* server certificate */
  681. c->sec->rsapub = X509toRSApub(cert, certlen, nil, 0);
  682. if(c->sec->rsapub == nil){
  683. tlsError(c, EHandshakeFailure, "invalid X509/rsa certificate");
  684. goto Err;
  685. }
  686. c->sec->rpc = factotum_rsa_open(c->sec->rsapub);
  687. if(c->sec->rpc == nil){
  688. tlsError(c, EHandshakeFailure, "factotum_rsa_open: %r");
  689. goto Err;
  690. }
  691. }
  692. msgClear(&m);
  693. m.tag = HServerHello;
  694. m.u.serverHello.version = c->version;
  695. memmove(m.u.serverHello.random, c->sec->srandom, RandomSize);
  696. m.u.serverHello.cipher = cipher;
  697. m.u.serverHello.compressor = compressor;
  698. m.u.serverHello.sid = makebytes(nil, 0);
  699. if(!msgSend(c, &m, AQueue))
  700. goto Err;
  701. if(certlen > 0){
  702. m.tag = HCertificate;
  703. numcerts = countchain(chp);
  704. m.u.certificate.ncert = 1 + numcerts;
  705. m.u.certificate.certs = emalloc(m.u.certificate.ncert * sizeof(Bytes*));
  706. m.u.certificate.certs[0] = makebytes(cert, certlen);
  707. for (i = 0; i < numcerts && chp; i++, chp = chp->next)
  708. m.u.certificate.certs[i+1] = makebytes(chp->pem, chp->pemlen);
  709. if(!msgSend(c, &m, AQueue))
  710. goto Err;
  711. }
  712. if(isECDHE(cipher)){
  713. Namedcurve *nc = &namedcurves[0]; /* secp256r1 */
  714. m.tag = HServerKeyExchange;
  715. m.u.serverKeyExchange.curve = nc->tlsid;
  716. m.u.serverKeyExchange.dh_parameters = tlsSecECDHEs1(c->sec, nc);
  717. if(m.u.serverKeyExchange.dh_parameters == nil){
  718. tlsError(c, EInternalError, "can't set DH parameters");
  719. goto Err;
  720. }
  721. /* sign the DH parameters */
  722. if(certlen > 0){
  723. uint8_t digest[MAXdlen];
  724. int digestlen;
  725. if(c->version >= TLS12Version)
  726. m.u.serverKeyExchange.sigalg = 0x0401; /* RSA SHA256 */
  727. digestlen = digestDHparams(c->sec, m.u.serverKeyExchange.dh_parameters,
  728. digest, m.u.serverKeyExchange.sigalg);
  729. if((m.u.serverKeyExchange.dh_signature = pkcs1_sign(c->sec, digest, digestlen,
  730. m.u.serverKeyExchange.sigalg)) == nil){
  731. tlsError(c, EHandshakeFailure, "pkcs1_sign: %r");
  732. goto Err;
  733. }
  734. }
  735. if(!msgSend(c, &m, AQueue))
  736. goto Err;
  737. }
  738. m.tag = HServerHelloDone;
  739. if(!msgSend(c, &m, AFlush))
  740. goto Err;
  741. if(!msgRecv(c, &m))
  742. goto Err;
  743. if(m.tag != HClientKeyExchange) {
  744. tlsError(c, EUnexpectedMessage, "expected a client key exchange");
  745. goto Err;
  746. }
  747. if(pskid != nil){
  748. if(m.u.clientKeyExchange.pskid == nil
  749. || m.u.clientKeyExchange.pskid->len != strlen(pskid)
  750. || memcmp(pskid, m.u.clientKeyExchange.pskid->data, m.u.clientKeyExchange.pskid->len) != 0){
  751. tlsError(c, EUnknownPSKidentity, "unknown or missing pskid");
  752. goto Err;
  753. }
  754. }
  755. if(isECDHE(cipher)){
  756. if(tlsSecECDHEs2(c->sec, m.u.clientKeyExchange.key) < 0){
  757. tlsError(c, EHandshakeFailure, "couldn't set keys: %r");
  758. goto Err;
  759. }
  760. } else if(certlen > 0){
  761. if(tlsSecRSAs(c->sec, m.u.clientKeyExchange.key) < 0){
  762. tlsError(c, EHandshakeFailure, "couldn't set keys: %r");
  763. goto Err;
  764. }
  765. } else if(psklen > 0){
  766. setMasterSecret(c->sec, newbytes(psklen));
  767. } else {
  768. tlsError(c, EInternalError, "no psk or certificate");
  769. goto Err;
  770. }
  771. if(trace)
  772. trace("tls secrets\n");
  773. if(setSecrets(c, 0) < 0){
  774. tlsError(c, EHandshakeFailure, "can't set secrets: %r");
  775. goto Err;
  776. }
  777. /* no CertificateVerify; skip to Finished */
  778. if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 1) < 0){
  779. tlsError(c, EInternalError, "can't set finished: %r");
  780. goto Err;
  781. }
  782. if(!msgRecv(c, &m))
  783. goto Err;
  784. if(m.tag != HFinished) {
  785. tlsError(c, EUnexpectedMessage, "expected a finished");
  786. goto Err;
  787. }
  788. if(!finishedMatch(c, &m.u.finished)) {
  789. tlsError(c, EHandshakeFailure, "finished verification failed");
  790. goto Err;
  791. }
  792. msgClear(&m);
  793. /* change cipher spec */
  794. if(fprint(c->ctl, "changecipher") < 0){
  795. tlsError(c, EInternalError, "can't enable cipher: %r");
  796. goto Err;
  797. }
  798. if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 0) < 0){
  799. tlsError(c, EInternalError, "can't set finished: %r");
  800. goto Err;
  801. }
  802. m.tag = HFinished;
  803. m.u.finished = c->finished;
  804. if(!msgSend(c, &m, AFlush))
  805. goto Err;
  806. if(trace)
  807. trace("tls finished\n");
  808. if(fprint(c->ctl, "opened") < 0)
  809. goto Err;
  810. return c;
  811. Err:
  812. msgClear(&m);
  813. tlsConnectionFree(c);
  814. return nil;
  815. }
  816. static Bytes*
  817. tlsSecDHEc(TlsSec *sec, Bytes *p, Bytes *g, Bytes *Ys)
  818. {
  819. DHstate *dh = &sec->dh;
  820. mpint *G, *P, *Y, *K;
  821. Bytes *Yc;
  822. if(p == nil || g == nil || Ys == nil)
  823. return nil;
  824. Yc = nil;
  825. P = bytestomp(p);
  826. G = bytestomp(g);
  827. Y = bytestomp(Ys);
  828. K = nil;
  829. if(dh_new(dh, P, nil, G) == nil)
  830. goto Out;
  831. Yc = mptobytes(dh->y);
  832. K = dh_finish(dh, Y); /* zeros dh */
  833. if(K == nil){
  834. freebytes(Yc);
  835. Yc = nil;
  836. goto Out;
  837. }
  838. setMasterSecret(sec, mptobytes(K));
  839. Out:
  840. mpfree(K);
  841. mpfree(Y);
  842. mpfree(G);
  843. mpfree(P);
  844. return Yc;
  845. }
  846. static Bytes*
  847. tlsSecECDHEc(TlsSec *sec, int curve, Bytes *Ys)
  848. {
  849. ECdomain *dom = &sec->ec.dom;
  850. ECpriv *Q = &sec->ec.Q;
  851. Namedcurve *nc;
  852. ECpub *pub;
  853. ECpoint K;
  854. Bytes *Yc;
  855. if(Ys == nil)
  856. return nil;
  857. for(nc = namedcurves; nc != &namedcurves[nelem(namedcurves)]; nc++)
  858. if(nc->tlsid == curve)
  859. goto Found;
  860. return nil;
  861. Found:
  862. ecdominit(dom, nc->init);
  863. pub = ecdecodepub(dom, Ys->data, Ys->len);
  864. if(pub == nil)
  865. return nil;
  866. memset(Q, 0, sizeof(*Q));
  867. Q->ecpoint.x = mpnew(0);
  868. Q->ecpoint.y = mpnew(0);
  869. Q->d = mpnew(0);
  870. memset(&K, 0, sizeof(K));
  871. K.x = mpnew(0);
  872. K.y = mpnew(0);
  873. ecgen(dom, Q);
  874. ecmul(dom, pub, Q->d, &K);
  875. setMasterSecret(sec, mptobytes(K.x));
  876. Yc = newbytes(1 + 2*((mpsignif(dom->p)+7)/8));
  877. ECpub *aux = &Q->ecpoint;
  878. Yc->len = ecencodepub(dom, aux, Yc->data, Yc->len);
  879. mpfree(K.x);
  880. mpfree(K.y);
  881. ecpubfree(pub);
  882. return Yc;
  883. }
  884. static TlsConnection *
  885. tlsClient2(int ctl, int hand,
  886. uint8_t *cert, int certlen,
  887. char *pskid, uint8_t *psk, int psklen,
  888. uint8_t *ext, int extlen,
  889. int (*trace)(char*fmt, ...))
  890. {
  891. int creq, dhx, cipher;
  892. TlsConnection *c;
  893. Bytes *epm;
  894. Msg m;
  895. if(!initCiphers())
  896. return nil;
  897. epm = nil;
  898. memset(&m, 0, sizeof(m));
  899. c = emalloc(sizeof(TlsConnection));
  900. c->ctl = ctl;
  901. c->hand = hand;
  902. c->trace = trace;
  903. c->cert = nil;
  904. c->version = ProtocolVersion;
  905. tlsSecInitc(c->sec, c->version);
  906. if(psklen > 0){
  907. c->sec->psk = psk;
  908. c->sec->psklen = psklen;
  909. }
  910. if(certlen > 0){
  911. /* client certificate */
  912. c->sec->rsapub = X509toRSApub(cert, certlen, nil, 0);
  913. if(c->sec->rsapub == nil){
  914. tlsError(c, EInternalError, "invalid X509/rsa certificate");
  915. goto Err;
  916. }
  917. c->sec->rpc = factotum_rsa_open(c->sec->rsapub);
  918. if(c->sec->rpc == nil){
  919. tlsError(c, EInternalError, "factotum_rsa_open: %r");
  920. goto Err;
  921. }
  922. }
  923. /* client hello */
  924. m.tag = HClientHello;
  925. m.u.clientHello.version = c->version;
  926. memmove(m.u.clientHello.random, c->sec->crandom, RandomSize);
  927. m.u.clientHello.sid = makebytes(nil, 0);
  928. m.u.clientHello.ciphers = makeciphers(psklen > 0);
  929. m.u.clientHello.compressors = makebytes(compressors,sizeof(compressors));
  930. m.u.clientHello.extensions = makebytes(ext, extlen);
  931. if(!msgSend(c, &m, AFlush))
  932. goto Err;
  933. /* server hello */
  934. if(!msgRecv(c, &m))
  935. goto Err;
  936. if(m.tag != HServerHello) {
  937. tlsError(c, EUnexpectedMessage, "expected a server hello");
  938. goto Err;
  939. }
  940. if(setVersion(c, m.u.serverHello.version) < 0) {
  941. tlsError(c, EIllegalParameter, "incompatible version: %r");
  942. goto Err;
  943. }
  944. tlsSecVers(c->sec, c->version);
  945. memmove(c->sec->srandom, m.u.serverHello.random, RandomSize);
  946. cipher = m.u.serverHello.cipher;
  947. if((psklen > 0) != isPSK(cipher) || !setAlgs(c, cipher)) {
  948. tlsError(c, EIllegalParameter, "invalid cipher suite");
  949. goto Err;
  950. }
  951. if(m.u.serverHello.compressor != CompressionNull) {
  952. tlsError(c, EIllegalParameter, "invalid compression");
  953. goto Err;
  954. }
  955. dhx = isDHE(cipher) || isECDHE(cipher);
  956. if(!msgRecv(c, &m))
  957. goto Err;
  958. if(m.tag == HCertificate){
  959. if(m.u.certificate.ncert < 1) {
  960. tlsError(c, EIllegalParameter, "runt certificate");
  961. goto Err;
  962. }
  963. c->cert = makebytes(m.u.certificate.certs[0]->data, m.u.certificate.certs[0]->len);
  964. if(!msgRecv(c, &m))
  965. goto Err;
  966. } else if(psklen == 0) {
  967. tlsError(c, EUnexpectedMessage, "expected a certificate");
  968. goto Err;
  969. }
  970. if(m.tag == HServerKeyExchange) {
  971. if(dhx){
  972. char *err = verifyDHparams(c->sec,
  973. m.u.serverKeyExchange.dh_parameters,
  974. c->cert,
  975. m.u.serverKeyExchange.dh_signature,
  976. c->version<TLS12Version ? 0x01 : m.u.serverKeyExchange.sigalg);
  977. if(err != nil){
  978. tlsError(c, EBadCertificate, "can't verify DH parameters: %s", err);
  979. goto Err;
  980. }
  981. if(isECDHE(cipher))
  982. epm = tlsSecECDHEc(c->sec,
  983. m.u.serverKeyExchange.curve,
  984. m.u.serverKeyExchange.dh_Ys);
  985. else
  986. epm = tlsSecDHEc(c->sec,
  987. m.u.serverKeyExchange.dh_p,
  988. m.u.serverKeyExchange.dh_g,
  989. m.u.serverKeyExchange.dh_Ys);
  990. if(epm == nil){
  991. tlsError(c, EHandshakeFailure, "bad DH parameters");
  992. goto Err;
  993. }
  994. } else if(psklen == 0){
  995. tlsError(c, EUnexpectedMessage, "got an server key exchange");
  996. goto Err;
  997. }
  998. if(!msgRecv(c, &m))
  999. goto Err;
  1000. } else if(dhx){
  1001. tlsError(c, EUnexpectedMessage, "expected server key exchange");
  1002. goto Err;
  1003. }
  1004. /* certificate request (optional) */
  1005. creq = 0;
  1006. if(m.tag == HCertificateRequest) {
  1007. creq = 1;
  1008. if(!msgRecv(c, &m))
  1009. goto Err;
  1010. }
  1011. if(m.tag != HServerHelloDone) {
  1012. tlsError(c, EUnexpectedMessage, "expected a server hello done");
  1013. goto Err;
  1014. }
  1015. msgClear(&m);
  1016. if(!dhx){
  1017. if(c->cert != nil){
  1018. epm = tlsSecRSAc(c->sec, c->cert->data, c->cert->len);
  1019. if(epm == nil){
  1020. tlsError(c, EBadCertificate, "bad certificate: %r");
  1021. goto Err;
  1022. }
  1023. } else if(psklen > 0){
  1024. setMasterSecret(c->sec, newbytes(psklen));
  1025. } else {
  1026. tlsError(c, EInternalError, "no psk or certificate");
  1027. goto Err;
  1028. }
  1029. }
  1030. if(trace)
  1031. trace("tls secrets\n");
  1032. if(setSecrets(c, 1) < 0){
  1033. tlsError(c, EHandshakeFailure, "can't set secrets: %r");
  1034. goto Err;
  1035. }
  1036. if(creq) {
  1037. m.tag = HCertificate;
  1038. if(certlen > 0){
  1039. m.u.certificate.ncert = 1;
  1040. m.u.certificate.certs = emalloc(m.u.certificate.ncert * sizeof(Bytes*));
  1041. m.u.certificate.certs[0] = makebytes(cert, certlen);
  1042. }
  1043. if(!msgSend(c, &m, AFlush))
  1044. goto Err;
  1045. }
  1046. /* client key exchange */
  1047. m.tag = HClientKeyExchange;
  1048. if(psklen > 0){
  1049. if(pskid == nil)
  1050. pskid = "";
  1051. m.u.clientKeyExchange.pskid = makebytes((uint8_t*)pskid, strlen(pskid));
  1052. }
  1053. m.u.clientKeyExchange.key = epm;
  1054. epm = nil;
  1055. if(!msgSend(c, &m, AFlush))
  1056. goto Err;
  1057. /* certificate verify */
  1058. if(creq && certlen > 0) {
  1059. HandshakeHash hsave;
  1060. uint8_t digest[MAXdlen];
  1061. int digestlen;
  1062. /* save the state for the Finish message */
  1063. hsave = c->handhash;
  1064. if(c->version < TLS12Version){
  1065. md5(nil, 0, digest, &c->handhash.md5);
  1066. sha1(nil, 0, digest+MD5dlen, &c->handhash.sha1);
  1067. digestlen = MD5dlen+SHA1dlen;
  1068. } else {
  1069. m.u.certificateVerify.sigalg = 0x0401; /* RSA SHA256 */
  1070. sha2_256(nil, 0, digest, &c->handhash.sha2_256);
  1071. digestlen = SHA2_256dlen;
  1072. }
  1073. c->handhash = hsave;
  1074. if((m.u.certificateVerify.signature = pkcs1_sign(c->sec, digest, digestlen,
  1075. m.u.certificateVerify.sigalg)) == nil){
  1076. tlsError(c, EHandshakeFailure, "pkcs1_sign: %r");
  1077. goto Err;
  1078. }
  1079. m.tag = HCertificateVerify;
  1080. if(!msgSend(c, &m, AFlush))
  1081. goto Err;
  1082. }
  1083. /* change cipher spec */
  1084. if(fprint(c->ctl, "changecipher") < 0){
  1085. tlsError(c, EInternalError, "can't enable cipher: %r");
  1086. goto Err;
  1087. }
  1088. // Cipherchange must occur immediately before Finished to avoid
  1089. // potential hole; see section 4.3 of Wagner Schneier 1996.
  1090. if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 1) < 0){
  1091. tlsError(c, EInternalError, "can't set finished 1: %r");
  1092. goto Err;
  1093. }
  1094. m.tag = HFinished;
  1095. m.u.finished = c->finished;
  1096. if(!msgSend(c, &m, AFlush)) {
  1097. tlsError(c, EInternalError, "can't flush after client Finished: %r");
  1098. goto Err;
  1099. }
  1100. if(tlsSecFinished(c->sec, c->handhash, c->finished.verify, c->finished.n, 0) < 0){
  1101. tlsError(c, EInternalError, "can't set finished 0: %r");
  1102. goto Err;
  1103. }
  1104. if(!msgRecv(c, &m)) {
  1105. tlsError(c, EInternalError, "can't read server Finished: %r");
  1106. goto Err;
  1107. }
  1108. if(m.tag != HFinished) {
  1109. tlsError(c, EUnexpectedMessage, "expected a Finished msg from server");
  1110. goto Err;
  1111. }
  1112. if(!finishedMatch(c, &m.u.finished)) {
  1113. tlsError(c, EHandshakeFailure, "finished verification failed");
  1114. goto Err;
  1115. }
  1116. msgClear(&m);
  1117. if(fprint(c->ctl, "opened") < 0){
  1118. if(trace)
  1119. trace("unable to do final open: %r\n");
  1120. goto Err;
  1121. }
  1122. return c;
  1123. Err:
  1124. free(epm);
  1125. msgClear(&m);
  1126. tlsConnectionFree(c);
  1127. return nil;
  1128. }
  1129. //================= message functions ========================
  1130. static void
  1131. msgHash(TlsConnection *c, uint8_t *p, int n)
  1132. {
  1133. md5(p, n, 0, &c->handhash.md5);
  1134. sha1(p, n, 0, &c->handhash.sha1);
  1135. if(c->version >= TLS12Version)
  1136. sha2_256(p, n, 0, &c->handhash.sha2_256);
  1137. }
  1138. static int
  1139. msgSend(TlsConnection *c, Msg *m, int act)
  1140. {
  1141. uint8_t *p; // sendp = start of new message; p = write pointer
  1142. int nn, n, i;
  1143. if(c->sendp == nil)
  1144. c->sendp = c->sendbuf;
  1145. p = c->sendp;
  1146. if(c->trace)
  1147. c->trace("send %s", msgPrint((char*)p, (sizeof(c->sendbuf)) - (p - c->sendbuf), m));
  1148. p[0] = m->tag; // header - fill in size later
  1149. p += 4;
  1150. switch(m->tag) {
  1151. default:
  1152. tlsError(c, EInternalError, "can't encode a %d", m->tag);
  1153. goto Err;
  1154. case HClientHello:
  1155. // version
  1156. put16(p, m->u.clientHello.version);
  1157. p += 2;
  1158. // random
  1159. memmove(p, m->u.clientHello.random, RandomSize);
  1160. p += RandomSize;
  1161. // sid
  1162. n = m->u.clientHello.sid->len;
  1163. p[0] = n;
  1164. memmove(p+1, m->u.clientHello.sid->data, n);
  1165. p += n+1;
  1166. n = m->u.clientHello.ciphers->len;
  1167. put16(p, n*2);
  1168. p += 2;
  1169. for(i=0; i<n; i++) {
  1170. put16(p, m->u.clientHello.ciphers->data[i]);
  1171. p += 2;
  1172. }
  1173. n = m->u.clientHello.compressors->len;
  1174. p[0] = n;
  1175. memmove(p+1, m->u.clientHello.compressors->data, n);
  1176. p += n+1;
  1177. if(m->u.clientHello.extensions == nil)
  1178. break;
  1179. n = m->u.clientHello.extensions->len;
  1180. if(n == 0)
  1181. break;
  1182. put16(p, n);
  1183. memmove(p+2, m->u.clientHello.extensions->data, n);
  1184. p += n+2;
  1185. break;
  1186. case HServerHello:
  1187. put16(p, m->u.serverHello.version);
  1188. p += 2;
  1189. // random
  1190. memmove(p, m->u.serverHello.random, RandomSize);
  1191. p += RandomSize;
  1192. // sid
  1193. n = m->u.serverHello.sid->len;
  1194. p[0] = n;
  1195. memmove(p+1, m->u.serverHello.sid->data, n);
  1196. p += n+1;
  1197. put16(p, m->u.serverHello.cipher);
  1198. p += 2;
  1199. p[0] = m->u.serverHello.compressor;
  1200. p += 1;
  1201. if(m->u.serverHello.extensions == nil)
  1202. break;
  1203. n = m->u.serverHello.extensions->len;
  1204. if(n == 0)
  1205. break;
  1206. put16(p, n);
  1207. memmove(p+2, m->u.serverHello.extensions->data, n);
  1208. p += n+2;
  1209. break;
  1210. case HServerHelloDone:
  1211. break;
  1212. case HCertificate:
  1213. nn = 0;
  1214. for(i = 0; i < m->u.certificate.ncert; i++)
  1215. nn += 3 + m->u.certificate.certs[i]->len;
  1216. if(p + 3 + nn - c->sendbuf > sizeof(c->sendbuf)) {
  1217. tlsError(c, EInternalError, "output buffer too small for certificate");
  1218. goto Err;
  1219. }
  1220. put24(p, nn);
  1221. p += 3;
  1222. for(i = 0; i < m->u.certificate.ncert; i++){
  1223. put24(p, m->u.certificate.certs[i]->len);
  1224. p += 3;
  1225. memmove(p, m->u.certificate.certs[i]->data, m->u.certificate.certs[i]->len);
  1226. p += m->u.certificate.certs[i]->len;
  1227. }
  1228. break;
  1229. case HCertificateVerify:
  1230. if(m->u.certificateVerify.sigalg != 0){
  1231. put16(p, m->u.certificateVerify.sigalg);
  1232. p += 2;
  1233. }
  1234. put16(p, m->u.certificateVerify.signature->len);
  1235. p += 2;
  1236. memmove(p, m->u.certificateVerify.signature->data, m->u.certificateVerify.signature->len);
  1237. p += m->u.certificateVerify.signature->len;
  1238. break;
  1239. case HServerKeyExchange:
  1240. if(m->u.serverKeyExchange.pskid != nil){
  1241. n = m->u.serverKeyExchange.pskid->len;
  1242. put16(p, n);
  1243. p += 2;
  1244. memmove(p, m->u.serverKeyExchange.pskid->data, n);
  1245. p += n;
  1246. }
  1247. if(m->u.serverKeyExchange.dh_parameters == nil)
  1248. break;
  1249. n = m->u.serverKeyExchange.dh_parameters->len;
  1250. memmove(p, m->u.serverKeyExchange.dh_parameters->data, n);
  1251. p += n;
  1252. if(m->u.serverKeyExchange.dh_signature == nil)
  1253. break;
  1254. if(c->version >= TLS12Version){
  1255. put16(p, m->u.serverKeyExchange.sigalg);
  1256. p += 2;
  1257. }
  1258. n = m->u.serverKeyExchange.dh_signature->len;
  1259. put16(p, n), p += 2;
  1260. memmove(p, m->u.serverKeyExchange.dh_signature->data, n);
  1261. p += n;
  1262. break;
  1263. case HClientKeyExchange:
  1264. if(m->u.clientKeyExchange.pskid != nil){
  1265. n = m->u.clientKeyExchange.pskid->len;
  1266. put16(p, n);
  1267. p += 2;
  1268. memmove(p, m->u.clientKeyExchange.pskid->data, n);
  1269. p += n;
  1270. }
  1271. if(m->u.clientKeyExchange.key == nil)
  1272. break;
  1273. n = m->u.clientKeyExchange.key->len;
  1274. if(c->version != SSL3Version){
  1275. if(isECDHE(c->cipher))
  1276. *p++ = n;
  1277. else
  1278. put16(p, n), p += 2;
  1279. }
  1280. memmove(p, m->u.clientKeyExchange.key->data, n);
  1281. p += n;
  1282. break;
  1283. case HFinished:
  1284. memmove(p, m->u.finished.verify, m->u.finished.n);
  1285. p += m->u.finished.n;
  1286. break;
  1287. }
  1288. // go back and fill in size
  1289. n = p - c->sendp;
  1290. assert(n <= sizeof(c->sendbuf));
  1291. put24(c->sendp+1, n-4);
  1292. // remember hash of Handshake messages
  1293. if(m->tag != HHelloRequest)
  1294. msgHash(c, c->sendp, n);
  1295. c->sendp = p;
  1296. if(act == AFlush){
  1297. c->sendp = c->sendbuf;
  1298. if(write(c->hand, c->sendbuf, p - c->sendbuf) < 0){
  1299. fprint(2, "write error: %r\n");
  1300. goto Err;
  1301. }
  1302. }
  1303. msgClear(m);
  1304. return 1;
  1305. Err:
  1306. msgClear(m);
  1307. return 0;
  1308. }
  1309. static uint8_t*
  1310. tlsReadN(TlsConnection *c, int n)
  1311. {
  1312. uint8_t *p;
  1313. int nn, nr;
  1314. nn = c->ep - c->rp;
  1315. if(nn < n){
  1316. if(c->rp != c->recvbuf){
  1317. memmove(c->recvbuf, c->rp, nn);
  1318. c->rp = c->recvbuf;
  1319. c->ep = &c->recvbuf[nn];
  1320. }
  1321. for(; nn < n; nn += nr) {
  1322. nr = read(c->hand, &c->rp[nn], n - nn);
  1323. if(nr <= 0)
  1324. return nil;
  1325. c->ep += nr;
  1326. }
  1327. }
  1328. p = c->rp;
  1329. c->rp += n;
  1330. return p;
  1331. }
  1332. static int
  1333. msgRecv(TlsConnection *c, Msg *m)
  1334. {
  1335. uint8_t *p, *s;
  1336. int type, n, nn, i;
  1337. msgClear(m);
  1338. for(;;) {
  1339. p = tlsReadN(c, 4);
  1340. if(p == nil)
  1341. return 0;
  1342. type = p[0];
  1343. n = get24(p+1);
  1344. if(type != HHelloRequest)
  1345. break;
  1346. if(n != 0) {
  1347. tlsError(c, EDecodeError, "invalid hello request during handshake");
  1348. return 0;
  1349. }
  1350. }
  1351. if(n > sizeof(c->recvbuf)) {
  1352. tlsError(c, EDecodeError, "handshake message too long %d %d", n, sizeof(c->recvbuf));
  1353. return 0;
  1354. }
  1355. if(type == HSSL2ClientHello){
  1356. /* Cope with an SSL3 ClientHello expressed in SSL2 record format.
  1357. This is sent by some clients that we must interoperate
  1358. with, such as Java's JSSE and Microsoft's Internet Explorer. */
  1359. int nsid, nrandom, nciph;
  1360. p = tlsReadN(c, n);
  1361. if(p == nil)
  1362. return 0;
  1363. msgHash(c, p, n);
  1364. m->tag = HClientHello;
  1365. if(n < 22)
  1366. goto Short;
  1367. m->u.clientHello.version = get16(p+1);
  1368. p += 3;
  1369. n -= 3;
  1370. nn = get16(p); /* cipher_spec_len */
  1371. nsid = get16(p + 2);
  1372. nrandom = get16(p + 4);
  1373. p += 6;
  1374. n -= 6;
  1375. if(nsid != 0 /* no sid's, since shouldn't restart using ssl2 header */
  1376. || nrandom < 16 || nn % 3)
  1377. goto Err;
  1378. if(c->trace && (n - nrandom != nn))
  1379. c->trace("n-nrandom!=nn: n=%d nrandom=%d nn=%d\n", n, nrandom, nn);
  1380. /* ignore ssl2 ciphers and look for {0x00, ssl3 cipher} */
  1381. nciph = 0;
  1382. for(i = 0; i < nn; i += 3)
  1383. if(p[i] == 0)
  1384. nciph++;
  1385. m->u.clientHello.ciphers = newints(nciph);
  1386. nciph = 0;
  1387. for(i = 0; i < nn; i += 3)
  1388. if(p[i] == 0)
  1389. m->u.clientHello.ciphers->data[nciph++] = get16(&p[i + 1]);
  1390. p += nn;
  1391. m->u.clientHello.sid = makebytes(nil, 0);
  1392. if(nrandom > RandomSize)
  1393. nrandom = RandomSize;
  1394. memset(m->u.clientHello.random, 0, RandomSize - nrandom);
  1395. memmove(&m->u.clientHello.random[RandomSize - nrandom], p, nrandom);
  1396. m->u.clientHello.compressors = newbytes(1);
  1397. m->u.clientHello.compressors->data[0] = CompressionNull;
  1398. goto Ok;
  1399. }
  1400. msgHash(c, p, 4);
  1401. p = tlsReadN(c, n);
  1402. if(p == nil)
  1403. return 0;
  1404. msgHash(c, p, n);
  1405. m->tag = type;
  1406. switch(type) {
  1407. default:
  1408. tlsError(c, EUnexpectedMessage, "can't decode a %d", type);
  1409. goto Err;
  1410. case HClientHello:
  1411. if(n < 2)
  1412. goto Short;
  1413. m->u.clientHello.version = get16(p);
  1414. p += 2, n -= 2;
  1415. if(n < RandomSize)
  1416. goto Short;
  1417. memmove(m->u.clientHello.random, p, RandomSize);
  1418. p += RandomSize, n -= RandomSize;
  1419. if(n < 1 || n < p[0]+1)
  1420. goto Short;
  1421. m->u.clientHello.sid = makebytes(p+1, p[0]);
  1422. p += m->u.clientHello.sid->len+1;
  1423. n -= m->u.clientHello.sid->len+1;
  1424. if(n < 2)
  1425. goto Short;
  1426. nn = get16(p);
  1427. p += 2, n -= 2;
  1428. if((nn & 1) || n < nn || nn < 2)
  1429. goto Short;
  1430. m->u.clientHello.ciphers = newints(nn >> 1);
  1431. for(i = 0; i < nn; i += 2)
  1432. m->u.clientHello.ciphers->data[i >> 1] = get16(&p[i]);
  1433. p += nn, n -= nn;
  1434. if(n < 1 || n < p[0]+1 || p[0] == 0)
  1435. goto Short;
  1436. nn = p[0];
  1437. m->u.clientHello.compressors = makebytes(p+1, nn);
  1438. p += nn + 1, n -= nn + 1;
  1439. if(n < 2)
  1440. break;
  1441. nn = get16(p);
  1442. if(nn > n-2)
  1443. goto Short;
  1444. m->u.clientHello.extensions = makebytes(p+2, nn);
  1445. n -= nn + 2;
  1446. break;
  1447. case HServerHello:
  1448. if(n < 2)
  1449. goto Short;
  1450. m->u.serverHello.version = get16(p);
  1451. p += 2, n -= 2;
  1452. if(n < RandomSize)
  1453. goto Short;
  1454. memmove(m->u.serverHello.random, p, RandomSize);
  1455. p += RandomSize, n -= RandomSize;
  1456. if(n < 1 || n < p[0]+1)
  1457. goto Short;
  1458. m->u.serverHello.sid = makebytes(p+1, p[0]);
  1459. p += m->u.serverHello.sid->len+1;
  1460. n -= m->u.serverHello.sid->len+1;
  1461. if(n < 3)
  1462. goto Short;
  1463. m->u.serverHello.cipher = get16(p);
  1464. m->u.serverHello.compressor = p[2];
  1465. p += 3, n -= 3;
  1466. if(n < 2)
  1467. break;
  1468. nn = get16(p);
  1469. if(nn > n-2)
  1470. goto Short;
  1471. m->u.serverHello.extensions = makebytes(p+2, nn);
  1472. n -= nn + 2;
  1473. break;
  1474. case HCertificate:
  1475. if(n < 3)
  1476. goto Short;
  1477. nn = get24(p);
  1478. p += 3, n -= 3;
  1479. if(nn == 0 && n > 0)
  1480. goto Short;
  1481. /* certs */
  1482. i = 0;
  1483. while(n > 0) {
  1484. if(n < 3)
  1485. goto Short;
  1486. nn = get24(p);
  1487. p += 3, n -= 3;
  1488. if(nn > n)
  1489. goto Short;
  1490. m->u.certificate.ncert = i+1;
  1491. m->u.certificate.certs = erealloc(m->u.certificate.certs, (i+1)*sizeof(Bytes*));
  1492. m->u.certificate.certs[i] = makebytes(p, nn);
  1493. p += nn, n -= nn;
  1494. i++;
  1495. }
  1496. break;
  1497. case HCertificateRequest:
  1498. if(n < 1)
  1499. goto Short;
  1500. nn = p[0];
  1501. p++, n--;
  1502. if(nn > n)
  1503. goto Short;
  1504. m->u.certificateRequest.types = makebytes(p, nn);
  1505. p += nn, n -= nn;
  1506. if(c->version >= TLS12Version){
  1507. if(n < 2)
  1508. goto Short;
  1509. nn = get16(p);
  1510. p += 2, n -= 2;
  1511. if(nn & 1)
  1512. goto Short;
  1513. m->u.certificateRequest.sigalgs = newints(nn>>1);
  1514. for(i = 0; i < nn; i += 2)
  1515. m->u.certificateRequest.sigalgs->data[i >> 1] = get16(&p[i]);
  1516. p += nn, n -= nn;
  1517. }
  1518. if(n < 2)
  1519. goto Short;
  1520. nn = get16(p);
  1521. p += 2, n -= 2;
  1522. /* nn == 0 can happen; yahoo's servers do it */
  1523. if(nn != n)
  1524. goto Short;
  1525. /* cas */
  1526. i = 0;
  1527. while(n > 0) {
  1528. if(n < 2)
  1529. goto Short;
  1530. nn = get16(p);
  1531. p += 2, n -= 2;
  1532. if(nn < 1 || nn > n)
  1533. goto Short;
  1534. m->u.certificateRequest.nca = i+1;
  1535. m->u.certificateRequest.cas = erealloc(
  1536. m->u.certificateRequest.cas, (i+1)*sizeof(Bytes*));
  1537. m->u.certificateRequest.cas[i] = makebytes(p, nn);
  1538. p += nn, n -= nn;
  1539. i++;
  1540. }
  1541. break;
  1542. case HServerHelloDone:
  1543. break;
  1544. case HServerKeyExchange:
  1545. if(isPSK(c->cipher)){
  1546. if(n < 2)
  1547. goto Short;
  1548. nn = get16(p);
  1549. p += 2, n -= 2;
  1550. if(nn > n)
  1551. goto Short;
  1552. m->u.serverKeyExchange.pskid = makebytes(p, nn);
  1553. p += nn, n -= nn;
  1554. if(n == 0)
  1555. break;
  1556. }
  1557. if(n < 2)
  1558. goto Short;
  1559. s = p;
  1560. if(isECDHE(c->cipher)){
  1561. nn = *p;
  1562. p++, n--;
  1563. if(nn != 3 || nn > n) /* not a named curve */
  1564. goto Short;
  1565. nn = get16(p);
  1566. p += 2, n -= 2;
  1567. m->u.serverKeyExchange.curve = nn;
  1568. nn = *p++, n--;
  1569. if(nn < 1 || nn > n)
  1570. goto Short;
  1571. m->u.serverKeyExchange.dh_Ys = makebytes(p, nn);
  1572. p += nn, n -= nn;
  1573. }else if(isDHE(c->cipher)){
  1574. nn = get16(p);
  1575. p += 2, n -= 2;
  1576. if(nn < 1 || nn > n)
  1577. goto Short;
  1578. m->u.serverKeyExchange.dh_p = makebytes(p, nn);
  1579. p += nn, n -= nn;
  1580. if(n < 2)
  1581. goto Short;
  1582. nn = get16(p);
  1583. p += 2, n -= 2;
  1584. if(nn < 1 || nn > n)
  1585. goto Short;
  1586. m->u.serverKeyExchange.dh_g = makebytes(p, nn);
  1587. p += nn, n -= nn;
  1588. if(n < 2)
  1589. goto Short;
  1590. nn = get16(p);
  1591. p += 2, n -= 2;
  1592. if(nn < 1 || nn > n)
  1593. goto Short;
  1594. m->u.serverKeyExchange.dh_Ys = makebytes(p, nn);
  1595. p += nn, n -= nn;
  1596. } else {
  1597. /* should not happen */
  1598. goto Short;
  1599. }
  1600. m->u.serverKeyExchange.dh_parameters = makebytes(s, p - s);
  1601. if(n >= 2){
  1602. m->u.serverKeyExchange.sigalg = 0;
  1603. if(c->version >= TLS12Version){
  1604. m->u.serverKeyExchange.sigalg = get16(p);
  1605. p += 2, n -= 2;
  1606. if(n < 2)
  1607. goto Short;
  1608. }
  1609. nn = get16(p);
  1610. p += 2, n -= 2;
  1611. if(nn > 0 && nn <= n){
  1612. m->u.serverKeyExchange.dh_signature = makebytes(p, nn);
  1613. n -= nn;
  1614. }
  1615. }
  1616. break;
  1617. case HClientKeyExchange:
  1618. if(isPSK(c->cipher)){
  1619. if(n < 2)
  1620. goto Short;
  1621. nn = get16(p);
  1622. p += 2, n -= 2;
  1623. if(nn > n)
  1624. goto Short;
  1625. m->u.clientKeyExchange.pskid = makebytes(p, nn);
  1626. p += nn, n -= nn;
  1627. if(n == 0)
  1628. break;
  1629. }
  1630. if(c->version == SSL3Version)
  1631. nn = n;
  1632. else{
  1633. if(n < 2)
  1634. goto Short;
  1635. if(isECDHE(c->cipher))
  1636. nn = *p++, n--;
  1637. else {
  1638. nn = get16(p);
  1639. p += 2, n -= 2;
  1640. }
  1641. }
  1642. if(n < nn)
  1643. goto Short;
  1644. m->u.clientKeyExchange.key = makebytes(p, nn);
  1645. n -= nn;
  1646. break;
  1647. case HFinished:
  1648. m->u.finished.n = c->finished.n;
  1649. if(n < m->u.finished.n)
  1650. goto Short;
  1651. memmove(m->u.finished.verify, p, m->u.finished.n);
  1652. n -= m->u.finished.n;
  1653. break;
  1654. }
  1655. if(type != HClientHello && type != HServerHello && n != 0)
  1656. goto Short;
  1657. Ok:
  1658. if(c->trace){
  1659. char *buf;
  1660. buf = emalloc(8000);
  1661. c->trace("recv %s", msgPrint(buf, 8000, m));
  1662. free(buf);
  1663. }
  1664. return 1;
  1665. Short:
  1666. tlsError(c, EDecodeError, "handshake message (%d) has invalid length", type);
  1667. Err:
  1668. msgClear(m);
  1669. return 0;
  1670. }
  1671. static void
  1672. msgClear(Msg *m)
  1673. {
  1674. int i;
  1675. switch(m->tag) {
  1676. case HHelloRequest:
  1677. break;
  1678. case HClientHello:
  1679. freebytes(m->u.clientHello.sid);
  1680. freeints(m->u.clientHello.ciphers);
  1681. freebytes(m->u.clientHello.compressors);
  1682. freebytes(m->u.clientHello.extensions);
  1683. break;
  1684. case HServerHello:
  1685. freebytes(m->u.serverHello.sid);
  1686. freebytes(m->u.serverHello.extensions);
  1687. break;
  1688. case HCertificate:
  1689. for(i=0; i<m->u.certificate.ncert; i++)
  1690. freebytes(m->u.certificate.certs[i]);
  1691. free(m->u.certificate.certs);
  1692. break;
  1693. case HCertificateRequest:
  1694. freebytes(m->u.certificateRequest.types);
  1695. freeints(m->u.certificateRequest.sigalgs);
  1696. for(i=0; i<m->u.certificateRequest.nca; i++)
  1697. freebytes(m->u.certificateRequest.cas[i]);
  1698. free(m->u.certificateRequest.cas);
  1699. break;
  1700. case HCertificateVerify:
  1701. freebytes(m->u.certificateVerify.signature);
  1702. break;
  1703. case HServerHelloDone:
  1704. break;
  1705. case HServerKeyExchange:
  1706. freebytes(m->u.serverKeyExchange.pskid);
  1707. freebytes(m->u.serverKeyExchange.dh_p);
  1708. freebytes(m->u.serverKeyExchange.dh_g);
  1709. freebytes(m->u.serverKeyExchange.dh_Ys);
  1710. freebytes(m->u.serverKeyExchange.dh_parameters);
  1711. freebytes(m->u.serverKeyExchange.dh_signature);
  1712. break;
  1713. case HClientKeyExchange:
  1714. freebytes(m->u.clientKeyExchange.pskid);
  1715. freebytes(m->u.clientKeyExchange.key);
  1716. break;
  1717. case HFinished:
  1718. break;
  1719. }
  1720. memset(m, 0, sizeof(Msg));
  1721. }
  1722. static char *
  1723. bytesPrint(char *bs, char *be, char *s0, Bytes *b, char *s1)
  1724. {
  1725. int i;
  1726. if(s0)
  1727. bs = seprint(bs, be, "%s", s0);
  1728. if(b == nil)
  1729. bs = seprint(bs, be, "nil");
  1730. else {
  1731. bs = seprint(bs, be, "<%d> [ ", b->len);
  1732. for(i=0; i<b->len; i++)
  1733. bs = seprint(bs, be, "%.2x ", b->data[i]);
  1734. bs = seprint(bs, be, "]");
  1735. }
  1736. if(s1)
  1737. bs = seprint(bs, be, "%s", s1);
  1738. return bs;
  1739. }
  1740. static char *
  1741. intsPrint(char *bs, char *be, char *s0, Ints *b, char *s1)
  1742. {
  1743. int i;
  1744. if(s0)
  1745. bs = seprint(bs, be, "%s", s0);
  1746. if(b == nil)
  1747. bs = seprint(bs, be, "nil");
  1748. else {
  1749. bs = seprint(bs, be, "[ ");
  1750. for(i=0; i<b->len; i++)
  1751. bs = seprint(bs, be, "%x ", b->data[i]);
  1752. bs = seprint(bs, be, "]");
  1753. }
  1754. if(s1)
  1755. bs = seprint(bs, be, "%s", s1);
  1756. return bs;
  1757. }
  1758. static char*
  1759. msgPrint(char *buf, int n, Msg *m)
  1760. {
  1761. int i;
  1762. char *bs = buf, *be = buf+n;
  1763. switch(m->tag) {
  1764. default:
  1765. bs = seprint(bs, be, "unknown %d\n", m->tag);
  1766. break;
  1767. case HClientHello:
  1768. bs = seprint(bs, be, "ClientHello\n");
  1769. bs = seprint(bs, be, "\tversion: %.4x\n", m->u.clientHello.version);
  1770. bs = seprint(bs, be, "\trandom: ");
  1771. for(i=0; i<RandomSize; i++)
  1772. bs = seprint(bs, be, "%.2x", m->u.clientHello.random[i]);
  1773. bs = seprint(bs, be, "\n");
  1774. bs = bytesPrint(bs, be, "\tsid: ", m->u.clientHello.sid, "\n");
  1775. bs = intsPrint(bs, be, "\tciphers: ", m->u.clientHello.ciphers, "\n");
  1776. bs = bytesPrint(bs, be, "\tcompressors: ", m->u.clientHello.compressors, "\n");
  1777. if(m->u.clientHello.extensions != nil)
  1778. bs = bytesPrint(bs, be, "\textensions: ", m->u.clientHello.extensions, "\n");
  1779. break;
  1780. case HServerHello:
  1781. bs = seprint(bs, be, "ServerHello\n");
  1782. bs = seprint(bs, be, "\tversion: %.4x\n", m->u.serverHello.version);
  1783. bs = seprint(bs, be, "\trandom: ");
  1784. for(i=0; i<RandomSize; i++)
  1785. bs = seprint(bs, be, "%.2x", m->u.serverHello.random[i]);
  1786. bs = seprint(bs, be, "\n");
  1787. bs = bytesPrint(bs, be, "\tsid: ", m->u.serverHello.sid, "\n");
  1788. bs = seprint(bs, be, "\tcipher: %.4x\n", m->u.serverHello.cipher);
  1789. bs = seprint(bs, be, "\tcompressor: %.2x\n", m->u.serverHello.compressor);
  1790. if(m->u.serverHello.extensions != nil)
  1791. bs = bytesPrint(bs, be, "\textensions: ", m->u.serverHello.extensions, "\n");
  1792. break;
  1793. case HCertificate:
  1794. bs = seprint(bs, be, "Certificate\n");
  1795. for(i=0; i<m->u.certificate.ncert; i++)
  1796. bs = bytesPrint(bs, be, "\t", m->u.certificate.certs[i], "\n");
  1797. break;
  1798. case HCertificateRequest:
  1799. bs = seprint(bs, be, "CertificateRequest\n");
  1800. bs = bytesPrint(bs, be, "\ttypes: ", m->u.certificateRequest.types, "\n");
  1801. if(m->u.certificateRequest.sigalgs != nil)
  1802. bs = intsPrint(bs, be, "\tsigalgs: ", m->u.certificateRequest.sigalgs, "\n");
  1803. bs = seprint(bs, be, "\tcertificateauthorities\n");
  1804. for(i=0; i<m->u.certificateRequest.nca; i++)
  1805. bs = bytesPrint(bs, be, "\t\t", m->u.certificateRequest.cas[i], "\n");
  1806. break;
  1807. case HCertificateVerify:
  1808. bs = seprint(bs, be, "HCertificateVerify\n");
  1809. if(m->u.certificateVerify.sigalg != 0)
  1810. bs = seprint(bs, be, "\tsigalg: %.4x\n", m->u.certificateVerify.sigalg);
  1811. bs = bytesPrint(bs, be, "\tsignature: ", m->u.certificateVerify.signature,"\n");
  1812. break;
  1813. case HServerHelloDone:
  1814. bs = seprint(bs, be, "ServerHelloDone\n");
  1815. break;
  1816. case HServerKeyExchange:
  1817. bs = seprint(bs, be, "HServerKeyExchange\n");
  1818. if(m->u.serverKeyExchange.pskid != nil)
  1819. bs = bytesPrint(bs, be, "\tpskid: ", m->u.serverKeyExchange.pskid, "\n");
  1820. if(m->u.serverKeyExchange.dh_parameters == nil)
  1821. break;
  1822. if(m->u.serverKeyExchange.curve != 0){
  1823. bs = seprint(bs, be, "\tcurve: %.4x\n", m->u.serverKeyExchange.curve);
  1824. } else {
  1825. bs = bytesPrint(bs, be, "\tdh_p: ", m->u.serverKeyExchange.dh_p, "\n");
  1826. bs = bytesPrint(bs, be, "\tdh_g: ", m->u.serverKeyExchange.dh_g, "\n");
  1827. }
  1828. bs = bytesPrint(bs, be, "\tdh_Ys: ", m->u.serverKeyExchange.dh_Ys, "\n");
  1829. if(m->u.serverKeyExchange.sigalg != 0)
  1830. bs = seprint(bs, be, "\tsigalg: %.4x\n", m->u.serverKeyExchange.sigalg);
  1831. bs = bytesPrint(bs, be, "\tdh_parameters: ", m->u.serverKeyExchange.dh_parameters, "\n");
  1832. bs = bytesPrint(bs, be, "\tdh_signature: ", m->u.serverKeyExchange.dh_signature, "\n");
  1833. break;
  1834. case HClientKeyExchange:
  1835. bs = seprint(bs, be, "HClientKeyExchange\n");
  1836. if(m->u.clientKeyExchange.pskid != nil)
  1837. bs = bytesPrint(bs, be, "\tpskid: ", m->u.clientKeyExchange.pskid, "\n");
  1838. if(m->u.clientKeyExchange.key != nil)
  1839. bs = bytesPrint(bs, be, "\tkey: ", m->u.clientKeyExchange.key, "\n");
  1840. break;
  1841. case HFinished:
  1842. bs = seprint(bs, be, "HFinished\n");
  1843. for(i=0; i<m->u.finished.n; i++)
  1844. bs = seprint(bs, be, "%.2x", m->u.finished.verify[i]);
  1845. bs = seprint(bs, be, "\n");
  1846. break;
  1847. }
  1848. USED(bs);
  1849. return buf;
  1850. }
  1851. static void
  1852. tlsError(TlsConnection *c, int err, char *fmt, ...)
  1853. {
  1854. char msg[512];
  1855. va_list arg;
  1856. va_start(arg, fmt);
  1857. vseprint(msg, msg+sizeof(msg), fmt, arg);
  1858. va_end(arg);
  1859. if(c->trace)
  1860. c->trace("tlsError: %s\n", msg);
  1861. if(c->erred)
  1862. fprint(2, "double error: %r, %s", msg);
  1863. else
  1864. errstr(msg, sizeof(msg));
  1865. c->erred = 1;
  1866. fprint(c->ctl, "alert %d", err);
  1867. }
  1868. // commit to specific version number
  1869. static int
  1870. setVersion(TlsConnection *c, int version)
  1871. {
  1872. if(version > MaxProtoVersion || version < MinProtoVersion)
  1873. return -1;
  1874. if(version > c->version)
  1875. version = c->version;
  1876. if(version == SSL3Version) {
  1877. c->version = version;
  1878. c->finished.n = SSL3FinishedLen;
  1879. }else {
  1880. c->version = version;
  1881. c->finished.n = TLSFinishedLen;
  1882. }
  1883. return fprint(c->ctl, "version 0x%x", version);
  1884. }
  1885. // confirm that received Finished message matches the expected value
  1886. static int
  1887. finishedMatch(TlsConnection *c, Finished *f)
  1888. {
  1889. return tsmemcmp(f->verify, c->finished.verify, f->n) == 0;
  1890. }
  1891. // free memory associated with TlsConnection struct
  1892. // (but don't close the TLS channel itself)
  1893. static void
  1894. tlsConnectionFree(TlsConnection *c)
  1895. {
  1896. if(c == nil)
  1897. return;
  1898. dh_finish(&c->sec->dh, nil);
  1899. mpfree(c->sec->ec.Q.ecpoint.x);
  1900. mpfree(c->sec->ec.Q.ecpoint.y);
  1901. mpfree(c->sec->ec.Q.d);
  1902. ecdomfree(&c->sec->ec.dom);
  1903. factotum_rsa_close(c->sec->rpc);
  1904. rsapubfree(c->sec->rsapub);
  1905. freebytes(c->cert);
  1906. memset(c, 0, sizeof(*c));
  1907. free(c);
  1908. }
  1909. //================= cipher choices ========================
  1910. static int
  1911. isDHE(int tlsid)
  1912. {
  1913. switch(tlsid){
  1914. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  1915. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  1916. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  1917. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
  1918. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  1919. case TLS_DHE_RSA_WITH_CHACHA20_POLY1305:
  1920. case GOOGLE_DHE_RSA_WITH_CHACHA20_POLY1305:
  1921. return 1;
  1922. }
  1923. return 0;
  1924. }
  1925. static int
  1926. isECDHE(int tlsid)
  1927. {
  1928. switch(tlsid){
  1929. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
  1930. case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:
  1931. case GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
  1932. case GOOGLE_ECDHE_RSA_WITH_CHACHA20_POLY1305:
  1933. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  1934. case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
  1935. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  1936. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
  1937. case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
  1938. case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  1939. return 1;
  1940. }
  1941. return 0;
  1942. }
  1943. static int
  1944. isPSK(int tlsid)
  1945. {
  1946. switch(tlsid){
  1947. case TLS_PSK_WITH_CHACHA20_POLY1305:
  1948. case TLS_PSK_WITH_AES_128_CBC_SHA256:
  1949. case TLS_PSK_WITH_AES_128_CBC_SHA:
  1950. return 1;
  1951. }
  1952. return 0;
  1953. }
  1954. static int
  1955. isECDSA(int tlsid)
  1956. {
  1957. switch(tlsid){
  1958. case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
  1959. case GOOGLE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:
  1960. case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  1961. case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
  1962. return 1;
  1963. }
  1964. return 0;
  1965. }
  1966. static int
  1967. setAlgs(TlsConnection *c, int a)
  1968. {
  1969. int i;
  1970. for(i = 0; i < nelem(cipherAlgs); i++){
  1971. if(cipherAlgs[i].tlsid == a){
  1972. c->cipher = a;
  1973. c->enc = cipherAlgs[i].enc;
  1974. c->digest = cipherAlgs[i].digest;
  1975. c->nsecret = cipherAlgs[i].nsecret;
  1976. if(c->nsecret > MaxKeyData)
  1977. return 0;
  1978. return 1;
  1979. }
  1980. }
  1981. return 0;
  1982. }
  1983. static int
  1984. okCipher(Ints *cv, int ispsk)
  1985. {
  1986. int i, c;
  1987. for(i = 0; i < nelem(cipherAlgs); i++) {
  1988. c = cipherAlgs[i].tlsid;
  1989. if(!cipherAlgs[i].ok || isECDSA(c) || isDHE(c) || isPSK(c) != ispsk)
  1990. continue;
  1991. if(lookupid(cv, c) >= 0)
  1992. return c;
  1993. }
  1994. return -1;
  1995. }
  1996. static int
  1997. okCompression(Bytes *cv)
  1998. {
  1999. int i, c;
  2000. for(i = 0; i < nelem(compressors); i++) {
  2001. c = compressors[i];
  2002. if(memchr(cv->data, c, cv->len) != nil)
  2003. return c;
  2004. }
  2005. return -1;
  2006. }
  2007. static Lock ciphLock;
  2008. static int nciphers;
  2009. static int
  2010. initCiphers(void)
  2011. {
  2012. enum {MaxAlgF = 1024, MaxAlgs = 10};
  2013. char s[MaxAlgF], *flds[MaxAlgs];
  2014. int i, j, n, ok;
  2015. lock(&ciphLock);
  2016. if(nciphers){
  2017. unlock(&ciphLock);
  2018. return nciphers;
  2019. }
  2020. j = open("#a/tls/encalgs", OREAD);
  2021. if(j < 0){
  2022. werrstr("can't open #a/tls/encalgs: %r");
  2023. goto out;
  2024. }
  2025. n = read(j, s, MaxAlgF-1);
  2026. close(j);
  2027. if(n <= 0){
  2028. werrstr("nothing in #a/tls/encalgs: %r");
  2029. goto out;
  2030. }
  2031. s[n] = 0;
  2032. n = getfields(s, flds, MaxAlgs, 1, " \t\r\n");
  2033. for(i = 0; i < nelem(cipherAlgs); i++){
  2034. ok = 0;
  2035. for(j = 0; j < n; j++){
  2036. if(strcmp(cipherAlgs[i].enc, flds[j]) == 0){
  2037. ok = 1;
  2038. break;
  2039. }
  2040. }
  2041. cipherAlgs[i].ok = ok;
  2042. }
  2043. j = open("#a/tls/hashalgs", OREAD);
  2044. if(j < 0){
  2045. werrstr("can't open #a/tls/hashalgs: %r");
  2046. goto out;
  2047. }
  2048. n = read(j, s, MaxAlgF-1);
  2049. close(j);
  2050. if(n <= 0){
  2051. werrstr("nothing in #a/tls/hashalgs: %r");
  2052. goto out;
  2053. }
  2054. s[n] = 0;
  2055. n = getfields(s, flds, MaxAlgs, 1, " \t\r\n");
  2056. for(i = 0; i < nelem(cipherAlgs); i++){
  2057. ok = 0;
  2058. for(j = 0; j < n; j++){
  2059. if(strcmp(cipherAlgs[i].digest, flds[j]) == 0){
  2060. ok = 1;
  2061. break;
  2062. }
  2063. }
  2064. cipherAlgs[i].ok &= ok;
  2065. if(cipherAlgs[i].ok)
  2066. nciphers++;
  2067. }
  2068. out:
  2069. unlock(&ciphLock);
  2070. return nciphers;
  2071. }
  2072. static Ints*
  2073. makeciphers(int ispsk)
  2074. {
  2075. Ints *is;
  2076. int i, j;
  2077. is = newints(nciphers);
  2078. j = 0;
  2079. for(i = 0; i < nelem(cipherAlgs); i++)
  2080. if(cipherAlgs[i].ok && isPSK(cipherAlgs[i].tlsid) == ispsk)
  2081. is->data[j++] = cipherAlgs[i].tlsid;
  2082. is->len = j;
  2083. return is;
  2084. }
  2085. //================= security functions ========================
  2086. // given a public key, set up connection to factotum
  2087. // for using corresponding private key
  2088. static AuthRpc*
  2089. factotum_rsa_open(RSApub *rsapub)
  2090. {
  2091. int afd;
  2092. char *s;
  2093. mpint *n;
  2094. AuthRpc *rpc;
  2095. // start talking to factotum
  2096. if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
  2097. return nil;
  2098. if((rpc = auth_allocrpc(afd)) == nil){
  2099. close(afd);
  2100. return nil;
  2101. }
  2102. s = "proto=rsa service=tls role=client";
  2103. if(auth_rpc(rpc, "start", s, strlen(s)) == ARok){
  2104. // roll factotum keyring around to match public key
  2105. n = mpnew(0);
  2106. while(auth_rpc(rpc, "read", nil, 0) == ARok){
  2107. if(strtomp(rpc->arg, nil, 16, n) != nil
  2108. && mpcmp(n, rsapub->n) == 0){
  2109. mpfree(n);
  2110. return rpc;
  2111. }
  2112. }
  2113. mpfree(n);
  2114. }
  2115. factotum_rsa_close(rpc);
  2116. return nil;
  2117. }
  2118. static mpint*
  2119. factotum_rsa_decrypt(AuthRpc *rpc, mpint *cipher)
  2120. {
  2121. char *p;
  2122. int rv;
  2123. if(cipher == nil)
  2124. return nil;
  2125. p = mptoa(cipher, 16, nil, 0);
  2126. mpfree(cipher);
  2127. if(p == nil)
  2128. return nil;
  2129. rv = auth_rpc(rpc, "write", p, strlen(p));
  2130. free(p);
  2131. if(rv != ARok || auth_rpc(rpc, "read", nil, 0) != ARok)
  2132. return nil;
  2133. return strtomp(rpc->arg, nil, 16, nil);
  2134. }
  2135. static void
  2136. factotum_rsa_close(AuthRpc *rpc)
  2137. {
  2138. if(rpc == nil)
  2139. return;
  2140. close(rpc->afd);
  2141. auth_freerpc(rpc);
  2142. }
  2143. static void
  2144. tlsPmd5(uint8_t *buf, int nbuf, uint8_t *key, int nkey, uint8_t *label, int nlabel, uint8_t *seed0, int nseed0, uint8_t *seed1, int nseed1)
  2145. {
  2146. uint8_t ai[MD5dlen], tmp[MD5dlen];
  2147. int i, n;
  2148. MD5state *s;
  2149. // generate a1
  2150. s = hmac_md5(label, nlabel, key, nkey, nil, nil);
  2151. s = hmac_md5(seed0, nseed0, key, nkey, nil, s);
  2152. hmac_md5(seed1, nseed1, key, nkey, ai, s);
  2153. while(nbuf > 0) {
  2154. s = hmac_md5(ai, MD5dlen, key, nkey, nil, nil);
  2155. s = hmac_md5(label, nlabel, key, nkey, nil, s);
  2156. s = hmac_md5(seed0, nseed0, key, nkey, nil, s);
  2157. hmac_md5(seed1, nseed1, key, nkey, tmp, s);
  2158. n = MD5dlen;
  2159. if(n > nbuf)
  2160. n = nbuf;
  2161. for(i = 0; i < n; i++)
  2162. buf[i] ^= tmp[i];
  2163. buf += n;
  2164. nbuf -= n;
  2165. hmac_md5(ai, MD5dlen, key, nkey, tmp, nil);
  2166. memmove(ai, tmp, MD5dlen);
  2167. }
  2168. }
  2169. static void
  2170. tlsPsha1(uint8_t *buf, int nbuf, uint8_t *key, int nkey, uint8_t *label, int nlabel, uint8_t *seed0, int nseed0, uint8_t *seed1, int nseed1)
  2171. {
  2172. uint8_t ai[SHA1dlen], tmp[SHA1dlen];
  2173. int i, n;
  2174. SHAstate *s;
  2175. // generate a1
  2176. s = hmac_sha1(label, nlabel, key, nkey, nil, nil);
  2177. s = hmac_sha1(seed0, nseed0, key, nkey, nil, s);
  2178. hmac_sha1(seed1, nseed1, key, nkey, ai, s);
  2179. while(nbuf > 0) {
  2180. s = hmac_sha1(ai, SHA1dlen, key, nkey, nil, nil);
  2181. s = hmac_sha1(label, nlabel, key, nkey, nil, s);
  2182. s = hmac_sha1(seed0, nseed0, key, nkey, nil, s);
  2183. hmac_sha1(seed1, nseed1, key, nkey, tmp, s);
  2184. n = SHA1dlen;
  2185. if(n > nbuf)
  2186. n = nbuf;
  2187. for(i = 0; i < n; i++)
  2188. buf[i] ^= tmp[i];
  2189. buf += n;
  2190. nbuf -= n;
  2191. hmac_sha1(ai, SHA1dlen, key, nkey, tmp, nil);
  2192. memmove(ai, tmp, SHA1dlen);
  2193. }
  2194. }
  2195. static void
  2196. p_sha256(uint8_t *buf, int nbuf, uint8_t *key, int nkey, uint8_t *label, int nlabel, uint8_t *seed, int nseed)
  2197. {
  2198. uint8_t ai[SHA2_256dlen], tmp[SHA2_256dlen];
  2199. SHAstate *s;
  2200. int n;
  2201. // generate a1
  2202. s = hmac_sha2_256(label, nlabel, key, nkey, nil, nil);
  2203. hmac_sha2_256(seed, nseed, key, nkey, ai, s);
  2204. while(nbuf > 0) {
  2205. s = hmac_sha2_256(ai, SHA2_256dlen, key, nkey, nil, nil);
  2206. s = hmac_sha2_256(label, nlabel, key, nkey, nil, s);
  2207. hmac_sha2_256(seed, nseed, key, nkey, tmp, s);
  2208. n = SHA2_256dlen;
  2209. if(n > nbuf)
  2210. n = nbuf;
  2211. memmove(buf, tmp, n);
  2212. buf += n;
  2213. nbuf -= n;
  2214. hmac_sha2_256(ai, SHA2_256dlen, key, nkey, tmp, nil);
  2215. memmove(ai, tmp, SHA2_256dlen);
  2216. }
  2217. }
  2218. // fill buf with md5(args)^sha1(args)
  2219. static void
  2220. tls10PRF(uint8_t *buf, int nbuf, uint8_t *key, int nkey, char *label, uint8_t *seed0, int nseed0, uint8_t *seed1, int nseed1)
  2221. {
  2222. int nlabel = strlen(label);
  2223. int n = (nkey + 1) >> 1;
  2224. memset(buf, 0, nbuf);
  2225. tlsPmd5(buf, nbuf, key, n, (uint8_t*)label, nlabel, seed0, nseed0, seed1, nseed1);
  2226. tlsPsha1(buf, nbuf, key+nkey-n, n, (uint8_t*)label, nlabel, seed0, nseed0, seed1, nseed1);
  2227. }
  2228. static void
  2229. tls12PRF(uint8_t *buf, int nbuf, uint8_t *key, int nkey, char *label, uint8_t *seed0, int nseed0, uint8_t *seed1, int nseed1)
  2230. {
  2231. uint8_t seed[2*RandomSize];
  2232. assert(nseed0+nseed1 <= sizeof(seed));
  2233. memmove(seed, seed0, nseed0);
  2234. memmove(seed+nseed0, seed1, nseed1);
  2235. p_sha256(buf, nbuf, key, nkey, (uint8_t*)label, strlen(label), seed, nseed0+nseed1);
  2236. }
  2237. static void
  2238. sslPRF(uint8_t *buf, int nbuf, uint8_t *key, int nkey, char *label, uint8_t *seed0, int nseed0, uint8_t *seed1, int nseed1)
  2239. {
  2240. uint8_t sha1dig[SHA1dlen], md5dig[MD5dlen], tmp[26];
  2241. DigestState *s;
  2242. int i, n, len;
  2243. USED(label);
  2244. len = 1;
  2245. while(nbuf > 0){
  2246. if(len > 26)
  2247. return;
  2248. for(i = 0; i < len; i++)
  2249. tmp[i] = 'A' - 1 + len;
  2250. s = sha1(tmp, len, nil, nil);
  2251. s = sha1(key, nkey, nil, s);
  2252. s = sha1(seed0, nseed0, nil, s);
  2253. sha1(seed1, nseed1, sha1dig, s);
  2254. s = md5(key, nkey, nil, nil);
  2255. md5(sha1dig, SHA1dlen, md5dig, s);
  2256. n = MD5dlen;
  2257. if(n > nbuf)
  2258. n = nbuf;
  2259. memmove(buf, md5dig, n);
  2260. buf += n;
  2261. nbuf -= n;
  2262. len++;
  2263. }
  2264. }
  2265. static void
  2266. sslSetFinished(TlsSec *sec, HandshakeHash hsh, uint8_t *finished, int isclient)
  2267. {
  2268. DigestState *s;
  2269. uint8_t h0[MD5dlen], h1[SHA1dlen], pad[48];
  2270. char *label;
  2271. if(isclient)
  2272. label = "CLNT";
  2273. else
  2274. label = "SRVR";
  2275. md5((uint8_t*)label, 4, nil, &hsh.md5);
  2276. md5(sec->sec, MasterSecretSize, nil, &hsh.md5);
  2277. memset(pad, 0x36, 48);
  2278. md5(pad, 48, nil, &hsh.md5);
  2279. md5(nil, 0, h0, &hsh.md5);
  2280. memset(pad, 0x5C, 48);
  2281. s = md5(sec->sec, MasterSecretSize, nil, nil);
  2282. s = md5(pad, 48, nil, s);
  2283. md5(h0, MD5dlen, finished, s);
  2284. sha1((uint8_t*)label, 4, nil, &hsh.sha1);
  2285. sha1(sec->sec, MasterSecretSize, nil, &hsh.sha1);
  2286. memset(pad, 0x36, 40);
  2287. sha1(pad, 40, nil, &hsh.sha1);
  2288. sha1(nil, 0, h1, &hsh.sha1);
  2289. memset(pad, 0x5C, 40);
  2290. s = sha1(sec->sec, MasterSecretSize, nil, nil);
  2291. s = sha1(pad, 40, nil, s);
  2292. sha1(h1, SHA1dlen, finished + MD5dlen, s);
  2293. }
  2294. // fill "finished" arg with md5(args)^sha1(args)
  2295. static void
  2296. tls10SetFinished(TlsSec *sec, HandshakeHash hsh, uint8_t *finished, int isclient)
  2297. {
  2298. uint8_t h0[MD5dlen], h1[SHA1dlen];
  2299. char *label;
  2300. // get current hash value, but allow further messages to be hashed in
  2301. md5(nil, 0, h0, &hsh.md5);
  2302. sha1(nil, 0, h1, &hsh.sha1);
  2303. if(isclient)
  2304. label = "client finished";
  2305. else
  2306. label = "server finished";
  2307. tls10PRF(finished, TLSFinishedLen, sec->sec, MasterSecretSize, label, h0, MD5dlen, h1, SHA1dlen);
  2308. }
  2309. static void
  2310. tls12SetFinished(TlsSec *sec, HandshakeHash hsh, uint8_t *finished, int isclient)
  2311. {
  2312. uint8_t seed[SHA2_256dlen];
  2313. char *label;
  2314. // get current hash value, but allow further messages to be hashed in
  2315. sha2_256(nil, 0, seed, &hsh.sha2_256);
  2316. if(isclient)
  2317. label = "client finished";
  2318. else
  2319. label = "server finished";
  2320. p_sha256(finished, TLSFinishedLen, sec->sec, MasterSecretSize, (uint8_t*)label, strlen(label), seed, SHA2_256dlen);
  2321. }
  2322. static void
  2323. tlsSecInits(TlsSec *sec, int cvers, uint8_t *crandom)
  2324. {
  2325. memset(sec, 0, sizeof(*sec));
  2326. sec->clientVers = cvers;
  2327. memmove(sec->crandom, crandom, RandomSize);
  2328. put32(sec->srandom, time(nil));
  2329. genrandom(sec->srandom+4, RandomSize-4);
  2330. }
  2331. static int
  2332. tlsSecRSAs(TlsSec *sec, Bytes *epm)
  2333. {
  2334. Bytes *pm;
  2335. if(epm == nil){
  2336. werrstr("no encrypted premaster secret");
  2337. return -1;
  2338. }
  2339. // if the client messed up, just continue as if everything is ok,
  2340. // to prevent attacks to check for correctly formatted messages.
  2341. pm = pkcs1_decrypt(sec, epm);
  2342. if(pm == nil || pm->len != MasterSecretSize || get16(pm->data) != sec->clientVers){
  2343. freebytes(pm);
  2344. pm = newbytes(MasterSecretSize);
  2345. genrandom(pm->data, pm->len);
  2346. }
  2347. setMasterSecret(sec, pm);
  2348. return 0;
  2349. }
  2350. static Bytes*
  2351. tlsSecECDHEs1(TlsSec *sec, Namedcurve *nc)
  2352. {
  2353. ECdomain *dom = &sec->ec.dom;
  2354. ECpriv *Q = &sec->ec.Q;
  2355. Bytes *par;
  2356. int n;
  2357. ecdominit(dom, nc->init);
  2358. memset(Q, 0, sizeof(*Q));
  2359. Q->ecpoint.x = mpnew(0);
  2360. Q->ecpoint.y = mpnew(0);
  2361. Q->d = mpnew(0);
  2362. ecgen(dom, Q);
  2363. n = 1 + 2*((mpsignif(dom->p)+7)/8);
  2364. par = newbytes(1+2+1+n);
  2365. par->data[0] = 3;
  2366. put16(par->data+1, nc->tlsid);
  2367. ECpub *aux = &Q->ecpoint;
  2368. n = ecencodepub(dom, aux, par->data+4, par->len-4);
  2369. par->data[3] = n;
  2370. par->len = 1+2+1+n;
  2371. return par;
  2372. }
  2373. static int
  2374. tlsSecECDHEs2(TlsSec *sec, Bytes *Yc)
  2375. {
  2376. ECdomain *dom = &sec->ec.dom;
  2377. ECpriv *Q = &sec->ec.Q;
  2378. ECpoint K;
  2379. ECpub *Y;
  2380. if(Yc == nil){
  2381. werrstr("no public key");
  2382. return -1;
  2383. }
  2384. if((Y = ecdecodepub(dom, Yc->data, Yc->len)) == nil){
  2385. werrstr("bad public key");
  2386. return -1;
  2387. }
  2388. memset(&K, 0, sizeof(K));
  2389. K.x = mpnew(0);
  2390. K.y = mpnew(0);
  2391. ecmul(dom, Y, Q->d, &K);
  2392. setMasterSecret(sec, mptobytes(K.x));
  2393. mpfree(K.x);
  2394. mpfree(K.y);
  2395. ecpubfree(Y);
  2396. return 0;
  2397. }
  2398. static void
  2399. tlsSecInitc(TlsSec *sec, int cvers)
  2400. {
  2401. memset(sec, 0, sizeof(*sec));
  2402. sec->clientVers = cvers;
  2403. put32(sec->crandom, time(nil));
  2404. genrandom(sec->crandom+4, RandomSize-4);
  2405. }
  2406. static Bytes*
  2407. tlsSecRSAc(TlsSec *sec, uint8_t *cert, int ncert)
  2408. {
  2409. RSApub *pub;
  2410. Bytes *pm, *epm;
  2411. pub = X509toRSApub(cert, ncert, nil, 0);
  2412. if(pub == nil){
  2413. werrstr("invalid x509/rsa certificate");
  2414. return nil;
  2415. }
  2416. pm = newbytes(MasterSecretSize);
  2417. put16(pm->data, sec->clientVers);
  2418. genrandom(pm->data+2, MasterSecretSize - 2);
  2419. epm = pkcs1_encrypt(pm, pub);
  2420. setMasterSecret(sec, pm);
  2421. rsapubfree(pub);
  2422. return epm;
  2423. }
  2424. static int
  2425. tlsSecFinished(TlsSec *sec, HandshakeHash hsh, uint8_t *fin, int nfin, int isclient)
  2426. {
  2427. if(sec->nfin != nfin){
  2428. werrstr("invalid finished exchange");
  2429. return -1;
  2430. }
  2431. hsh.md5.malloced = 0;
  2432. hsh.sha1.malloced = 0;
  2433. hsh.sha2_256.malloced = 0;
  2434. (*sec->setFinished)(sec, hsh, fin, isclient);
  2435. return 0;
  2436. }
  2437. static void
  2438. tlsSecVers(TlsSec *sec, int v)
  2439. {
  2440. if(v == SSL3Version){
  2441. sec->setFinished = sslSetFinished;
  2442. sec->nfin = SSL3FinishedLen;
  2443. sec->prf = sslPRF;
  2444. }else if(v < TLS12Version) {
  2445. sec->setFinished = tls10SetFinished;
  2446. sec->nfin = TLSFinishedLen;
  2447. sec->prf = tls10PRF;
  2448. }else {
  2449. sec->setFinished = tls12SetFinished;
  2450. sec->nfin = TLSFinishedLen;
  2451. sec->prf = tls12PRF;
  2452. }
  2453. }
  2454. static int
  2455. setSecrets(TlsConnection *c, int isclient)
  2456. {
  2457. uint8_t kd[MaxKeyData];
  2458. char *secrets;
  2459. int rv;
  2460. assert(c->nsecret <= sizeof(kd));
  2461. secrets = emalloc(2*c->nsecret);
  2462. /*
  2463. * generate secret keys from the master secret.
  2464. *
  2465. * different cipher selections will require different amounts
  2466. * of key expansion and use of key expansion data,
  2467. * but it's all generated using the same function.
  2468. */
  2469. (*c->sec->prf)(kd, c->nsecret, c->sec->sec, MasterSecretSize, "key expansion",
  2470. c->sec->srandom, RandomSize, c->sec->crandom, RandomSize);
  2471. enc64(secrets, 2*c->nsecret, kd, c->nsecret);
  2472. memset(kd, 0, c->nsecret);
  2473. rv = fprint(c->ctl, "secret %s %s %d %s", c->digest, c->enc, isclient, secrets);
  2474. memset(secrets, 0, 2*c->nsecret);
  2475. free(secrets);
  2476. return rv;
  2477. }
  2478. /*
  2479. * set the master secret from the pre-master secret,
  2480. * destroys premaster.
  2481. */
  2482. static void
  2483. setMasterSecret(TlsSec *sec, Bytes *pm)
  2484. {
  2485. if(sec->psklen > 0){
  2486. Bytes *opm = pm;
  2487. uint8_t *p;
  2488. /* concatenate psk to pre-master secret */
  2489. pm = newbytes(4 + opm->len + sec->psklen);
  2490. p = pm->data;
  2491. put16(p, opm->len), p += 2;
  2492. memmove(p, opm->data, opm->len), p += opm->len;
  2493. put16(p, sec->psklen), p += 2;
  2494. memmove(p, sec->psk, sec->psklen);
  2495. memset(opm->data, 0, opm->len);
  2496. freebytes(opm);
  2497. }
  2498. (*sec->prf)(sec->sec, MasterSecretSize, pm->data, pm->len, "master secret",
  2499. sec->crandom, RandomSize, sec->srandom, RandomSize);
  2500. memset(pm->data, 0, pm->len);
  2501. freebytes(pm);
  2502. }
  2503. static int
  2504. digestDHparams(TlsSec *sec, Bytes *par, uint8_t digest[MAXdlen], int sigalg)
  2505. {
  2506. int hashalg = (sigalg>>8) & 0xFF;
  2507. int digestlen;
  2508. Bytes *blob;
  2509. blob = newbytes(2*RandomSize + par->len);
  2510. memmove(blob->data+0*RandomSize, sec->crandom, RandomSize);
  2511. memmove(blob->data+1*RandomSize, sec->srandom, RandomSize);
  2512. memmove(blob->data+2*RandomSize, par->data, par->len);
  2513. if(hashalg == 0){
  2514. digestlen = MD5dlen+SHA1dlen;
  2515. md5(blob->data, blob->len, digest, nil);
  2516. sha1(blob->data, blob->len, digest+MD5dlen, nil);
  2517. } else {
  2518. digestlen = -1;
  2519. if(hashalg < nelem(hashfun) && hashfun[hashalg].fun != nil){
  2520. digestlen = hashfun[hashalg].len;
  2521. (*hashfun[hashalg].fun)(blob->data, blob->len, digest, nil);
  2522. }
  2523. }
  2524. freebytes(blob);
  2525. return digestlen;
  2526. }
  2527. static char*
  2528. verifyDHparams(TlsSec *sec, Bytes *par, Bytes *cert, Bytes *sig, int sigalg)
  2529. {
  2530. uint8_t digest[MAXdlen];
  2531. int digestlen;
  2532. ECdomain dom;
  2533. ECpub *ecpk;
  2534. RSApub *rsapk;
  2535. char *err;
  2536. if(par == nil || par->len <= 0)
  2537. return "no DH parameters";
  2538. if(sig == nil || sig->len <= 0){
  2539. if(sec->psklen > 0)
  2540. return nil;
  2541. return "no signature";
  2542. }
  2543. if(cert == nil)
  2544. return "no certificate";
  2545. digestlen = digestDHparams(sec, par, digest, sigalg);
  2546. if(digestlen <= 0)
  2547. return "unknown signature digest algorithm";
  2548. switch(sigalg & 0xFF){
  2549. case 0x01:
  2550. rsapk = X509toRSApub(cert->data, cert->len, nil, 0);
  2551. if(rsapk == nil)
  2552. return "bad certificate";
  2553. err = X509rsaverifydigest(sig->data, sig->len, digest, digestlen, rsapk);
  2554. rsapubfree(rsapk);
  2555. break;
  2556. case 0x03:
  2557. ecpk = X509toECpub(cert->data, cert->len, nil, 0, &dom);
  2558. if(ecpk == nil)
  2559. return "bad certificate";
  2560. err = X509ecdsaverifydigest(sig->data, sig->len, digest, digestlen, &dom, ecpk);
  2561. ecdomfree(&dom);
  2562. ecpubfree(ecpk);
  2563. break;
  2564. default:
  2565. err = "signaure algorithm not RSA or ECDSA";
  2566. }
  2567. return err;
  2568. }
  2569. // encrypt data according to PKCS#1, /lib/rfc/rfc2437 9.1.2.1
  2570. static Bytes*
  2571. pkcs1_encrypt(Bytes* data, RSApub* key)
  2572. {
  2573. mpint *x, *y;
  2574. x = pkcs1padbuf(data->data, data->len, key->n, 2);
  2575. if(x == nil)
  2576. return nil;
  2577. y = rsaencrypt(key, x, nil);
  2578. mpfree(x);
  2579. data = newbytes((mpsignif(key->n)+7)/8);
  2580. mptober(y, data->data, data->len);
  2581. mpfree(y);
  2582. return data;
  2583. }
  2584. // decrypt data according to PKCS#1, with given key.
  2585. static Bytes*
  2586. pkcs1_decrypt(TlsSec *sec, Bytes *data)
  2587. {
  2588. mpint *y;
  2589. if(data->len != (mpsignif(sec->rsapub->n)+7)/8)
  2590. return nil;
  2591. y = factotum_rsa_decrypt(sec->rpc, bytestomp(data));
  2592. if(y == nil)
  2593. return nil;
  2594. data = mptobytes(y);
  2595. if((data->len = pkcs1unpadbuf(data->data, data->len, sec->rsapub->n, 2)) < 0){
  2596. freebytes(data);
  2597. return nil;
  2598. }
  2599. return data;
  2600. }
  2601. static Bytes*
  2602. pkcs1_sign(TlsSec *sec, uint8_t *digest, int digestlen, int sigalg)
  2603. {
  2604. int hashalg = (sigalg>>8)&0xFF;
  2605. mpint *signedMP;
  2606. Bytes *signature;
  2607. uint8_t buf[128];
  2608. if(hashalg > 0 && hashalg < nelem(hashfun) && hashfun[hashalg].len == digestlen)
  2609. digestlen = asn1encodedigest(hashfun[hashalg].fun, digest, buf, sizeof(buf));
  2610. else if(digestlen == MD5dlen+SHA1dlen)
  2611. memmove(buf, digest, digestlen);
  2612. else
  2613. digestlen = -1;
  2614. if(digestlen <= 0){
  2615. werrstr("bad digest algorithm");
  2616. return nil;
  2617. }
  2618. signedMP = factotum_rsa_decrypt(sec->rpc, pkcs1padbuf(buf, digestlen, sec->rsapub->n, 1));
  2619. if(signedMP == nil)
  2620. return nil;
  2621. signature = mptobytes(signedMP);
  2622. mpfree(signedMP);
  2623. return signature;
  2624. }
  2625. //================= general utility functions ========================
  2626. static void *
  2627. emalloc(int n)
  2628. {
  2629. void *p;
  2630. if(n==0)
  2631. n=1;
  2632. p = malloc(n);
  2633. if(p == nil)
  2634. exits("out of memory");
  2635. memset(p, 0, n);
  2636. return p;
  2637. }
  2638. static void *
  2639. erealloc(void *ReallocP, int ReallocN)
  2640. {
  2641. if(ReallocN == 0)
  2642. ReallocN = 1;
  2643. if(ReallocP == nil)
  2644. ReallocP = emalloc(ReallocN);
  2645. else if((ReallocP = realloc(ReallocP, ReallocN)) == nil)
  2646. exits("out of memory");
  2647. return(ReallocP);
  2648. }
  2649. static void
  2650. put32(uint8_t *p, uint32_t x)
  2651. {
  2652. p[0] = x>>24;
  2653. p[1] = x>>16;
  2654. p[2] = x>>8;
  2655. p[3] = x;
  2656. }
  2657. static void
  2658. put24(uint8_t *p, int x)
  2659. {
  2660. p[0] = x>>16;
  2661. p[1] = x>>8;
  2662. p[2] = x;
  2663. }
  2664. static void
  2665. put16(uint8_t *p, int x)
  2666. {
  2667. p[0] = x>>8;
  2668. p[1] = x;
  2669. }
  2670. static int
  2671. get24(uint8_t *p)
  2672. {
  2673. return (p[0]<<16)|(p[1]<<8)|p[2];
  2674. }
  2675. static int
  2676. get16(uint8_t *p)
  2677. {
  2678. return (p[0]<<8)|p[1];
  2679. }
  2680. static Bytes*
  2681. newbytes(int len)
  2682. {
  2683. Bytes* ans;
  2684. if(len < 0)
  2685. abort();
  2686. ans = emalloc(sizeof(Bytes) + len);
  2687. ans->len = len;
  2688. return ans;
  2689. }
  2690. /*
  2691. * newbytes(len), with data initialized from buf
  2692. */
  2693. static Bytes*
  2694. makebytes(uint8_t* buf, int len)
  2695. {
  2696. Bytes* ans;
  2697. ans = newbytes(len);
  2698. memmove(ans->data, buf, len);
  2699. return ans;
  2700. }
  2701. static void
  2702. freebytes(Bytes* b)
  2703. {
  2704. free(b);
  2705. }
  2706. static mpint*
  2707. bytestomp(Bytes* bytes)
  2708. {
  2709. return betomp(bytes->data, bytes->len, nil);
  2710. }
  2711. /*
  2712. * Convert mpint* to Bytes, putting high order byte first.
  2713. */
  2714. static Bytes*
  2715. mptobytes(mpint* big)
  2716. {
  2717. Bytes* ans;
  2718. int n;
  2719. n = (mpsignif(big)+7)/8;
  2720. if(n == 0) n = 1;
  2721. ans = newbytes(n);
  2722. mptober(big, ans->data, ans->len);
  2723. return ans;
  2724. }
  2725. /* len is number of ints */
  2726. static Ints*
  2727. newints(int len)
  2728. {
  2729. Ints* ans;
  2730. if(len < 0 || len > ((uint)-1>>1)/sizeof(int))
  2731. abort();
  2732. ans = emalloc(sizeof(Ints) + len*sizeof(int));
  2733. ans->len = len;
  2734. return ans;
  2735. }
  2736. static void
  2737. freeints(Ints* b)
  2738. {
  2739. free(b);
  2740. }
  2741. static int
  2742. lookupid(Ints* b, int id)
  2743. {
  2744. int i;
  2745. for(i=0; i<b->len; i++)
  2746. if(b->data[i] == id)
  2747. return i;
  2748. return -1;
  2749. }