x509parse.c 84 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274
  1. /*
  2. * X.509 certificate and private key decoding
  3. *
  4. * Copyright (C) 2006-2010, Brainspark B.V.
  5. *
  6. * This file is part of PolarSSL (http://www.polarssl.org)
  7. * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. */
  25. /*
  26. * The ITU-T X.509 standard defines a certificat format for PKI.
  27. *
  28. * http://www.ietf.org/rfc/rfc2459.txt
  29. * http://www.ietf.org/rfc/rfc3279.txt
  30. *
  31. * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc
  32. *
  33. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf
  34. * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf
  35. */
  36. #include "config.h"
  37. #if defined(POLARSSL_X509_PARSE_C)
  38. #include "polarssl/x509.h"
  39. #include "polarssl/pem.h"
  40. #include "polarssl/des.h"
  41. #include "polarssl/md2.h"
  42. #include "polarssl/md4.h"
  43. #include "polarssl/md5.h"
  44. #include "polarssl/sha1.h"
  45. #include "polarssl/sha2.h"
  46. #include "polarssl/sha4.h"
  47. #include "polarssl/dhm.h"
  48. #include <string.h>
  49. #include <stdlib.h>
  50. #include <time.h>
  51. #if defined(POLARSSL_FS_IO)
  52. #include <stdio.h>
  53. #endif
  54. /*
  55. * ASN.1 DER decoding routines
  56. */
  57. static int asn1_get_len( unsigned char **p,
  58. const unsigned char *end,
  59. size_t *len )
  60. {
  61. if( ( end - *p ) < 1 )
  62. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  63. if( ( **p & 0x80 ) == 0 )
  64. *len = *(*p)++;
  65. else
  66. {
  67. switch( **p & 0x7F )
  68. {
  69. case 1:
  70. if( ( end - *p ) < 2 )
  71. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  72. *len = (*p)[1];
  73. (*p) += 2;
  74. break;
  75. case 2:
  76. if( ( end - *p ) < 3 )
  77. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  78. *len = ( (*p)[1] << 8 ) | (*p)[2];
  79. (*p) += 3;
  80. break;
  81. default:
  82. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  83. }
  84. }
  85. if( *len > (size_t) ( end - *p ) )
  86. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  87. return( 0 );
  88. }
  89. static int asn1_get_tag( unsigned char **p,
  90. const unsigned char *end,
  91. size_t *len, int tag )
  92. {
  93. if( ( end - *p ) < 1 )
  94. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  95. if( **p != tag )
  96. return( POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  97. (*p)++;
  98. return( asn1_get_len( p, end, len ) );
  99. }
  100. static int asn1_get_bool( unsigned char **p,
  101. const unsigned char *end,
  102. int *val )
  103. {
  104. int ret;
  105. size_t len;
  106. if( ( ret = asn1_get_tag( p, end, &len, ASN1_BOOLEAN ) ) != 0 )
  107. return( ret );
  108. if( len != 1 )
  109. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  110. *val = ( **p != 0 ) ? 1 : 0;
  111. (*p)++;
  112. return( 0 );
  113. }
  114. static int asn1_get_int( unsigned char **p,
  115. const unsigned char *end,
  116. int *val )
  117. {
  118. int ret;
  119. size_t len;
  120. if( ( ret = asn1_get_tag( p, end, &len, ASN1_INTEGER ) ) != 0 )
  121. return( ret );
  122. if( len > sizeof( int ) || ( **p & 0x80 ) != 0 )
  123. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  124. *val = 0;
  125. while( len-- > 0 )
  126. {
  127. *val = ( *val << 8 ) | **p;
  128. (*p)++;
  129. }
  130. return( 0 );
  131. }
  132. static int asn1_get_mpi( unsigned char **p,
  133. const unsigned char *end,
  134. mpi *X )
  135. {
  136. int ret;
  137. size_t len;
  138. if( ( ret = asn1_get_tag( p, end, &len, ASN1_INTEGER ) ) != 0 )
  139. return( ret );
  140. ret = mpi_read_binary( X, *p, len );
  141. *p += len;
  142. return( ret );
  143. }
  144. static int asn1_get_bitstring( unsigned char **p, const unsigned char *end,
  145. x509_bitstring *bs)
  146. {
  147. int ret;
  148. /* Certificate type is a single byte bitstring */
  149. if( ( ret = asn1_get_tag( p, end, &bs->len, ASN1_BIT_STRING ) ) != 0 )
  150. return( ret );
  151. /* Check length, subtract one for actual bit string length */
  152. if ( bs->len < 1 )
  153. return( POLARSSL_ERR_ASN1_OUT_OF_DATA );
  154. bs->len -= 1;
  155. /* Get number of unused bits, ensure unused bits <= 7 */
  156. bs->unused_bits = **p;
  157. if( bs->unused_bits > 7 )
  158. return( POLARSSL_ERR_ASN1_INVALID_LENGTH );
  159. (*p)++;
  160. /* Get actual bitstring */
  161. bs->p = *p;
  162. *p += bs->len;
  163. if( *p != end )
  164. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  165. return 0;
  166. }
  167. /*
  168. * Parses and splits an ASN.1 "SEQUENCE OF <tag>"
  169. */
  170. static int asn1_get_sequence_of( unsigned char **p,
  171. const unsigned char *end,
  172. x509_sequence *cur,
  173. int tag)
  174. {
  175. int ret;
  176. size_t len;
  177. x509_buf *buf;
  178. /* Get main sequence tag */
  179. if( ( ret = asn1_get_tag( p, end, &len,
  180. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  181. return( ret );
  182. if( *p + len != end )
  183. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  184. while( *p < end )
  185. {
  186. buf = &(cur->buf);
  187. buf->tag = **p;
  188. if( ( ret = asn1_get_tag( p, end, &buf->len, tag ) ) != 0 )
  189. return( ret );
  190. buf->p = *p;
  191. *p += buf->len;
  192. /* Allocate and assign next pointer */
  193. if (*p < end)
  194. {
  195. cur->next = (x509_sequence *) malloc(
  196. sizeof( x509_sequence ) );
  197. if( cur->next == NULL )
  198. return( 1 );
  199. cur = cur->next;
  200. }
  201. }
  202. /* Set final sequence entry's next pointer to NULL */
  203. cur->next = NULL;
  204. if( *p != end )
  205. return( POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  206. return( 0 );
  207. }
  208. /*
  209. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  210. */
  211. static int x509_get_version( unsigned char **p,
  212. const unsigned char *end,
  213. int *ver )
  214. {
  215. int ret;
  216. size_t len;
  217. if( ( ret = asn1_get_tag( p, end, &len,
  218. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 0 ) ) != 0 )
  219. {
  220. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  221. return( *ver = 0 );
  222. return( ret );
  223. }
  224. end = *p + len;
  225. if( ( ret = asn1_get_int( p, end, ver ) ) != 0 )
  226. return( POLARSSL_ERR_X509_CERT_INVALID_VERSION + ret );
  227. if( *p != end )
  228. return( POLARSSL_ERR_X509_CERT_INVALID_VERSION +
  229. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  230. return( 0 );
  231. }
  232. /*
  233. * CertificateSerialNumber ::= INTEGER
  234. */
  235. static int x509_get_serial( unsigned char **p,
  236. const unsigned char *end,
  237. x509_buf *serial )
  238. {
  239. int ret;
  240. if( ( end - *p ) < 1 )
  241. return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL +
  242. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  243. if( **p != ( ASN1_CONTEXT_SPECIFIC | ASN1_PRIMITIVE | 2 ) &&
  244. **p != ASN1_INTEGER )
  245. return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL +
  246. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  247. serial->tag = *(*p)++;
  248. if( ( ret = asn1_get_len( p, end, &serial->len ) ) != 0 )
  249. return( POLARSSL_ERR_X509_CERT_INVALID_SERIAL + ret );
  250. serial->p = *p;
  251. *p += serial->len;
  252. return( 0 );
  253. }
  254. /*
  255. * AlgorithmIdentifier ::= SEQUENCE {
  256. * algorithm OBJECT IDENTIFIER,
  257. * parameters ANY DEFINED BY algorithm OPTIONAL }
  258. */
  259. static int x509_get_alg( unsigned char **p,
  260. const unsigned char *end,
  261. x509_buf *alg )
  262. {
  263. int ret;
  264. size_t len;
  265. if( ( ret = asn1_get_tag( p, end, &len,
  266. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  267. return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret );
  268. end = *p + len;
  269. alg->tag = **p;
  270. if( ( ret = asn1_get_tag( p, end, &alg->len, ASN1_OID ) ) != 0 )
  271. return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret );
  272. alg->p = *p;
  273. *p += alg->len;
  274. if( *p == end )
  275. return( 0 );
  276. /*
  277. * assume the algorithm parameters must be NULL
  278. */
  279. if( ( ret = asn1_get_tag( p, end, &len, ASN1_NULL ) ) != 0 )
  280. return( POLARSSL_ERR_X509_CERT_INVALID_ALG + ret );
  281. if( *p != end )
  282. return( POLARSSL_ERR_X509_CERT_INVALID_ALG +
  283. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  284. return( 0 );
  285. }
  286. /*
  287. * AttributeTypeAndValue ::= SEQUENCE {
  288. * type AttributeType,
  289. * value AttributeValue }
  290. *
  291. * AttributeType ::= OBJECT IDENTIFIER
  292. *
  293. * AttributeValue ::= ANY DEFINED BY AttributeType
  294. */
  295. static int x509_get_attr_type_value( unsigned char **p,
  296. const unsigned char *end,
  297. x509_name *cur )
  298. {
  299. int ret;
  300. size_t len;
  301. x509_buf *oid;
  302. x509_buf *val;
  303. if( ( ret = asn1_get_tag( p, end, &len,
  304. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  305. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  306. oid = &cur->oid;
  307. oid->tag = **p;
  308. if( ( ret = asn1_get_tag( p, end, &oid->len, ASN1_OID ) ) != 0 )
  309. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  310. oid->p = *p;
  311. *p += oid->len;
  312. if( ( end - *p ) < 1 )
  313. return( POLARSSL_ERR_X509_CERT_INVALID_NAME +
  314. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  315. if( **p != ASN1_BMP_STRING && **p != ASN1_UTF8_STRING &&
  316. **p != ASN1_T61_STRING && **p != ASN1_PRINTABLE_STRING &&
  317. **p != ASN1_IA5_STRING && **p != ASN1_UNIVERSAL_STRING )
  318. return( POLARSSL_ERR_X509_CERT_INVALID_NAME +
  319. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  320. val = &cur->val;
  321. val->tag = *(*p)++;
  322. if( ( ret = asn1_get_len( p, end, &val->len ) ) != 0 )
  323. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  324. val->p = *p;
  325. *p += val->len;
  326. cur->next = NULL;
  327. return( 0 );
  328. }
  329. /*
  330. * RelativeDistinguishedName ::=
  331. * SET OF AttributeTypeAndValue
  332. *
  333. * AttributeTypeAndValue ::= SEQUENCE {
  334. * type AttributeType,
  335. * value AttributeValue }
  336. *
  337. * AttributeType ::= OBJECT IDENTIFIER
  338. *
  339. * AttributeValue ::= ANY DEFINED BY AttributeType
  340. */
  341. static int x509_get_name( unsigned char **p,
  342. const unsigned char *end,
  343. x509_name *cur )
  344. {
  345. int ret;
  346. size_t len;
  347. const unsigned char *end2;
  348. x509_name *use;
  349. if( ( ret = asn1_get_tag( p, end, &len,
  350. ASN1_CONSTRUCTED | ASN1_SET ) ) != 0 )
  351. return( POLARSSL_ERR_X509_CERT_INVALID_NAME + ret );
  352. end2 = end;
  353. end = *p + len;
  354. use = cur;
  355. do
  356. {
  357. if( ( ret = x509_get_attr_type_value( p, end, use ) ) != 0 )
  358. return( ret );
  359. if( *p != end )
  360. {
  361. use->next = (x509_name *) malloc(
  362. sizeof( x509_name ) );
  363. if( use->next == NULL )
  364. return( 1 );
  365. memset( use->next, 0, sizeof( x509_name ) );
  366. use = use->next;
  367. }
  368. }
  369. while( *p != end );
  370. /*
  371. * recurse until end of SEQUENCE is reached
  372. */
  373. if( *p == end2 )
  374. return( 0 );
  375. cur->next = (x509_name *) malloc(
  376. sizeof( x509_name ) );
  377. if( cur->next == NULL )
  378. return( 1 );
  379. return( x509_get_name( p, end2, cur->next ) );
  380. }
  381. /*
  382. * Time ::= CHOICE {
  383. * utcTime UTCTime,
  384. * generalTime GeneralizedTime }
  385. */
  386. static int x509_get_time( unsigned char **p,
  387. const unsigned char *end,
  388. x509_time *time )
  389. {
  390. int ret;
  391. size_t len;
  392. char date[64];
  393. unsigned char tag;
  394. if( ( end - *p ) < 1 )
  395. return( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  396. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  397. tag = **p;
  398. if ( tag == ASN1_UTC_TIME )
  399. {
  400. (*p)++;
  401. ret = asn1_get_len( p, end, &len );
  402. if( ret != 0 )
  403. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret );
  404. memset( date, 0, sizeof( date ) );
  405. memcpy( date, *p, ( len < sizeof( date ) - 1 ) ?
  406. len : sizeof( date ) - 1 );
  407. if( sscanf( date, "%2d%2d%2d%2d%2d%2d",
  408. &time->year, &time->mon, &time->day,
  409. &time->hour, &time->min, &time->sec ) < 5 )
  410. return( POLARSSL_ERR_X509_CERT_INVALID_DATE );
  411. time->year += 100 * ( time->year < 50 );
  412. time->year += 1900;
  413. *p += len;
  414. return( 0 );
  415. }
  416. else if ( tag == ASN1_GENERALIZED_TIME )
  417. {
  418. (*p)++;
  419. ret = asn1_get_len( p, end, &len );
  420. if( ret != 0 )
  421. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret );
  422. memset( date, 0, sizeof( date ) );
  423. memcpy( date, *p, ( len < sizeof( date ) - 1 ) ?
  424. len : sizeof( date ) - 1 );
  425. if( sscanf( date, "%4d%2d%2d%2d%2d%2d",
  426. &time->year, &time->mon, &time->day,
  427. &time->hour, &time->min, &time->sec ) < 5 )
  428. return( POLARSSL_ERR_X509_CERT_INVALID_DATE );
  429. *p += len;
  430. return( 0 );
  431. }
  432. else
  433. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  434. }
  435. /*
  436. * Validity ::= SEQUENCE {
  437. * notBefore Time,
  438. * notAfter Time }
  439. */
  440. static int x509_get_dates( unsigned char **p,
  441. const unsigned char *end,
  442. x509_time *from,
  443. x509_time *to )
  444. {
  445. int ret;
  446. size_t len;
  447. if( ( ret = asn1_get_tag( p, end, &len,
  448. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  449. return( POLARSSL_ERR_X509_CERT_INVALID_DATE + ret );
  450. end = *p + len;
  451. if( ( ret = x509_get_time( p, end, from ) ) != 0 )
  452. return( ret );
  453. if( ( ret = x509_get_time( p, end, to ) ) != 0 )
  454. return( ret );
  455. if( *p != end )
  456. return( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  457. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  458. return( 0 );
  459. }
  460. /*
  461. * SubjectPublicKeyInfo ::= SEQUENCE {
  462. * algorithm AlgorithmIdentifier,
  463. * subjectPublicKey BIT STRING }
  464. */
  465. static int x509_get_pubkey( unsigned char **p,
  466. const unsigned char *end,
  467. x509_buf *pk_alg_oid,
  468. mpi *N, mpi *E )
  469. {
  470. int ret, can_handle;
  471. size_t len;
  472. unsigned char *end2;
  473. if( ( ret = x509_get_alg( p, end, pk_alg_oid ) ) != 0 )
  474. return( ret );
  475. /*
  476. * only RSA public keys handled at this time
  477. */
  478. can_handle = 0;
  479. if( pk_alg_oid->len == 9 &&
  480. memcmp( pk_alg_oid->p, OID_PKCS1_RSA, 9 ) == 0 )
  481. can_handle = 1;
  482. if( pk_alg_oid->len == 9 &&
  483. memcmp( pk_alg_oid->p, OID_PKCS1, 8 ) == 0 )
  484. {
  485. if( pk_alg_oid->p[8] >= 2 && pk_alg_oid->p[8] <= 5 )
  486. can_handle = 1;
  487. if ( pk_alg_oid->p[8] >= 11 && pk_alg_oid->p[8] <= 14 )
  488. can_handle = 1;
  489. }
  490. if( pk_alg_oid->len == 5 &&
  491. memcmp( pk_alg_oid->p, OID_RSA_SHA_OBS, 5 ) == 0 )
  492. can_handle = 1;
  493. if( can_handle == 0 )
  494. return( POLARSSL_ERR_X509_UNKNOWN_PK_ALG );
  495. if( ( ret = asn1_get_tag( p, end, &len, ASN1_BIT_STRING ) ) != 0 )
  496. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret );
  497. if( ( end - *p ) < 1 )
  498. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY +
  499. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  500. end2 = *p + len;
  501. if( *(*p)++ != 0 )
  502. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY );
  503. /*
  504. * RSAPublicKey ::= SEQUENCE {
  505. * modulus INTEGER, -- n
  506. * publicExponent INTEGER -- e
  507. * }
  508. */
  509. if( ( ret = asn1_get_tag( p, end2, &len,
  510. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  511. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret );
  512. if( *p + len != end2 )
  513. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY +
  514. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  515. if( ( ret = asn1_get_mpi( p, end2, N ) ) != 0 ||
  516. ( ret = asn1_get_mpi( p, end2, E ) ) != 0 )
  517. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY + ret );
  518. if( *p != end )
  519. return( POLARSSL_ERR_X509_CERT_INVALID_PUBKEY +
  520. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  521. return( 0 );
  522. }
  523. static int x509_get_sig( unsigned char **p,
  524. const unsigned char *end,
  525. x509_buf *sig )
  526. {
  527. int ret;
  528. size_t len;
  529. sig->tag = **p;
  530. if( ( ret = asn1_get_tag( p, end, &len, ASN1_BIT_STRING ) ) != 0 )
  531. return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE + ret );
  532. if( --len < 1 || *(*p)++ != 0 )
  533. return( POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE );
  534. sig->len = len;
  535. sig->p = *p;
  536. *p += len;
  537. return( 0 );
  538. }
  539. /*
  540. * X.509 v2/v3 unique identifier (not parsed)
  541. */
  542. static int x509_get_uid( unsigned char **p,
  543. const unsigned char *end,
  544. x509_buf *uid, int n )
  545. {
  546. int ret;
  547. if( *p == end )
  548. return( 0 );
  549. uid->tag = **p;
  550. if( ( ret = asn1_get_tag( p, end, &uid->len,
  551. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | n ) ) != 0 )
  552. {
  553. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  554. return( 0 );
  555. return( ret );
  556. }
  557. uid->p = *p;
  558. *p += uid->len;
  559. return( 0 );
  560. }
  561. /*
  562. * X.509 Extensions (No parsing of extensions, pointer should
  563. * be either manually updated or extensions should be parsed!
  564. */
  565. static int x509_get_ext( unsigned char **p,
  566. const unsigned char *end,
  567. x509_buf *ext )
  568. {
  569. int ret;
  570. size_t len;
  571. if( *p == end )
  572. return( 0 );
  573. ext->tag = **p;
  574. if( ( ret = asn1_get_tag( p, end, &ext->len,
  575. ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 3 ) ) != 0 )
  576. return( ret );
  577. ext->p = *p;
  578. end = *p + ext->len;
  579. /*
  580. * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
  581. *
  582. * Extension ::= SEQUENCE {
  583. * extnID OBJECT IDENTIFIER,
  584. * critical BOOLEAN DEFAULT FALSE,
  585. * extnValue OCTET STRING }
  586. */
  587. if( ( ret = asn1_get_tag( p, end, &len,
  588. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  589. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  590. if( end != *p + len )
  591. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  592. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  593. return( 0 );
  594. }
  595. /*
  596. * X.509 CRL v2 extensions (no extensions parsed yet.)
  597. */
  598. static int x509_get_crl_ext( unsigned char **p,
  599. const unsigned char *end,
  600. x509_buf *ext )
  601. {
  602. int ret;
  603. size_t len;
  604. if( ( ret = x509_get_ext( p, end, ext ) ) != 0 )
  605. {
  606. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  607. return( 0 );
  608. return( ret );
  609. }
  610. while( *p < end )
  611. {
  612. if( ( ret = asn1_get_tag( p, end, &len,
  613. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  614. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  615. *p += len;
  616. }
  617. if( *p != end )
  618. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  619. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  620. return( 0 );
  621. }
  622. static int x509_get_basic_constraints( unsigned char **p,
  623. const unsigned char *end,
  624. int *ca_istrue,
  625. int *max_pathlen )
  626. {
  627. int ret;
  628. size_t len;
  629. /*
  630. * BasicConstraints ::= SEQUENCE {
  631. * cA BOOLEAN DEFAULT FALSE,
  632. * pathLenConstraint INTEGER (0..MAX) OPTIONAL }
  633. */
  634. *ca_istrue = 0; /* DEFAULT FALSE */
  635. *max_pathlen = 0; /* endless */
  636. if( ( ret = asn1_get_tag( p, end, &len,
  637. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  638. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  639. if( *p == end )
  640. return 0;
  641. if( ( ret = asn1_get_bool( p, end, ca_istrue ) ) != 0 )
  642. {
  643. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  644. ret = asn1_get_int( p, end, ca_istrue );
  645. if( ret != 0 )
  646. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  647. if( *ca_istrue != 0 )
  648. *ca_istrue = 1;
  649. }
  650. if( *p == end )
  651. return 0;
  652. if( ( ret = asn1_get_int( p, end, max_pathlen ) ) != 0 )
  653. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  654. if( *p != end )
  655. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  656. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  657. (*max_pathlen)++;
  658. return 0;
  659. }
  660. static int x509_get_ns_cert_type( unsigned char **p,
  661. const unsigned char *end,
  662. unsigned char *ns_cert_type)
  663. {
  664. int ret;
  665. x509_bitstring bs = { 0, 0, NULL };
  666. if( ( ret = asn1_get_bitstring( p, end, &bs ) ) != 0 )
  667. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  668. if( bs.len != 1 )
  669. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  670. POLARSSL_ERR_ASN1_INVALID_LENGTH );
  671. /* Get actual bitstring */
  672. *ns_cert_type = *bs.p;
  673. return 0;
  674. }
  675. static int x509_get_key_usage( unsigned char **p,
  676. const unsigned char *end,
  677. unsigned char *key_usage)
  678. {
  679. int ret;
  680. x509_bitstring bs = { 0, 0, NULL };
  681. if( ( ret = asn1_get_bitstring( p, end, &bs ) ) != 0 )
  682. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  683. if( bs.len != 1 )
  684. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  685. POLARSSL_ERR_ASN1_INVALID_LENGTH );
  686. /* Get actual bitstring */
  687. *key_usage = *bs.p;
  688. return 0;
  689. }
  690. /*
  691. * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
  692. *
  693. * KeyPurposeId ::= OBJECT IDENTIFIER
  694. */
  695. static int x509_get_ext_key_usage( unsigned char **p,
  696. const unsigned char *end,
  697. x509_sequence *ext_key_usage)
  698. {
  699. int ret;
  700. if( ( ret = asn1_get_sequence_of( p, end, ext_key_usage, ASN1_OID ) ) != 0 )
  701. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  702. /* Sequence length must be >= 1 */
  703. if( ext_key_usage->buf.p == NULL )
  704. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  705. POLARSSL_ERR_ASN1_INVALID_LENGTH );
  706. return 0;
  707. }
  708. /*
  709. * X.509 v3 extensions
  710. *
  711. * TODO: Perform all of the basic constraints tests required by the RFC
  712. * TODO: Set values for undetected extensions to a sane default?
  713. *
  714. */
  715. static int x509_get_crt_ext( unsigned char **p,
  716. const unsigned char *end,
  717. x509_cert *crt )
  718. {
  719. int ret;
  720. size_t len;
  721. unsigned char *end_ext_data, *end_ext_octet;
  722. if( ( ret = x509_get_ext( p, end, &crt->v3_ext ) ) != 0 )
  723. {
  724. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  725. return( 0 );
  726. return( ret );
  727. }
  728. while( *p < end )
  729. {
  730. /*
  731. * Extension ::= SEQUENCE {
  732. * extnID OBJECT IDENTIFIER,
  733. * critical BOOLEAN DEFAULT FALSE,
  734. * extnValue OCTET STRING }
  735. */
  736. x509_buf extn_oid = {0, 0, NULL};
  737. int is_critical = 0; /* DEFAULT FALSE */
  738. if( ( ret = asn1_get_tag( p, end, &len,
  739. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  740. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  741. end_ext_data = *p + len;
  742. /* Get extension ID */
  743. extn_oid.tag = **p;
  744. if( ( ret = asn1_get_tag( p, end, &extn_oid.len, ASN1_OID ) ) != 0 )
  745. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  746. extn_oid.p = *p;
  747. *p += extn_oid.len;
  748. if( ( end - *p ) < 1 )
  749. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  750. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  751. /* Get optional critical */
  752. if( ( ret = asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 &&
  753. ( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) )
  754. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  755. /* Data should be octet string type */
  756. if( ( ret = asn1_get_tag( p, end_ext_data, &len,
  757. ASN1_OCTET_STRING ) ) != 0 )
  758. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS + ret );
  759. end_ext_octet = *p + len;
  760. if( end_ext_octet != end_ext_data )
  761. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  762. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  763. /*
  764. * Detect supported extensions
  765. */
  766. if( ( OID_SIZE( OID_BASIC_CONSTRAINTS ) == extn_oid.len ) &&
  767. memcmp( extn_oid.p, OID_BASIC_CONSTRAINTS, extn_oid.len ) == 0 )
  768. {
  769. /* Parse basic constraints */
  770. if( ( ret = x509_get_basic_constraints( p, end_ext_octet,
  771. &crt->ca_istrue, &crt->max_pathlen ) ) != 0 )
  772. return ( ret );
  773. crt->ext_types |= EXT_BASIC_CONSTRAINTS;
  774. }
  775. else if( ( OID_SIZE( OID_NS_CERT_TYPE ) == extn_oid.len ) &&
  776. memcmp( extn_oid.p, OID_NS_CERT_TYPE, extn_oid.len ) == 0 )
  777. {
  778. /* Parse netscape certificate type */
  779. if( ( ret = x509_get_ns_cert_type( p, end_ext_octet,
  780. &crt->ns_cert_type ) ) != 0 )
  781. return ( ret );
  782. crt->ext_types |= EXT_NS_CERT_TYPE;
  783. }
  784. else if( ( OID_SIZE( OID_KEY_USAGE ) == extn_oid.len ) &&
  785. memcmp( extn_oid.p, OID_KEY_USAGE, extn_oid.len ) == 0 )
  786. {
  787. /* Parse key usage */
  788. if( ( ret = x509_get_key_usage( p, end_ext_octet,
  789. &crt->key_usage ) ) != 0 )
  790. return ( ret );
  791. crt->ext_types |= EXT_KEY_USAGE;
  792. }
  793. else if( ( OID_SIZE( OID_EXTENDED_KEY_USAGE ) == extn_oid.len ) &&
  794. memcmp( extn_oid.p, OID_EXTENDED_KEY_USAGE, extn_oid.len ) == 0 )
  795. {
  796. /* Parse extended key usage */
  797. if( ( ret = x509_get_ext_key_usage( p, end_ext_octet,
  798. &crt->ext_key_usage ) ) != 0 )
  799. return ( ret );
  800. crt->ext_types |= EXT_EXTENDED_KEY_USAGE;
  801. }
  802. else
  803. {
  804. /* No parser found, skip extension */
  805. *p = end_ext_octet;
  806. #if !defined(POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)
  807. if( is_critical )
  808. {
  809. /* Data is marked as critical: fail */
  810. return ( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  811. POLARSSL_ERR_ASN1_UNEXPECTED_TAG );
  812. }
  813. #endif
  814. }
  815. }
  816. if( *p != end )
  817. return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS +
  818. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  819. return( 0 );
  820. }
  821. /*
  822. * X.509 CRL Entries
  823. */
  824. static int x509_get_entries( unsigned char **p,
  825. const unsigned char *end,
  826. x509_crl_entry *entry )
  827. {
  828. int ret;
  829. size_t entry_len;
  830. x509_crl_entry *cur_entry = entry;
  831. if( *p == end )
  832. return( 0 );
  833. if( ( ret = asn1_get_tag( p, end, &entry_len,
  834. ASN1_SEQUENCE | ASN1_CONSTRUCTED ) ) != 0 )
  835. {
  836. if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  837. return( 0 );
  838. return( ret );
  839. }
  840. end = *p + entry_len;
  841. while( *p < end )
  842. {
  843. size_t len2;
  844. if( ( ret = asn1_get_tag( p, end, &len2,
  845. ASN1_SEQUENCE | ASN1_CONSTRUCTED ) ) != 0 )
  846. {
  847. return( ret );
  848. }
  849. cur_entry->raw.tag = **p;
  850. cur_entry->raw.p = *p;
  851. cur_entry->raw.len = len2;
  852. if( ( ret = x509_get_serial( p, end, &cur_entry->serial ) ) != 0 )
  853. return( ret );
  854. if( ( ret = x509_get_time( p, end, &cur_entry->revocation_date ) ) != 0 )
  855. return( ret );
  856. if( ( ret = x509_get_crl_ext( p, end, &cur_entry->entry_ext ) ) != 0 )
  857. return( ret );
  858. if ( *p < end )
  859. {
  860. cur_entry->next = malloc( sizeof( x509_crl_entry ) );
  861. cur_entry = cur_entry->next;
  862. memset( cur_entry, 0, sizeof( x509_crl_entry ) );
  863. }
  864. }
  865. return( 0 );
  866. }
  867. static int x509_get_sig_alg( const x509_buf *sig_oid, int *sig_alg )
  868. {
  869. if( sig_oid->len == 9 &&
  870. memcmp( sig_oid->p, OID_PKCS1, 8 ) == 0 )
  871. {
  872. if( sig_oid->p[8] >= 2 && sig_oid->p[8] <= 5 )
  873. {
  874. *sig_alg = sig_oid->p[8];
  875. return( 0 );
  876. }
  877. if ( sig_oid->p[8] >= 11 && sig_oid->p[8] <= 14 )
  878. {
  879. *sig_alg = sig_oid->p[8];
  880. return( 0 );
  881. }
  882. return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
  883. }
  884. if( sig_oid->len == 5 &&
  885. memcmp( sig_oid->p, OID_RSA_SHA_OBS, 5 ) == 0 )
  886. {
  887. *sig_alg = SIG_RSA_SHA1;
  888. return( 0 );
  889. }
  890. return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
  891. }
  892. /*
  893. * Parse one or more certificates and add them to the chained list
  894. */
  895. int x509parse_crt( x509_cert *chain, const unsigned char *buf, size_t buflen )
  896. {
  897. int ret;
  898. size_t len;
  899. unsigned char *p, *end;
  900. x509_cert *crt;
  901. #if defined(POLARSSL_PEM_C)
  902. pem_context pem;
  903. size_t use_len;
  904. #endif
  905. crt = chain;
  906. /*
  907. * Check for valid input
  908. */
  909. if( crt == NULL || buf == NULL )
  910. return( 1 );
  911. while( crt->version != 0 && crt->next != NULL )
  912. crt = crt->next;
  913. /*
  914. * Add new certificate on the end of the chain if needed.
  915. */
  916. if ( crt->version != 0 && crt->next == NULL)
  917. {
  918. crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
  919. if( crt->next == NULL )
  920. {
  921. x509_free( crt );
  922. return( 1 );
  923. }
  924. crt = crt->next;
  925. memset( crt, 0, sizeof( x509_cert ) );
  926. }
  927. #if defined(POLARSSL_PEM_C)
  928. pem_init( &pem );
  929. ret = pem_read_buffer( &pem,
  930. "-----BEGIN CERTIFICATE-----",
  931. "-----END CERTIFICATE-----",
  932. buf, NULL, 0, &use_len );
  933. if( ret == 0 )
  934. {
  935. /*
  936. * Was PEM encoded
  937. */
  938. buflen -= use_len;
  939. buf += use_len;
  940. /*
  941. * Steal PEM buffer
  942. */
  943. p = pem.buf;
  944. pem.buf = NULL;
  945. len = pem.buflen;
  946. pem_free( &pem );
  947. }
  948. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  949. {
  950. pem_free( &pem );
  951. return( ret );
  952. }
  953. else
  954. {
  955. /*
  956. * nope, copy the raw DER data
  957. */
  958. p = (unsigned char *) malloc( len = buflen );
  959. if( p == NULL )
  960. return( 1 );
  961. memcpy( p, buf, buflen );
  962. buflen = 0;
  963. }
  964. #else
  965. p = (unsigned char *) malloc( len = buflen );
  966. if( p == NULL )
  967. return( 1 );
  968. memcpy( p, buf, buflen );
  969. buflen = 0;
  970. #endif
  971. crt->raw.p = p;
  972. crt->raw.len = len;
  973. end = p + len;
  974. /*
  975. * Certificate ::= SEQUENCE {
  976. * tbsCertificate TBSCertificate,
  977. * signatureAlgorithm AlgorithmIdentifier,
  978. * signatureValue BIT STRING }
  979. */
  980. if( ( ret = asn1_get_tag( &p, end, &len,
  981. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  982. {
  983. x509_free( crt );
  984. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT );
  985. }
  986. if( len != (size_t) ( end - p ) )
  987. {
  988. x509_free( crt );
  989. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  990. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  991. }
  992. /*
  993. * TBSCertificate ::= SEQUENCE {
  994. */
  995. crt->tbs.p = p;
  996. if( ( ret = asn1_get_tag( &p, end, &len,
  997. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  998. {
  999. x509_free( crt );
  1000. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1001. }
  1002. end = p + len;
  1003. crt->tbs.len = end - crt->tbs.p;
  1004. /*
  1005. * Version ::= INTEGER { v1(0), v2(1), v3(2) }
  1006. *
  1007. * CertificateSerialNumber ::= INTEGER
  1008. *
  1009. * signature AlgorithmIdentifier
  1010. */
  1011. if( ( ret = x509_get_version( &p, end, &crt->version ) ) != 0 ||
  1012. ( ret = x509_get_serial( &p, end, &crt->serial ) ) != 0 ||
  1013. ( ret = x509_get_alg( &p, end, &crt->sig_oid1 ) ) != 0 )
  1014. {
  1015. x509_free( crt );
  1016. return( ret );
  1017. }
  1018. crt->version++;
  1019. if( crt->version > 3 )
  1020. {
  1021. x509_free( crt );
  1022. return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION );
  1023. }
  1024. if( ( ret = x509_get_sig_alg( &crt->sig_oid1, &crt->sig_alg ) ) != 0 )
  1025. {
  1026. x509_free( crt );
  1027. return( ret );
  1028. }
  1029. /*
  1030. * issuer Name
  1031. */
  1032. crt->issuer_raw.p = p;
  1033. if( ( ret = asn1_get_tag( &p, end, &len,
  1034. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1035. {
  1036. x509_free( crt );
  1037. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1038. }
  1039. if( ( ret = x509_get_name( &p, p + len, &crt->issuer ) ) != 0 )
  1040. {
  1041. x509_free( crt );
  1042. return( ret );
  1043. }
  1044. crt->issuer_raw.len = p - crt->issuer_raw.p;
  1045. /*
  1046. * Validity ::= SEQUENCE {
  1047. * notBefore Time,
  1048. * notAfter Time }
  1049. *
  1050. */
  1051. if( ( ret = x509_get_dates( &p, end, &crt->valid_from,
  1052. &crt->valid_to ) ) != 0 )
  1053. {
  1054. x509_free( crt );
  1055. return( ret );
  1056. }
  1057. /*
  1058. * subject Name
  1059. */
  1060. crt->subject_raw.p = p;
  1061. if( ( ret = asn1_get_tag( &p, end, &len,
  1062. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1063. {
  1064. x509_free( crt );
  1065. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1066. }
  1067. if( ( ret = x509_get_name( &p, p + len, &crt->subject ) ) != 0 )
  1068. {
  1069. x509_free( crt );
  1070. return( ret );
  1071. }
  1072. crt->subject_raw.len = p - crt->subject_raw.p;
  1073. /*
  1074. * SubjectPublicKeyInfo ::= SEQUENCE
  1075. * algorithm AlgorithmIdentifier,
  1076. * subjectPublicKey BIT STRING }
  1077. */
  1078. if( ( ret = asn1_get_tag( &p, end, &len,
  1079. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1080. {
  1081. x509_free( crt );
  1082. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1083. }
  1084. if( ( ret = x509_get_pubkey( &p, p + len, &crt->pk_oid,
  1085. &crt->rsa.N, &crt->rsa.E ) ) != 0 )
  1086. {
  1087. x509_free( crt );
  1088. return( ret );
  1089. }
  1090. if( ( ret = rsa_check_pubkey( &crt->rsa ) ) != 0 )
  1091. {
  1092. x509_free( crt );
  1093. return( ret );
  1094. }
  1095. crt->rsa.len = mpi_size( &crt->rsa.N );
  1096. /*
  1097. * issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
  1098. * -- If present, version shall be v2 or v3
  1099. * subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
  1100. * -- If present, version shall be v2 or v3
  1101. * extensions [3] EXPLICIT Extensions OPTIONAL
  1102. * -- If present, version shall be v3
  1103. */
  1104. if( crt->version == 2 || crt->version == 3 )
  1105. {
  1106. ret = x509_get_uid( &p, end, &crt->issuer_id, 1 );
  1107. if( ret != 0 )
  1108. {
  1109. x509_free( crt );
  1110. return( ret );
  1111. }
  1112. }
  1113. if( crt->version == 2 || crt->version == 3 )
  1114. {
  1115. ret = x509_get_uid( &p, end, &crt->subject_id, 2 );
  1116. if( ret != 0 )
  1117. {
  1118. x509_free( crt );
  1119. return( ret );
  1120. }
  1121. }
  1122. if( crt->version == 3 )
  1123. {
  1124. ret = x509_get_crt_ext( &p, end, crt);
  1125. if( ret != 0 )
  1126. {
  1127. x509_free( crt );
  1128. return( ret );
  1129. }
  1130. }
  1131. if( p != end )
  1132. {
  1133. x509_free( crt );
  1134. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1135. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1136. }
  1137. end = crt->raw.p + crt->raw.len;
  1138. /*
  1139. * signatureAlgorithm AlgorithmIdentifier,
  1140. * signatureValue BIT STRING
  1141. */
  1142. if( ( ret = x509_get_alg( &p, end, &crt->sig_oid2 ) ) != 0 )
  1143. {
  1144. x509_free( crt );
  1145. return( ret );
  1146. }
  1147. if( memcmp( crt->sig_oid1.p, crt->sig_oid2.p, crt->sig_oid1.len ) != 0 )
  1148. {
  1149. x509_free( crt );
  1150. return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH );
  1151. }
  1152. if( ( ret = x509_get_sig( &p, end, &crt->sig ) ) != 0 )
  1153. {
  1154. x509_free( crt );
  1155. return( ret );
  1156. }
  1157. if( p != end )
  1158. {
  1159. x509_free( crt );
  1160. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1161. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1162. }
  1163. if( buflen > 0 )
  1164. {
  1165. crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
  1166. if( crt->next == NULL )
  1167. {
  1168. x509_free( crt );
  1169. return( 1 );
  1170. }
  1171. crt = crt->next;
  1172. memset( crt, 0, sizeof( x509_cert ) );
  1173. return( x509parse_crt( crt, buf, buflen ) );
  1174. }
  1175. return( 0 );
  1176. }
  1177. /*
  1178. * Parse one or more CRLs and add them to the chained list
  1179. */
  1180. int x509parse_crl( x509_crl *chain, const unsigned char *buf, size_t buflen )
  1181. {
  1182. int ret;
  1183. size_t len;
  1184. unsigned char *p, *end;
  1185. x509_crl *crl;
  1186. #if defined(POLARSSL_PEM_C)
  1187. size_t use_len;
  1188. pem_context pem;
  1189. #endif
  1190. crl = chain;
  1191. /*
  1192. * Check for valid input
  1193. */
  1194. if( crl == NULL || buf == NULL )
  1195. return( 1 );
  1196. while( crl->version != 0 && crl->next != NULL )
  1197. crl = crl->next;
  1198. /*
  1199. * Add new CRL on the end of the chain if needed.
  1200. */
  1201. if ( crl->version != 0 && crl->next == NULL)
  1202. {
  1203. crl->next = (x509_crl *) malloc( sizeof( x509_crl ) );
  1204. if( crl->next == NULL )
  1205. {
  1206. x509_crl_free( crl );
  1207. return( 1 );
  1208. }
  1209. crl = crl->next;
  1210. memset( crl, 0, sizeof( x509_crl ) );
  1211. }
  1212. #if defined(POLARSSL_PEM_C)
  1213. pem_init( &pem );
  1214. ret = pem_read_buffer( &pem,
  1215. "-----BEGIN X509 CRL-----",
  1216. "-----END X509 CRL-----",
  1217. buf, NULL, 0, &use_len );
  1218. if( ret == 0 )
  1219. {
  1220. /*
  1221. * Was PEM encoded
  1222. */
  1223. buflen -= use_len;
  1224. buf += use_len;
  1225. /*
  1226. * Steal PEM buffer
  1227. */
  1228. p = pem.buf;
  1229. pem.buf = NULL;
  1230. len = pem.buflen;
  1231. pem_free( &pem );
  1232. }
  1233. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1234. {
  1235. pem_free( &pem );
  1236. return( ret );
  1237. }
  1238. else
  1239. {
  1240. /*
  1241. * nope, copy the raw DER data
  1242. */
  1243. p = (unsigned char *) malloc( len = buflen );
  1244. if( p == NULL )
  1245. return( 1 );
  1246. memcpy( p, buf, buflen );
  1247. buflen = 0;
  1248. }
  1249. #else
  1250. p = (unsigned char *) malloc( len = buflen );
  1251. if( p == NULL )
  1252. return( 1 );
  1253. memcpy( p, buf, buflen );
  1254. buflen = 0;
  1255. #endif
  1256. crl->raw.p = p;
  1257. crl->raw.len = len;
  1258. end = p + len;
  1259. /*
  1260. * CertificateList ::= SEQUENCE {
  1261. * tbsCertList TBSCertList,
  1262. * signatureAlgorithm AlgorithmIdentifier,
  1263. * signatureValue BIT STRING }
  1264. */
  1265. if( ( ret = asn1_get_tag( &p, end, &len,
  1266. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1267. {
  1268. x509_crl_free( crl );
  1269. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT );
  1270. }
  1271. if( len != (size_t) ( end - p ) )
  1272. {
  1273. x509_crl_free( crl );
  1274. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1275. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1276. }
  1277. /*
  1278. * TBSCertList ::= SEQUENCE {
  1279. */
  1280. crl->tbs.p = p;
  1281. if( ( ret = asn1_get_tag( &p, end, &len,
  1282. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1283. {
  1284. x509_crl_free( crl );
  1285. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1286. }
  1287. end = p + len;
  1288. crl->tbs.len = end - crl->tbs.p;
  1289. /*
  1290. * Version ::= INTEGER OPTIONAL { v1(0), v2(1) }
  1291. * -- if present, MUST be v2
  1292. *
  1293. * signature AlgorithmIdentifier
  1294. */
  1295. if( ( ret = x509_get_version( &p, end, &crl->version ) ) != 0 ||
  1296. ( ret = x509_get_alg( &p, end, &crl->sig_oid1 ) ) != 0 )
  1297. {
  1298. x509_crl_free( crl );
  1299. return( ret );
  1300. }
  1301. crl->version++;
  1302. if( crl->version > 2 )
  1303. {
  1304. x509_crl_free( crl );
  1305. return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION );
  1306. }
  1307. if( ( ret = x509_get_sig_alg( &crl->sig_oid1, &crl->sig_alg ) ) != 0 )
  1308. {
  1309. x509_crl_free( crl );
  1310. return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
  1311. }
  1312. /*
  1313. * issuer Name
  1314. */
  1315. crl->issuer_raw.p = p;
  1316. if( ( ret = asn1_get_tag( &p, end, &len,
  1317. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1318. {
  1319. x509_crl_free( crl );
  1320. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1321. }
  1322. if( ( ret = x509_get_name( &p, p + len, &crl->issuer ) ) != 0 )
  1323. {
  1324. x509_crl_free( crl );
  1325. return( ret );
  1326. }
  1327. crl->issuer_raw.len = p - crl->issuer_raw.p;
  1328. /*
  1329. * thisUpdate Time
  1330. * nextUpdate Time OPTIONAL
  1331. */
  1332. if( ( ret = x509_get_time( &p, end, &crl->this_update ) ) != 0 )
  1333. {
  1334. x509_crl_free( crl );
  1335. return( ret );
  1336. }
  1337. if( ( ret = x509_get_time( &p, end, &crl->next_update ) ) != 0 )
  1338. {
  1339. if ( ret != ( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  1340. POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) &&
  1341. ret != ( POLARSSL_ERR_X509_CERT_INVALID_DATE +
  1342. POLARSSL_ERR_ASN1_OUT_OF_DATA ) )
  1343. {
  1344. x509_crl_free( crl );
  1345. return( ret );
  1346. }
  1347. }
  1348. /*
  1349. * revokedCertificates SEQUENCE OF SEQUENCE {
  1350. * userCertificate CertificateSerialNumber,
  1351. * revocationDate Time,
  1352. * crlEntryExtensions Extensions OPTIONAL
  1353. * -- if present, MUST be v2
  1354. * } OPTIONAL
  1355. */
  1356. if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 )
  1357. {
  1358. x509_crl_free( crl );
  1359. return( ret );
  1360. }
  1361. /*
  1362. * crlExtensions EXPLICIT Extensions OPTIONAL
  1363. * -- if present, MUST be v2
  1364. */
  1365. if( crl->version == 2 )
  1366. {
  1367. ret = x509_get_crl_ext( &p, end, &crl->crl_ext );
  1368. if( ret != 0 )
  1369. {
  1370. x509_crl_free( crl );
  1371. return( ret );
  1372. }
  1373. }
  1374. if( p != end )
  1375. {
  1376. x509_crl_free( crl );
  1377. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1378. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1379. }
  1380. end = crl->raw.p + crl->raw.len;
  1381. /*
  1382. * signatureAlgorithm AlgorithmIdentifier,
  1383. * signatureValue BIT STRING
  1384. */
  1385. if( ( ret = x509_get_alg( &p, end, &crl->sig_oid2 ) ) != 0 )
  1386. {
  1387. x509_crl_free( crl );
  1388. return( ret );
  1389. }
  1390. if( memcmp( crl->sig_oid1.p, crl->sig_oid2.p, crl->sig_oid1.len ) != 0 )
  1391. {
  1392. x509_crl_free( crl );
  1393. return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH );
  1394. }
  1395. if( ( ret = x509_get_sig( &p, end, &crl->sig ) ) != 0 )
  1396. {
  1397. x509_crl_free( crl );
  1398. return( ret );
  1399. }
  1400. if( p != end )
  1401. {
  1402. x509_crl_free( crl );
  1403. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT +
  1404. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1405. }
  1406. if( buflen > 0 )
  1407. {
  1408. crl->next = (x509_crl *) malloc( sizeof( x509_crl ) );
  1409. if( crl->next == NULL )
  1410. {
  1411. x509_crl_free( crl );
  1412. return( 1 );
  1413. }
  1414. crl = crl->next;
  1415. memset( crl, 0, sizeof( x509_crl ) );
  1416. return( x509parse_crl( crl, buf, buflen ) );
  1417. }
  1418. return( 0 );
  1419. }
  1420. #if defined(POLARSSL_FS_IO)
  1421. /*
  1422. * Load all data from a file into a given buffer.
  1423. */
  1424. int load_file( const char *path, unsigned char **buf, size_t *n )
  1425. {
  1426. FILE *f;
  1427. if( ( f = fopen( path, "rb" ) ) == NULL )
  1428. return( 1 );
  1429. fseek( f, 0, SEEK_END );
  1430. *n = (size_t) ftell( f );
  1431. fseek( f, 0, SEEK_SET );
  1432. if( ( *buf = (unsigned char *) malloc( *n + 1 ) ) == NULL )
  1433. return( 1 );
  1434. if( fread( *buf, 1, *n, f ) != *n )
  1435. {
  1436. fclose( f );
  1437. free( *buf );
  1438. return( 1 );
  1439. }
  1440. fclose( f );
  1441. (*buf)[*n] = '\0';
  1442. return( 0 );
  1443. }
  1444. /*
  1445. * Load one or more certificates and add them to the chained list
  1446. */
  1447. int x509parse_crtfile( x509_cert *chain, const char *path )
  1448. {
  1449. int ret;
  1450. size_t n;
  1451. unsigned char *buf;
  1452. if ( load_file( path, &buf, &n ) )
  1453. return( 1 );
  1454. ret = x509parse_crt( chain, buf, n );
  1455. memset( buf, 0, n + 1 );
  1456. free( buf );
  1457. return( ret );
  1458. }
  1459. /*
  1460. * Load one or more CRLs and add them to the chained list
  1461. */
  1462. int x509parse_crlfile( x509_crl *chain, const char *path )
  1463. {
  1464. int ret;
  1465. size_t n;
  1466. unsigned char *buf;
  1467. if ( load_file( path, &buf, &n ) )
  1468. return( 1 );
  1469. ret = x509parse_crl( chain, buf, n );
  1470. memset( buf, 0, n + 1 );
  1471. free( buf );
  1472. return( ret );
  1473. }
  1474. /*
  1475. * Load and parse a private RSA key
  1476. */
  1477. int x509parse_keyfile( rsa_context *rsa, const char *path, const char *pwd )
  1478. {
  1479. int ret;
  1480. size_t n;
  1481. unsigned char *buf;
  1482. if ( load_file( path, &buf, &n ) )
  1483. return( 1 );
  1484. if( pwd == NULL )
  1485. ret = x509parse_key( rsa, buf, n, NULL, 0 );
  1486. else
  1487. ret = x509parse_key( rsa, buf, n,
  1488. (unsigned char *) pwd, strlen( pwd ) );
  1489. memset( buf, 0, n + 1 );
  1490. free( buf );
  1491. return( ret );
  1492. }
  1493. /*
  1494. * Load and parse a public RSA key
  1495. */
  1496. int x509parse_public_keyfile( rsa_context *rsa, const char *path )
  1497. {
  1498. int ret;
  1499. size_t n;
  1500. unsigned char *buf;
  1501. if ( load_file( path, &buf, &n ) )
  1502. return( 1 );
  1503. ret = x509parse_public_key( rsa, buf, n );
  1504. memset( buf, 0, n + 1 );
  1505. free( buf );
  1506. return( ret );
  1507. }
  1508. #endif /* POLARSSL_FS_IO */
  1509. /*
  1510. * Parse a private RSA key
  1511. */
  1512. int x509parse_key( rsa_context *rsa, const unsigned char *key, size_t keylen,
  1513. const unsigned char *pwd, size_t pwdlen )
  1514. {
  1515. int ret;
  1516. size_t len;
  1517. unsigned char *p, *end;
  1518. unsigned char *p_alt;
  1519. x509_buf pk_alg_oid;
  1520. #if defined(POLARSSL_PEM_C)
  1521. pem_context pem;
  1522. pem_init( &pem );
  1523. ret = pem_read_buffer( &pem,
  1524. "-----BEGIN RSA PRIVATE KEY-----",
  1525. "-----END RSA PRIVATE KEY-----",
  1526. key, pwd, pwdlen, &len );
  1527. if( ret == POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1528. {
  1529. ret = pem_read_buffer( &pem,
  1530. "-----BEGIN PRIVATE KEY-----",
  1531. "-----END PRIVATE KEY-----",
  1532. key, pwd, pwdlen, &len );
  1533. }
  1534. if( ret == 0 )
  1535. {
  1536. /*
  1537. * Was PEM encoded
  1538. */
  1539. keylen = pem.buflen;
  1540. }
  1541. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1542. {
  1543. pem_free( &pem );
  1544. return( ret );
  1545. }
  1546. p = ( ret == 0 ) ? pem.buf : (unsigned char *) key;
  1547. #else
  1548. ((void) pwd);
  1549. ((void) pwdlen);
  1550. p = (unsigned char *) key;
  1551. #endif
  1552. end = p + keylen;
  1553. /*
  1554. * Note: Depending on the type of private key file one can expect either a
  1555. * PrivatKeyInfo object (PKCS#8) or a RSAPrivateKey (PKCS#1) directly.
  1556. *
  1557. * PrivateKeyInfo ::= SEQUENCE {
  1558. * version Version,
  1559. * algorithm AlgorithmIdentifier,
  1560. * PrivateKey BIT STRING
  1561. * }
  1562. *
  1563. * AlgorithmIdentifier ::= SEQUENCE {
  1564. * algorithm OBJECT IDENTIFIER,
  1565. * parameters ANY DEFINED BY algorithm OPTIONAL
  1566. * }
  1567. *
  1568. * RSAPrivateKey ::= SEQUENCE {
  1569. * version Version,
  1570. * modulus INTEGER, -- n
  1571. * publicExponent INTEGER, -- e
  1572. * privateExponent INTEGER, -- d
  1573. * prime1 INTEGER, -- p
  1574. * prime2 INTEGER, -- q
  1575. * exponent1 INTEGER, -- d mod (p-1)
  1576. * exponent2 INTEGER, -- d mod (q-1)
  1577. * coefficient INTEGER, -- (inverse of q) mod p
  1578. * otherPrimeInfos OtherPrimeInfos OPTIONAL
  1579. * }
  1580. */
  1581. if( ( ret = asn1_get_tag( &p, end, &len,
  1582. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1583. {
  1584. #if defined(POLARSSL_PEM_C)
  1585. pem_free( &pem );
  1586. #endif
  1587. rsa_free( rsa );
  1588. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1589. }
  1590. end = p + len;
  1591. if( ( ret = asn1_get_int( &p, end, &rsa->ver ) ) != 0 )
  1592. {
  1593. #if defined(POLARSSL_PEM_C)
  1594. pem_free( &pem );
  1595. #endif
  1596. rsa_free( rsa );
  1597. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1598. }
  1599. if( rsa->ver != 0 )
  1600. {
  1601. #if defined(POLARSSL_PEM_C)
  1602. pem_free( &pem );
  1603. #endif
  1604. rsa_free( rsa );
  1605. return( POLARSSL_ERR_X509_KEY_INVALID_VERSION + ret );
  1606. }
  1607. p_alt = p;
  1608. if( ( ret = x509_get_alg( &p_alt, end, &pk_alg_oid ) ) != 0 )
  1609. {
  1610. // Assume that we have the PKCS#1 format if wrong
  1611. // tag was encountered
  1612. //
  1613. if( ret != POLARSSL_ERR_X509_CERT_INVALID_ALG +
  1614. POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
  1615. {
  1616. #if defined(POLARSSL_PEM_C)
  1617. pem_free( &pem );
  1618. #endif
  1619. rsa_free( rsa );
  1620. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT );
  1621. }
  1622. }
  1623. else
  1624. {
  1625. int can_handle;
  1626. /*
  1627. * only RSA keys handled at this time
  1628. */
  1629. can_handle = 0;
  1630. if( pk_alg_oid.len == 9 &&
  1631. memcmp( pk_alg_oid.p, OID_PKCS1_RSA, 9 ) == 0 )
  1632. can_handle = 1;
  1633. if( pk_alg_oid.len == 9 &&
  1634. memcmp( pk_alg_oid.p, OID_PKCS1, 8 ) == 0 )
  1635. {
  1636. if( pk_alg_oid.p[8] >= 2 && pk_alg_oid.p[8] <= 5 )
  1637. can_handle = 1;
  1638. if ( pk_alg_oid.p[8] >= 11 && pk_alg_oid.p[8] <= 14 )
  1639. can_handle = 1;
  1640. }
  1641. if( pk_alg_oid.len == 5 &&
  1642. memcmp( pk_alg_oid.p, OID_RSA_SHA_OBS, 5 ) == 0 )
  1643. can_handle = 1;
  1644. if( can_handle == 0 )
  1645. return( POLARSSL_ERR_X509_UNKNOWN_PK_ALG );
  1646. /*
  1647. * Parse the PKCS#8 format
  1648. */
  1649. p = p_alt;
  1650. if( ( ret = asn1_get_tag( &p, end, &len, ASN1_OCTET_STRING ) ) != 0 )
  1651. {
  1652. #if defined(POLARSSL_PEM_C)
  1653. pem_free( &pem );
  1654. #endif
  1655. rsa_free( rsa );
  1656. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1657. }
  1658. if( ( end - p ) < 1 )
  1659. {
  1660. #if defined(POLARSSL_PEM_C)
  1661. pem_free( &pem );
  1662. #endif
  1663. rsa_free( rsa );
  1664. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT +
  1665. POLARSSL_ERR_ASN1_OUT_OF_DATA );
  1666. }
  1667. end = p + len;
  1668. if( ( ret = asn1_get_tag( &p, end, &len,
  1669. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1670. {
  1671. #if defined(POLARSSL_PEM_C)
  1672. pem_free( &pem );
  1673. #endif
  1674. rsa_free( rsa );
  1675. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1676. }
  1677. end = p + len;
  1678. if( ( ret = asn1_get_int( &p, end, &rsa->ver ) ) != 0 )
  1679. {
  1680. #if defined(POLARSSL_PEM_C)
  1681. pem_free( &pem );
  1682. #endif
  1683. rsa_free( rsa );
  1684. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1685. }
  1686. if( rsa->ver != 0 )
  1687. {
  1688. #if defined(POLARSSL_PEM_C)
  1689. pem_free( &pem );
  1690. #endif
  1691. rsa_free( rsa );
  1692. return( POLARSSL_ERR_X509_KEY_INVALID_VERSION + ret );
  1693. }
  1694. }
  1695. if( ( ret = asn1_get_mpi( &p, end, &rsa->N ) ) != 0 ||
  1696. ( ret = asn1_get_mpi( &p, end, &rsa->E ) ) != 0 ||
  1697. ( ret = asn1_get_mpi( &p, end, &rsa->D ) ) != 0 ||
  1698. ( ret = asn1_get_mpi( &p, end, &rsa->P ) ) != 0 ||
  1699. ( ret = asn1_get_mpi( &p, end, &rsa->Q ) ) != 0 ||
  1700. ( ret = asn1_get_mpi( &p, end, &rsa->DP ) ) != 0 ||
  1701. ( ret = asn1_get_mpi( &p, end, &rsa->DQ ) ) != 0 ||
  1702. ( ret = asn1_get_mpi( &p, end, &rsa->QP ) ) != 0 )
  1703. {
  1704. #if defined(POLARSSL_PEM_C)
  1705. pem_free( &pem );
  1706. #endif
  1707. rsa_free( rsa );
  1708. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1709. }
  1710. rsa->len = mpi_size( &rsa->N );
  1711. if( p != end )
  1712. {
  1713. #if defined(POLARSSL_PEM_C)
  1714. pem_free( &pem );
  1715. #endif
  1716. rsa_free( rsa );
  1717. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT +
  1718. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1719. }
  1720. if( ( ret = rsa_check_privkey( rsa ) ) != 0 )
  1721. {
  1722. #if defined(POLARSSL_PEM_C)
  1723. pem_free( &pem );
  1724. #endif
  1725. rsa_free( rsa );
  1726. return( ret );
  1727. }
  1728. #if defined(POLARSSL_PEM_C)
  1729. pem_free( &pem );
  1730. #endif
  1731. return( 0 );
  1732. }
  1733. /*
  1734. * Parse a public RSA key
  1735. */
  1736. int x509parse_public_key( rsa_context *rsa, const unsigned char *key, size_t keylen )
  1737. {
  1738. int ret;
  1739. size_t len;
  1740. unsigned char *p, *end;
  1741. x509_buf alg_oid;
  1742. #if defined(POLARSSL_PEM_C)
  1743. pem_context pem;
  1744. pem_init( &pem );
  1745. ret = pem_read_buffer( &pem,
  1746. "-----BEGIN PUBLIC KEY-----",
  1747. "-----END PUBLIC KEY-----",
  1748. key, NULL, 0, &len );
  1749. if( ret == 0 )
  1750. {
  1751. /*
  1752. * Was PEM encoded
  1753. */
  1754. keylen = pem.buflen;
  1755. }
  1756. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1757. {
  1758. pem_free( &pem );
  1759. return( ret );
  1760. }
  1761. p = ( ret == 0 ) ? pem.buf : (unsigned char *) key;
  1762. #else
  1763. p = (unsigned char *) key;
  1764. #endif
  1765. end = p + keylen;
  1766. /*
  1767. * PublicKeyInfo ::= SEQUENCE {
  1768. * algorithm AlgorithmIdentifier,
  1769. * PublicKey BIT STRING
  1770. * }
  1771. *
  1772. * AlgorithmIdentifier ::= SEQUENCE {
  1773. * algorithm OBJECT IDENTIFIER,
  1774. * parameters ANY DEFINED BY algorithm OPTIONAL
  1775. * }
  1776. *
  1777. * RSAPublicKey ::= SEQUENCE {
  1778. * modulus INTEGER, -- n
  1779. * publicExponent INTEGER -- e
  1780. * }
  1781. */
  1782. if( ( ret = asn1_get_tag( &p, end, &len,
  1783. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1784. {
  1785. #if defined(POLARSSL_PEM_C)
  1786. pem_free( &pem );
  1787. #endif
  1788. rsa_free( rsa );
  1789. return( POLARSSL_ERR_X509_CERT_INVALID_FORMAT + ret );
  1790. }
  1791. if( ( ret = x509_get_pubkey( &p, end, &alg_oid, &rsa->N, &rsa->E ) ) != 0 )
  1792. {
  1793. #if defined(POLARSSL_PEM_C)
  1794. pem_free( &pem );
  1795. #endif
  1796. rsa_free( rsa );
  1797. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1798. }
  1799. if( ( ret = rsa_check_pubkey( rsa ) ) != 0 )
  1800. {
  1801. #if defined(POLARSSL_PEM_C)
  1802. pem_free( &pem );
  1803. #endif
  1804. rsa_free( rsa );
  1805. return( ret );
  1806. }
  1807. rsa->len = mpi_size( &rsa->N );
  1808. #if defined(POLARSSL_PEM_C)
  1809. pem_free( &pem );
  1810. #endif
  1811. return( 0 );
  1812. }
  1813. #if defined(POLARSSL_DHM_C)
  1814. /*
  1815. * Parse DHM parameters
  1816. */
  1817. int x509parse_dhm( dhm_context *dhm, const unsigned char *dhmin, size_t dhminlen )
  1818. {
  1819. int ret;
  1820. size_t len;
  1821. unsigned char *p, *end;
  1822. #if defined(POLARSSL_PEM_C)
  1823. pem_context pem;
  1824. pem_init( &pem );
  1825. ret = pem_read_buffer( &pem,
  1826. "-----BEGIN DH PARAMETERS-----",
  1827. "-----END DH PARAMETERS-----",
  1828. dhmin, NULL, 0, &dhminlen );
  1829. if( ret == 0 )
  1830. {
  1831. /*
  1832. * Was PEM encoded
  1833. */
  1834. dhminlen = pem.buflen;
  1835. }
  1836. else if( ret != POLARSSL_ERR_PEM_NO_HEADER_PRESENT )
  1837. {
  1838. pem_free( &pem );
  1839. return( ret );
  1840. }
  1841. p = ( ret == 0 ) ? pem.buf : (unsigned char *) dhmin;
  1842. #else
  1843. p = (unsigned char *) dhmin;
  1844. #endif
  1845. end = p + dhminlen;
  1846. memset( dhm, 0, sizeof( dhm_context ) );
  1847. /*
  1848. * DHParams ::= SEQUENCE {
  1849. * prime INTEGER, -- P
  1850. * generator INTEGER, -- g
  1851. * }
  1852. */
  1853. if( ( ret = asn1_get_tag( &p, end, &len,
  1854. ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
  1855. {
  1856. #if defined(POLARSSL_PEM_C)
  1857. pem_free( &pem );
  1858. #endif
  1859. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1860. }
  1861. end = p + len;
  1862. if( ( ret = asn1_get_mpi( &p, end, &dhm->P ) ) != 0 ||
  1863. ( ret = asn1_get_mpi( &p, end, &dhm->G ) ) != 0 )
  1864. {
  1865. #if defined(POLARSSL_PEM_C)
  1866. pem_free( &pem );
  1867. #endif
  1868. dhm_free( dhm );
  1869. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT + ret );
  1870. }
  1871. if( p != end )
  1872. {
  1873. #if defined(POLARSSL_PEM_C)
  1874. pem_free( &pem );
  1875. #endif
  1876. dhm_free( dhm );
  1877. return( POLARSSL_ERR_X509_KEY_INVALID_FORMAT +
  1878. POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
  1879. }
  1880. #if defined(POLARSSL_PEM_C)
  1881. pem_free( &pem );
  1882. #endif
  1883. return( 0 );
  1884. }
  1885. #if defined(POLARSSL_FS_IO)
  1886. /*
  1887. * Load and parse a private RSA key
  1888. */
  1889. int x509parse_dhmfile( dhm_context *dhm, const char *path )
  1890. {
  1891. int ret;
  1892. size_t n;
  1893. unsigned char *buf;
  1894. if ( load_file( path, &buf, &n ) )
  1895. return( 1 );
  1896. ret = x509parse_dhm( dhm, buf, n );
  1897. memset( buf, 0, n + 1 );
  1898. free( buf );
  1899. return( ret );
  1900. }
  1901. #endif /* POLARSSL_FS_IO */
  1902. #endif /* POLARSSL_DHM_C */
  1903. #if defined _MSC_VER && !defined snprintf
  1904. #include <stdarg.h>
  1905. #if !defined vsnprintf
  1906. #define vsnprintf _vsnprintf
  1907. #endif // vsnprintf
  1908. /*
  1909. * Windows _snprintf and _vsnprintf are not compatible to linux versions.
  1910. * Result value is not size of buffer needed, but -1 if no fit is possible.
  1911. *
  1912. * This fuction tries to 'fix' this by at least suggesting enlarging the
  1913. * size by 20.
  1914. */
  1915. int compat_snprintf(char *str, size_t size, const char *format, ...)
  1916. {
  1917. va_list ap;
  1918. int res = -1;
  1919. va_start( ap, format );
  1920. res = vsnprintf( str, size, format, ap );
  1921. va_end( ap );
  1922. // No quick fix possible
  1923. if ( res < 0 )
  1924. return( (int) size + 20 );
  1925. return res;
  1926. }
  1927. #define snprintf compat_snprintf
  1928. #endif
  1929. #define POLARSSL_ERR_DEBUG_BUF_TOO_SMALL -2
  1930. #define SAFE_SNPRINTF() \
  1931. { \
  1932. if( ret == -1 ) \
  1933. return( -1 ); \
  1934. \
  1935. if ( (unsigned int) ret > n ) { \
  1936. p[n - 1] = '\0'; \
  1937. return POLARSSL_ERR_DEBUG_BUF_TOO_SMALL;\
  1938. } \
  1939. \
  1940. n -= (unsigned int) ret; \
  1941. p += (unsigned int) ret; \
  1942. }
  1943. /*
  1944. * Store the name in printable form into buf; no more
  1945. * than size characters will be written
  1946. */
  1947. int x509parse_dn_gets( char *buf, size_t size, const x509_name *dn )
  1948. {
  1949. int ret;
  1950. size_t i, n;
  1951. unsigned char c;
  1952. const x509_name *name;
  1953. char s[128], *p;
  1954. memset( s, 0, sizeof( s ) );
  1955. name = dn;
  1956. p = buf;
  1957. n = size;
  1958. while( name != NULL )
  1959. {
  1960. if( name != dn )
  1961. {
  1962. ret = snprintf( p, n, ", " );
  1963. SAFE_SNPRINTF();
  1964. }
  1965. if( memcmp( name->oid.p, OID_X520, 2 ) == 0 )
  1966. {
  1967. switch( name->oid.p[2] )
  1968. {
  1969. case X520_COMMON_NAME:
  1970. ret = snprintf( p, n, "CN=" ); break;
  1971. case X520_COUNTRY:
  1972. ret = snprintf( p, n, "C=" ); break;
  1973. case X520_LOCALITY:
  1974. ret = snprintf( p, n, "L=" ); break;
  1975. case X520_STATE:
  1976. ret = snprintf( p, n, "ST=" ); break;
  1977. case X520_ORGANIZATION:
  1978. ret = snprintf( p, n, "O=" ); break;
  1979. case X520_ORG_UNIT:
  1980. ret = snprintf( p, n, "OU=" ); break;
  1981. default:
  1982. ret = snprintf( p, n, "0x%02X=",
  1983. name->oid.p[2] );
  1984. break;
  1985. }
  1986. SAFE_SNPRINTF();
  1987. }
  1988. else if( memcmp( name->oid.p, OID_PKCS9, 8 ) == 0 )
  1989. {
  1990. switch( name->oid.p[8] )
  1991. {
  1992. case PKCS9_EMAIL:
  1993. ret = snprintf( p, n, "emailAddress=" ); break;
  1994. default:
  1995. ret = snprintf( p, n, "0x%02X=",
  1996. name->oid.p[8] );
  1997. break;
  1998. }
  1999. SAFE_SNPRINTF();
  2000. }
  2001. else
  2002. {
  2003. ret = snprintf( p, n, "\?\?=" );
  2004. SAFE_SNPRINTF();
  2005. }
  2006. for( i = 0; i < name->val.len; i++ )
  2007. {
  2008. if( i >= sizeof( s ) - 1 )
  2009. break;
  2010. c = name->val.p[i];
  2011. if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )
  2012. s[i] = '?';
  2013. else s[i] = c;
  2014. }
  2015. s[i] = '\0';
  2016. ret = snprintf( p, n, "%s", s );
  2017. SAFE_SNPRINTF();
  2018. name = name->next;
  2019. }
  2020. return( (int) ( size - n ) );
  2021. }
  2022. /*
  2023. * Store the serial in printable form into buf; no more
  2024. * than size characters will be written
  2025. */
  2026. int x509parse_serial_gets( char *buf, size_t size, const x509_buf *serial )
  2027. {
  2028. int ret;
  2029. size_t i, n, nr;
  2030. char *p;
  2031. p = buf;
  2032. n = size;
  2033. nr = ( serial->len <= 32 )
  2034. ? serial->len : 32;
  2035. for( i = 0; i < nr; i++ )
  2036. {
  2037. ret = snprintf( p, n, "%02X%s",
  2038. serial->p[i], ( i < nr - 1 ) ? ":" : "" );
  2039. SAFE_SNPRINTF();
  2040. }
  2041. return( (int) ( size - n ) );
  2042. }
  2043. /*
  2044. * Return an informational string about the certificate.
  2045. */
  2046. int x509parse_cert_info( char *buf, size_t size, const char *prefix,
  2047. const x509_cert *crt )
  2048. {
  2049. int ret;
  2050. size_t n;
  2051. char *p;
  2052. p = buf;
  2053. n = size;
  2054. ret = snprintf( p, n, "%scert. version : %d\n",
  2055. prefix, crt->version );
  2056. SAFE_SNPRINTF();
  2057. ret = snprintf( p, n, "%sserial number : ",
  2058. prefix );
  2059. SAFE_SNPRINTF();
  2060. ret = x509parse_serial_gets( p, n, &crt->serial);
  2061. SAFE_SNPRINTF();
  2062. ret = snprintf( p, n, "\n%sissuer name : ", prefix );
  2063. SAFE_SNPRINTF();
  2064. ret = x509parse_dn_gets( p, n, &crt->issuer );
  2065. SAFE_SNPRINTF();
  2066. ret = snprintf( p, n, "\n%ssubject name : ", prefix );
  2067. SAFE_SNPRINTF();
  2068. ret = x509parse_dn_gets( p, n, &crt->subject );
  2069. SAFE_SNPRINTF();
  2070. ret = snprintf( p, n, "\n%sissued on : " \
  2071. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  2072. crt->valid_from.year, crt->valid_from.mon,
  2073. crt->valid_from.day, crt->valid_from.hour,
  2074. crt->valid_from.min, crt->valid_from.sec );
  2075. SAFE_SNPRINTF();
  2076. ret = snprintf( p, n, "\n%sexpires on : " \
  2077. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  2078. crt->valid_to.year, crt->valid_to.mon,
  2079. crt->valid_to.day, crt->valid_to.hour,
  2080. crt->valid_to.min, crt->valid_to.sec );
  2081. SAFE_SNPRINTF();
  2082. ret = snprintf( p, n, "\n%ssigned using : RSA+", prefix );
  2083. SAFE_SNPRINTF();
  2084. switch( crt->sig_alg )
  2085. {
  2086. case SIG_RSA_MD2 : ret = snprintf( p, n, "MD2" ); break;
  2087. case SIG_RSA_MD4 : ret = snprintf( p, n, "MD4" ); break;
  2088. case SIG_RSA_MD5 : ret = snprintf( p, n, "MD5" ); break;
  2089. case SIG_RSA_SHA1 : ret = snprintf( p, n, "SHA1" ); break;
  2090. case SIG_RSA_SHA224 : ret = snprintf( p, n, "SHA224" ); break;
  2091. case SIG_RSA_SHA256 : ret = snprintf( p, n, "SHA256" ); break;
  2092. case SIG_RSA_SHA384 : ret = snprintf( p, n, "SHA384" ); break;
  2093. case SIG_RSA_SHA512 : ret = snprintf( p, n, "SHA512" ); break;
  2094. default: ret = snprintf( p, n, "???" ); break;
  2095. }
  2096. SAFE_SNPRINTF();
  2097. ret = snprintf( p, n, "\n%sRSA key size : %d bits\n", prefix,
  2098. (int) crt->rsa.N.n * (int) sizeof( unsigned long ) * 8 );
  2099. SAFE_SNPRINTF();
  2100. return( (int) ( size - n ) );
  2101. }
  2102. /* Compare a given OID string with an OID x509_buf * */
  2103. #define OID_CMP(oid_str, oid_buf) \
  2104. ( ( OID_SIZE(oid_str) == (oid_buf)->len ) && \
  2105. memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) == 0)
  2106. /*
  2107. * Return an informational string describing the given OID
  2108. */
  2109. const char *x509_oid_get_description( x509_buf *oid )
  2110. {
  2111. if ( oid == NULL )
  2112. return ( NULL );
  2113. else if( OID_CMP( OID_SERVER_AUTH, oid ) )
  2114. return( STRING_SERVER_AUTH );
  2115. else if( OID_CMP( OID_CLIENT_AUTH, oid ) )
  2116. return( STRING_CLIENT_AUTH );
  2117. else if( OID_CMP( OID_CODE_SIGNING, oid ) )
  2118. return( STRING_CODE_SIGNING );
  2119. else if( OID_CMP( OID_EMAIL_PROTECTION, oid ) )
  2120. return( STRING_EMAIL_PROTECTION );
  2121. else if( OID_CMP( OID_TIME_STAMPING, oid ) )
  2122. return( STRING_TIME_STAMPING );
  2123. else if( OID_CMP( OID_OCSP_SIGNING, oid ) )
  2124. return( STRING_OCSP_SIGNING );
  2125. return( NULL );
  2126. }
  2127. /* Return the x.y.z.... style numeric string for the given OID */
  2128. int x509_oid_get_numeric_string( char *buf, size_t size, x509_buf *oid )
  2129. {
  2130. int ret;
  2131. size_t i, n;
  2132. unsigned int value;
  2133. char *p;
  2134. p = buf;
  2135. n = size;
  2136. /* First byte contains first two dots */
  2137. if( oid->len > 0 )
  2138. {
  2139. ret = snprintf( p, n, "%d.%d", oid->p[0]/40, oid->p[0]%40 );
  2140. SAFE_SNPRINTF();
  2141. }
  2142. /* TODO: value can overflow in value. */
  2143. value = 0;
  2144. for( i = 1; i < oid->len; i++ )
  2145. {
  2146. value <<= 7;
  2147. value += oid->p[i] & 0x7F;
  2148. if( !( oid->p[i] & 0x80 ) )
  2149. {
  2150. /* Last byte */
  2151. ret = snprintf( p, n, ".%d", value );
  2152. SAFE_SNPRINTF();
  2153. value = 0;
  2154. }
  2155. }
  2156. return( (int) ( size - n ) );
  2157. }
  2158. /*
  2159. * Return an informational string about the CRL.
  2160. */
  2161. int x509parse_crl_info( char *buf, size_t size, const char *prefix,
  2162. const x509_crl *crl )
  2163. {
  2164. int ret;
  2165. size_t i, n, nr;
  2166. char *p;
  2167. const x509_crl_entry *entry;
  2168. p = buf;
  2169. n = size;
  2170. ret = snprintf( p, n, "%sCRL version : %d",
  2171. prefix, crl->version );
  2172. SAFE_SNPRINTF();
  2173. ret = snprintf( p, n, "\n%sissuer name : ", prefix );
  2174. SAFE_SNPRINTF();
  2175. ret = x509parse_dn_gets( p, n, &crl->issuer );
  2176. SAFE_SNPRINTF();
  2177. ret = snprintf( p, n, "\n%sthis update : " \
  2178. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  2179. crl->this_update.year, crl->this_update.mon,
  2180. crl->this_update.day, crl->this_update.hour,
  2181. crl->this_update.min, crl->this_update.sec );
  2182. SAFE_SNPRINTF();
  2183. ret = snprintf( p, n, "\n%snext update : " \
  2184. "%04d-%02d-%02d %02d:%02d:%02d", prefix,
  2185. crl->next_update.year, crl->next_update.mon,
  2186. crl->next_update.day, crl->next_update.hour,
  2187. crl->next_update.min, crl->next_update.sec );
  2188. SAFE_SNPRINTF();
  2189. entry = &crl->entry;
  2190. ret = snprintf( p, n, "\n%sRevoked certificates:",
  2191. prefix );
  2192. SAFE_SNPRINTF();
  2193. while( entry != NULL && entry->raw.len != 0 )
  2194. {
  2195. ret = snprintf( p, n, "\n%sserial number: ",
  2196. prefix );
  2197. SAFE_SNPRINTF();
  2198. nr = ( entry->serial.len <= 32 )
  2199. ? entry->serial.len : 32;
  2200. for( i = 0; i < nr; i++ )
  2201. {
  2202. ret = snprintf( p, n, "%02X%s",
  2203. entry->serial.p[i], ( i < nr - 1 ) ? ":" : "" );
  2204. SAFE_SNPRINTF();
  2205. }
  2206. ret = snprintf( p, n, " revocation date: " \
  2207. "%04d-%02d-%02d %02d:%02d:%02d",
  2208. entry->revocation_date.year, entry->revocation_date.mon,
  2209. entry->revocation_date.day, entry->revocation_date.hour,
  2210. entry->revocation_date.min, entry->revocation_date.sec );
  2211. SAFE_SNPRINTF();
  2212. entry = entry->next;
  2213. }
  2214. ret = snprintf( p, n, "\n%ssigned using : RSA+", prefix );
  2215. SAFE_SNPRINTF();
  2216. switch( crl->sig_alg )
  2217. {
  2218. case SIG_RSA_MD2 : ret = snprintf( p, n, "MD2" ); break;
  2219. case SIG_RSA_MD4 : ret = snprintf( p, n, "MD4" ); break;
  2220. case SIG_RSA_MD5 : ret = snprintf( p, n, "MD5" ); break;
  2221. case SIG_RSA_SHA1 : ret = snprintf( p, n, "SHA1" ); break;
  2222. case SIG_RSA_SHA224 : ret = snprintf( p, n, "SHA224" ); break;
  2223. case SIG_RSA_SHA256 : ret = snprintf( p, n, "SHA256" ); break;
  2224. case SIG_RSA_SHA384 : ret = snprintf( p, n, "SHA384" ); break;
  2225. case SIG_RSA_SHA512 : ret = snprintf( p, n, "SHA512" ); break;
  2226. default: ret = snprintf( p, n, "???" ); break;
  2227. }
  2228. SAFE_SNPRINTF();
  2229. ret = snprintf( p, n, "\n" );
  2230. SAFE_SNPRINTF();
  2231. return( (int) ( size - n ) );
  2232. }
  2233. /*
  2234. * Return 0 if the x509_time is still valid, or 1 otherwise.
  2235. */
  2236. int x509parse_time_expired( const x509_time *to )
  2237. {
  2238. struct tm *lt;
  2239. time_t tt;
  2240. tt = time( NULL );
  2241. lt = localtime( &tt );
  2242. if( lt->tm_year > to->year - 1900 )
  2243. return( 1 );
  2244. if( lt->tm_year == to->year - 1900 &&
  2245. lt->tm_mon > to->mon - 1 )
  2246. return( 1 );
  2247. if( lt->tm_year == to->year - 1900 &&
  2248. lt->tm_mon == to->mon - 1 &&
  2249. lt->tm_mday > to->day )
  2250. return( 1 );
  2251. if( lt->tm_year == to->year - 1900 &&
  2252. lt->tm_mon == to->mon - 1 &&
  2253. lt->tm_mday == to->day &&
  2254. lt->tm_hour > to->hour - 1)
  2255. return( 1 );
  2256. if( lt->tm_year == to->year - 1900 &&
  2257. lt->tm_mon == to->mon - 1 &&
  2258. lt->tm_mday == to->day &&
  2259. lt->tm_hour == to->hour - 1 &&
  2260. lt->tm_min > to->min - 1 )
  2261. return( 1 );
  2262. if( lt->tm_year == to->year - 1900 &&
  2263. lt->tm_mon == to->mon - 1 &&
  2264. lt->tm_mday == to->day &&
  2265. lt->tm_hour == to->hour - 1 &&
  2266. lt->tm_min == to->min - 1 &&
  2267. lt->tm_sec > to->sec - 1 )
  2268. return( 1 );
  2269. return( 0 );
  2270. }
  2271. /*
  2272. * Return 1 if the certificate is revoked, or 0 otherwise.
  2273. */
  2274. int x509parse_revoked( const x509_cert *crt, const x509_crl *crl )
  2275. {
  2276. const x509_crl_entry *cur = &crl->entry;
  2277. while( cur != NULL && cur->serial.len != 0 )
  2278. {
  2279. if( crt->serial.len == cur->serial.len &&
  2280. memcmp( crt->serial.p, cur->serial.p, crt->serial.len ) == 0 )
  2281. {
  2282. if( x509parse_time_expired( &cur->revocation_date ) )
  2283. return( 1 );
  2284. }
  2285. cur = cur->next;
  2286. }
  2287. return( 0 );
  2288. }
  2289. /*
  2290. * Wrapper for x509 hashes.
  2291. *
  2292. * \param out Buffer to receive the hash (Should be at least 64 bytes)
  2293. */
  2294. static void x509_hash( const unsigned char *in, size_t len, int alg,
  2295. unsigned char *out )
  2296. {
  2297. switch( alg )
  2298. {
  2299. #if defined(POLARSSL_MD2_C)
  2300. case SIG_RSA_MD2 : md2( in, len, out ); break;
  2301. #endif
  2302. #if defined(POLARSSL_MD4_C)
  2303. case SIG_RSA_MD4 : md4( in, len, out ); break;
  2304. #endif
  2305. #if defined(POLARSSL_MD5_C)
  2306. case SIG_RSA_MD5 : md5( in, len, out ); break;
  2307. #endif
  2308. #if defined(POLARSSL_SHA1_C)
  2309. case SIG_RSA_SHA1 : sha1( in, len, out ); break;
  2310. #endif
  2311. #if defined(POLARSSL_SHA2_C)
  2312. case SIG_RSA_SHA224 : sha2( in, len, out, 1 ); break;
  2313. case SIG_RSA_SHA256 : sha2( in, len, out, 0 ); break;
  2314. #endif
  2315. #if defined(POLARSSL_SHA4_C)
  2316. case SIG_RSA_SHA384 : sha4( in, len, out, 1 ); break;
  2317. case SIG_RSA_SHA512 : sha4( in, len, out, 0 ); break;
  2318. #endif
  2319. default:
  2320. memset( out, '\xFF', 64 );
  2321. break;
  2322. }
  2323. }
  2324. /*
  2325. * Check that the given certificate is valid accoring to the CRL.
  2326. */
  2327. static int x509parse_verifycrl(x509_cert *crt, x509_cert *ca,
  2328. x509_crl *crl_list)
  2329. {
  2330. int flags = 0;
  2331. int hash_id;
  2332. unsigned char hash[64];
  2333. /*
  2334. * TODO: What happens if no CRL is present?
  2335. * Suggestion: Revocation state should be unknown if no CRL is present.
  2336. * For backwards compatibility this is not yet implemented.
  2337. */
  2338. while( ca != NULL && crl_list != NULL && crl_list->version != 0 )
  2339. {
  2340. if( crl_list->issuer_raw.len != ca->subject_raw.len ||
  2341. memcmp( crl_list->issuer_raw.p, ca->subject_raw.p,
  2342. crl_list->issuer_raw.len ) != 0 )
  2343. {
  2344. crl_list = crl_list->next;
  2345. continue;
  2346. }
  2347. /*
  2348. * Check if CRL is correctly signed by the trusted CA
  2349. */
  2350. hash_id = crl_list->sig_alg;
  2351. x509_hash( crl_list->tbs.p, crl_list->tbs.len, hash_id, hash );
  2352. if( !rsa_pkcs1_verify( &ca->rsa, RSA_PUBLIC, hash_id,
  2353. 0, hash, crl_list->sig.p ) == 0 )
  2354. {
  2355. /*
  2356. * CRL is not trusted
  2357. */
  2358. flags |= BADCRL_NOT_TRUSTED;
  2359. break;
  2360. }
  2361. /*
  2362. * Check for validity of CRL (Do not drop out)
  2363. */
  2364. if( x509parse_time_expired( &crl_list->next_update ) )
  2365. flags |= BADCRL_EXPIRED;
  2366. /*
  2367. * Check if certificate is revoked
  2368. */
  2369. if( x509parse_revoked(crt, crl_list) )
  2370. {
  2371. flags |= BADCERT_REVOKED;
  2372. break;
  2373. }
  2374. crl_list = crl_list->next;
  2375. }
  2376. return flags;
  2377. }
  2378. /*
  2379. * Verify the certificate validity
  2380. */
  2381. int x509parse_verify( x509_cert *crt,
  2382. x509_cert *trust_ca,
  2383. x509_crl *ca_crl,
  2384. const char *cn, int *flags,
  2385. int (*f_vrfy)(void *, x509_cert *, int, int),
  2386. void *p_vrfy )
  2387. {
  2388. size_t cn_len;
  2389. int hash_id;
  2390. int pathlen;
  2391. x509_cert *parent;
  2392. x509_name *name;
  2393. unsigned char hash[64];
  2394. *flags = 0;
  2395. if( x509parse_time_expired( &crt->valid_to ) )
  2396. *flags = BADCERT_EXPIRED;
  2397. if( cn != NULL )
  2398. {
  2399. name = &crt->subject;
  2400. cn_len = strlen( cn );
  2401. while( name != NULL )
  2402. {
  2403. if( memcmp( name->oid.p, OID_CN, 3 ) == 0 &&
  2404. memcmp( name->val.p, cn, cn_len ) == 0 &&
  2405. name->val.len == cn_len )
  2406. break;
  2407. name = name->next;
  2408. }
  2409. if( name == NULL )
  2410. *flags |= BADCERT_CN_MISMATCH;
  2411. }
  2412. /*
  2413. * Iterate upwards in the given cert chain,
  2414. * ignoring any upper cert with CA != TRUE.
  2415. */
  2416. parent = crt->next;
  2417. pathlen = 1;
  2418. while( parent != NULL && parent->version != 0 )
  2419. {
  2420. if( parent->ca_istrue == 0 ||
  2421. crt->issuer_raw.len != parent->subject_raw.len ||
  2422. memcmp( crt->issuer_raw.p, parent->subject_raw.p,
  2423. crt->issuer_raw.len ) != 0 )
  2424. {
  2425. parent = parent->next;
  2426. continue;
  2427. }
  2428. hash_id = crt->sig_alg;
  2429. x509_hash( crt->tbs.p, crt->tbs.len, hash_id, hash );
  2430. if( rsa_pkcs1_verify( &parent->rsa, RSA_PUBLIC, hash_id, 0, hash,
  2431. crt->sig.p ) != 0 )
  2432. *flags |= BADCERT_NOT_TRUSTED;
  2433. /* Check trusted CA's CRL for the given crt */
  2434. *flags |= x509parse_verifycrl(crt, parent, ca_crl);
  2435. /* crt is verified to be a child of the parent cur, call verify callback */
  2436. if( NULL != f_vrfy )
  2437. {
  2438. if( f_vrfy( p_vrfy, crt, pathlen - 1, ( *flags == 0 ) ) != 0 )
  2439. return( POLARSSL_ERR_X509_CERT_VERIFY_FAILED );
  2440. else
  2441. *flags = 0;
  2442. }
  2443. else if( *flags != 0 )
  2444. return( POLARSSL_ERR_X509_CERT_VERIFY_FAILED );
  2445. pathlen++;
  2446. crt = parent;
  2447. parent = crt->next;
  2448. }
  2449. /*
  2450. * Attempt to validate topmost cert with our CA chain.
  2451. */
  2452. *flags |= BADCERT_NOT_TRUSTED;
  2453. while( trust_ca != NULL && trust_ca->version != 0 )
  2454. {
  2455. if( crt->issuer_raw.len != trust_ca->subject_raw.len ||
  2456. memcmp( crt->issuer_raw.p, trust_ca->subject_raw.p,
  2457. crt->issuer_raw.len ) != 0 )
  2458. {
  2459. trust_ca = trust_ca->next;
  2460. continue;
  2461. }
  2462. if( trust_ca->max_pathlen > 0 &&
  2463. trust_ca->max_pathlen < pathlen )
  2464. break;
  2465. hash_id = crt->sig_alg;
  2466. x509_hash( crt->tbs.p, crt->tbs.len, hash_id, hash );
  2467. if( rsa_pkcs1_verify( &trust_ca->rsa, RSA_PUBLIC, hash_id,
  2468. 0, hash, crt->sig.p ) == 0 )
  2469. {
  2470. /*
  2471. * cert. is signed by a trusted CA
  2472. */
  2473. *flags &= ~BADCERT_NOT_TRUSTED;
  2474. break;
  2475. }
  2476. trust_ca = trust_ca->next;
  2477. }
  2478. /* Check trusted CA's CRL for the given crt */
  2479. *flags |= x509parse_verifycrl( crt, trust_ca, ca_crl );
  2480. /* Verification succeeded, call callback on top cert */
  2481. if( NULL != f_vrfy )
  2482. {
  2483. if( f_vrfy(p_vrfy, crt, pathlen-1, ( *flags == 0 ) ) != 0 )
  2484. return( POLARSSL_ERR_X509_CERT_VERIFY_FAILED );
  2485. else
  2486. *flags = 0;
  2487. }
  2488. else if( *flags != 0 )
  2489. return( POLARSSL_ERR_X509_CERT_VERIFY_FAILED );
  2490. return( 0 );
  2491. }
  2492. /*
  2493. * Unallocate all certificate data
  2494. */
  2495. void x509_free( x509_cert *crt )
  2496. {
  2497. x509_cert *cert_cur = crt;
  2498. x509_cert *cert_prv;
  2499. x509_name *name_cur;
  2500. x509_name *name_prv;
  2501. x509_sequence *seq_cur;
  2502. x509_sequence *seq_prv;
  2503. if( crt == NULL )
  2504. return;
  2505. do
  2506. {
  2507. rsa_free( &cert_cur->rsa );
  2508. name_cur = cert_cur->issuer.next;
  2509. while( name_cur != NULL )
  2510. {
  2511. name_prv = name_cur;
  2512. name_cur = name_cur->next;
  2513. memset( name_prv, 0, sizeof( x509_name ) );
  2514. free( name_prv );
  2515. }
  2516. name_cur = cert_cur->subject.next;
  2517. while( name_cur != NULL )
  2518. {
  2519. name_prv = name_cur;
  2520. name_cur = name_cur->next;
  2521. memset( name_prv, 0, sizeof( x509_name ) );
  2522. free( name_prv );
  2523. }
  2524. seq_cur = cert_cur->ext_key_usage.next;
  2525. while( seq_cur != NULL )
  2526. {
  2527. seq_prv = seq_cur;
  2528. seq_cur = seq_cur->next;
  2529. memset( seq_prv, 0, sizeof( x509_sequence ) );
  2530. free( seq_prv );
  2531. }
  2532. if( cert_cur->raw.p != NULL )
  2533. {
  2534. memset( cert_cur->raw.p, 0, cert_cur->raw.len );
  2535. free( cert_cur->raw.p );
  2536. }
  2537. cert_cur = cert_cur->next;
  2538. }
  2539. while( cert_cur != NULL );
  2540. cert_cur = crt;
  2541. do
  2542. {
  2543. cert_prv = cert_cur;
  2544. cert_cur = cert_cur->next;
  2545. memset( cert_prv, 0, sizeof( x509_cert ) );
  2546. if( cert_prv != crt )
  2547. free( cert_prv );
  2548. }
  2549. while( cert_cur != NULL );
  2550. }
  2551. /*
  2552. * Unallocate all CRL data
  2553. */
  2554. void x509_crl_free( x509_crl *crl )
  2555. {
  2556. x509_crl *crl_cur = crl;
  2557. x509_crl *crl_prv;
  2558. x509_name *name_cur;
  2559. x509_name *name_prv;
  2560. x509_crl_entry *entry_cur;
  2561. x509_crl_entry *entry_prv;
  2562. if( crl == NULL )
  2563. return;
  2564. do
  2565. {
  2566. name_cur = crl_cur->issuer.next;
  2567. while( name_cur != NULL )
  2568. {
  2569. name_prv = name_cur;
  2570. name_cur = name_cur->next;
  2571. memset( name_prv, 0, sizeof( x509_name ) );
  2572. free( name_prv );
  2573. }
  2574. entry_cur = crl_cur->entry.next;
  2575. while( entry_cur != NULL )
  2576. {
  2577. entry_prv = entry_cur;
  2578. entry_cur = entry_cur->next;
  2579. memset( entry_prv, 0, sizeof( x509_crl_entry ) );
  2580. free( entry_prv );
  2581. }
  2582. if( crl_cur->raw.p != NULL )
  2583. {
  2584. memset( crl_cur->raw.p, 0, crl_cur->raw.len );
  2585. free( crl_cur->raw.p );
  2586. }
  2587. crl_cur = crl_cur->next;
  2588. }
  2589. while( crl_cur != NULL );
  2590. crl_cur = crl;
  2591. do
  2592. {
  2593. crl_prv = crl_cur;
  2594. crl_cur = crl_cur->next;
  2595. memset( crl_prv, 0, sizeof( x509_crl ) );
  2596. if( crl_prv != crl )
  2597. free( crl_prv );
  2598. }
  2599. while( crl_cur != NULL );
  2600. }
  2601. #if defined(POLARSSL_SELF_TEST)
  2602. #include "polarssl/certs.h"
  2603. /*
  2604. * Checkup routine
  2605. */
  2606. int x509_self_test( int verbose )
  2607. {
  2608. #if defined(POLARSSL_CERTS_C) && defined(POLARSSL_MD5_C)
  2609. int ret;
  2610. int flags;
  2611. size_t i, j;
  2612. x509_cert cacert;
  2613. x509_cert clicert;
  2614. rsa_context rsa;
  2615. #if defined(POLARSSL_DHM_C)
  2616. dhm_context dhm;
  2617. #endif
  2618. if( verbose != 0 )
  2619. printf( " X.509 certificate load: " );
  2620. memset( &clicert, 0, sizeof( x509_cert ) );
  2621. ret = x509parse_crt( &clicert, (unsigned char *) test_cli_crt,
  2622. strlen( test_cli_crt ) );
  2623. if( ret != 0 )
  2624. {
  2625. if( verbose != 0 )
  2626. printf( "failed\n" );
  2627. return( ret );
  2628. }
  2629. memset( &cacert, 0, sizeof( x509_cert ) );
  2630. ret = x509parse_crt( &cacert, (unsigned char *) test_ca_crt,
  2631. strlen( test_ca_crt ) );
  2632. if( ret != 0 )
  2633. {
  2634. if( verbose != 0 )
  2635. printf( "failed\n" );
  2636. return( ret );
  2637. }
  2638. if( verbose != 0 )
  2639. printf( "passed\n X.509 private key load: " );
  2640. i = strlen( test_ca_key );
  2641. j = strlen( test_ca_pwd );
  2642. rsa_init( &rsa, RSA_PKCS_V15, 0 );
  2643. if( ( ret = x509parse_key( &rsa,
  2644. (unsigned char *) test_ca_key, i,
  2645. (unsigned char *) test_ca_pwd, j ) ) != 0 )
  2646. {
  2647. if( verbose != 0 )
  2648. printf( "failed\n" );
  2649. return( ret );
  2650. }
  2651. if( verbose != 0 )
  2652. printf( "passed\n X.509 signature verify: ");
  2653. ret = x509parse_verify( &clicert, &cacert, NULL, "PolarSSL Client 2", &flags, NULL, NULL );
  2654. if( ret != 0 )
  2655. {
  2656. printf("%02x", flags);
  2657. if( verbose != 0 )
  2658. printf( "failed\n" );
  2659. return( ret );
  2660. }
  2661. #if defined(POLARSSL_DHM_C)
  2662. if( verbose != 0 )
  2663. printf( "passed\n X.509 DHM parameter load: " );
  2664. i = strlen( test_dhm_params );
  2665. j = strlen( test_ca_pwd );
  2666. if( ( ret = x509parse_dhm( &dhm, (unsigned char *) test_dhm_params, i ) ) != 0 )
  2667. {
  2668. if( verbose != 0 )
  2669. printf( "failed\n" );
  2670. return( ret );
  2671. }
  2672. if( verbose != 0 )
  2673. printf( "passed\n\n" );
  2674. #endif
  2675. x509_free( &cacert );
  2676. x509_free( &clicert );
  2677. rsa_free( &rsa );
  2678. #if defined(POLARSSL_DHM_C)
  2679. dhm_free( &dhm );
  2680. #endif
  2681. return( 0 );
  2682. #else
  2683. ((void) verbose);
  2684. return( POLARSSL_ERR_X509_FEATURE_UNAVAILABLE );
  2685. #endif
  2686. }
  2687. #endif
  2688. #endif