2
0

der_test.c 73 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030
  1. /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
  2. /* SPDX-License-Identifier: Unlicense */
  3. #include <tomcrypt_test.h>
  4. #if !defined(LTC_DER)
  5. int der_test(void)
  6. {
  7. return CRYPT_NOP;
  8. }
  9. #else
  10. #include <wchar.h>
  11. #if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 2
  12. #define LTC_DER_TESTS_PRINT_FLEXI
  13. #endif
  14. static const char s_der_tests_stinky_root_cert[] =
  15. "MIIFETCCA/mgAwIBAgIQbv53JNmv518t5lkCHE272jANBgkqhkiG9w0BAQUFADCB"
  16. "lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug"
  17. "Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho"
  18. "dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt"
  19. "T2JqZWN0MB4XDTA4MDQyOTAwMDAwMFoXDTEwMDQyOTIzNTk1OVowgbUxCzAJBgNV"
  20. "BAYTAlVTMQ4wDAYDVQQRDAU0NDE0MzELMAkGA1UECAwCT0gxGTAXBgNVBAcMEE1h"
  21. "eWZpZWxkIFZpbGxhZ2UxEDAOBgNVBAkMB1N1aXRlIEExFDASBgNVBAkMCzc2NyBC"
  22. "ZXRhIERyMSIwIAYDVQQKDBlQcmVlbXB0aXZlIFNvbHV0aW9ucywgTExDMSIwIAYD"
  23. "VQQDDBlQcmVlbXB0aXZlIFNvbHV0aW9ucywgTExDMIIBIjANBgkqhkiG9w0BAQEF"
  24. "AAOCAQ8AMIIBCgKCAQEAzH7ZBkMcBuHx8d2f10RGTHAf7gzzVteGbOihJGH2BwlS"
  25. "ZvNp6WEE4DfL+s1vp0wzk1XeLN5tRjg2qum9YqyCk7okh7pXGy46f5mWbLQiefGA"
  26. "j5UXRcr6WJ3xeACdbXxKrYMV0REia+4Jb2UbFA8S81PjhRon6vcRz76ziUWwt8NC"
  27. "igX+4ZC0skhhKzKszel6KGL7bJCtLG7ukw9DZCrvPCRcKFeM/GwQ6ACMgP88CSCL"
  28. "t1fbIXDH1vd/x2XM3QlaSDN6hYDbef8m1T+9TCkXVKeqG1GYjSUrHzYnCZUmTRrR"
  29. "38jgC3qXxiIpDKW105uM0nlXe2XF9c+ot2MdWvV4TwIDAQABo4IBOTCCATUwHwYD"
  30. "VR0jBBgwFoAU2u1kdBScFDyr3ZmpvVsoTYs8ydgwHQYDVR0OBBYEFK+1HzZE4i28"
  31. "oLIzuqlFR9SspiCIMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBMGA1Ud"
  32. "JQQMMAoGCCsGAQUFBwMDMBEGCWCGSAGG+EIBAQQEAwIEEDBGBgNVHSAEPzA9MDsG"
  33. "DCsGAQQBsjEBAgEDAjArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21v"
  34. "ZG8ubmV0L0NQUzBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY3JsLnVzZXJ0cnVz"
  35. "dC5jb20vVVROLVVTRVJGaXJzdC1PYmplY3QuY3JsMCEGA1UdEQQaMBiBFnN1cHBv"
  36. "cnRAcHJlZW1wdGl2ZS5jb20wDQYJKoZIhvcNAQEFBQADggEBAC+JM26Dokvonudl"
  37. "JXe/Yun7IBhimkagZUjbk9l/GQWN6i+v1o95UJ1wGJtBdm2+MxbSaPoNTDZR4B+2"
  38. "lYL9MW57UVmePrnfUPXQKZZG+8gTRDz8+7ol/CEAKmS3MLKCRcH5oe+J5345sGxi"
  39. "FC/KWNKedTNraW95xlg8NTlL2yRP7TMsjvBxgLmkbaFUoXzPTbQWmtovIagIT8GC"
  40. "JeXwdFaRjbamiz3Irl+u7x/mhxdza6RvgBYylXRFMudANpeGsV7gDXlnfzpFDKHQ"
  41. "niVwB7P5sbPFIlmIc+4/xRItkLIRjCVXaepgN9KYu3VOgiSDI6wXiTwP44/LUXQM"
  42. "hetwa7s=";
  43. const char ltc_der_tests_cacert_root_cert[] =
  44. "MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290"
  45. "IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB"
  46. "IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA"
  47. "Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO"
  48. "BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi"
  49. "MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ"
  50. "ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC"
  51. "CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ"
  52. "8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6"
  53. "zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y"
  54. "fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7"
  55. "w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc"
  56. "G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k"
  57. "epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q"
  58. "laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ"
  59. "QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU"
  60. "fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826"
  61. "YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w"
  62. "ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY"
  63. "gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe"
  64. "MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0"
  65. "IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy"
  66. "dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw"
  67. "czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0"
  68. "dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl"
  69. "aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC"
  70. "AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg"
  71. "b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB"
  72. "ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc"
  73. "nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg"
  74. "18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c"
  75. "gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl"
  76. "Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY"
  77. "sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T"
  78. "SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF"
  79. "CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum"
  80. "GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk"
  81. "zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW"
  82. "omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD";
  83. const unsigned long ltc_der_tests_cacert_root_cert_size = sizeof(ltc_der_tests_cacert_root_cert);
  84. /*
  85. SEQUENCE(3 elem)
  86. SEQUENCE(8 elem)
  87. [0](1)
  88. INTEGER 2
  89. INTEGER 0
  90. SEQUENCE(2 elem)
  91. OBJECT IDENTIFIER 1.2.840.113549.1.1.4
  92. NULL
  93. SEQUENCE(4 elem)
  94. SET(1 elem)
  95. SEQUENCE(2 elem)
  96. OBJECT IDENTIFIER 2.5.4.10
  97. PrintableString Root CA
  98. SET(1 elem)
  99. SEQUENCE(2 elem)
  100. OBJECT IDENTIFIER 2.5.4.11
  101. PrintableString http://www.cacert.org
  102. SET(1 elem)
  103. SEQUENCE(2 elem)
  104. OBJECT IDENTIFIER 2.5.4.3
  105. PrintableString CA Cert Signing Authority
  106. SET(1 elem)
  107. SEQUENCE(2 elem)
  108. OBJECT IDENTIFIER 1.2.840.113549.1.9.1
  109. IA5String [email protected]
  110. SEQUENCE(2 elem)
  111. UTCTime03-03-30 12:29:49 UTC
  112. UTCTime33-03-29 12:29:49 UTC
  113. SEQUENCE(4 elem)
  114. SET(1 elem)
  115. SEQUENCE(2 elem)
  116. OBJECT IDENTIFIER 2.5.4.10
  117. PrintableString Root CA
  118. SET(1 elem)
  119. SEQUENCE(2 elem)
  120. OBJECT IDENTIFIER 2.5.4.11
  121. PrintableString http://www.cacert.org
  122. SET(1 elem)
  123. SEQUENCE(2 elem)
  124. OBJECT IDENTIFIER 2.5.4.3
  125. PrintableString CA Cert Signing Authority
  126. SET(1 elem)
  127. SEQUENCE(2 elem)
  128. OBJECT IDENTIFIER 1.2.840.113549.1.9.1
  129. IA5String [email protected]
  130. SEQUENCE(2 elem)
  131. SEQUENCE(2 elem)
  132. OBJECT IDENTIFIER 1.2.840.113549.1.1.1
  133. NULL
  134. BIT STRING(1 elem)
  135. SEQUENCE(2 elem)
  136. INTEGER (4096 bit)
  137. INTEGER 65537
  138. [3](1)
  139. SEQUENCE(7 elem)
  140. SEQUENCE(2 elem)
  141. OBJECT IDENTIFIER 2.5.29.14
  142. OCTET STRING(1 elem)
  143. OCTET STRING(20 byte) 16B5321BD4C7F3E0E68EF3BDD2B03AEEB23918D1
  144. SEQUENCE(2 elem)
  145. OBJECT IDENTIFIER 2.5.29.35
  146. OCTET STRING(1 elem)
  147. SEQUENCE(3 elem)
  148. [0]
  149. [1](1)
  150. [4](1)
  151. SEQUENCE(4 elem)
  152. SET(1 elem)
  153. SEQUENCE(2 elem)
  154. OBJECT IDENTIFIER 2.5.4.10
  155. PrintableString Root CA
  156. SET(1 elem)
  157. SEQUENCE(2 elem)
  158. OBJECT IDENTIFIER 2.5.4.11
  159. PrintableString http://www.cacert.org
  160. SET(1 elem)
  161. SEQUENCE(2 elem)
  162. OBJECT IDENTIFIER 2.5.4.3
  163. PrintableString CA Cert Signing Authority
  164. SET(1 elem)
  165. SEQUENCE(2 elem)
  166. OBJECT IDENTIFIER 1.2.840.113549.1.9.1
  167. IA5String [email protected]
  168. [2]
  169. SEQUENCE(3 elem)
  170. OBJECT IDENTIFIER 2.5.29.19
  171. BOOLEAN true
  172. OCTET STRING(1 elem)
  173. SEQUENCE(1 elem)
  174. BOOLEAN true
  175. SEQUENCE(2 elem)
  176. OBJECT IDENTIFIER 2.5.29.31
  177. OCTET STRING(1 elem)
  178. SEQUENCE(1 elem)
  179. SEQUENCE(1 elem)
  180. [0](1)
  181. [0](1)
  182. [6]
  183. SEQUENCE(2 elem)
  184. OBJECT IDENTIFIER 2.16.840.1.113730.1.4
  185. OCTET STRING(1 elem)
  186. IA5String https://www.cacert.org/revoke.crl
  187. SEQUENCE(2 elem)
  188. OBJECT IDENTIFIER 2.16.840.1.113730.1.8
  189. OCTET STRING(1 elem)
  190. IA5String http://www.cacert.org/index.php?id=10
  191. SEQUENCE(2 elem)
  192. OBJECT IDENTIFIER 2.16.840.1.113730.1.13
  193. OCTET STRING(1 elem)
  194. IA5String To get your own certificate for FREE head over to http://www.cacert.org
  195. SEQUENCE(2 elem)
  196. OBJECT IDENTIFIER 1.2.840.113549.1.1.4
  197. NULL
  198. BIT STRING(4096 bit)
  199. */
  200. #define ASN1_FMTSTRING_FMT "line: %d, type=%d, size=%lu, data=%p, self=%p, next=%p, prev=%p, parent=%p, child=%p"
  201. #define ASN1_FMTSTRING_VAL(l) __LINE__, (l)->type, (l)->size, (l)->data, (l), (l)->next, (l)->prev, (l)->parent, (l)->child
  202. #define ASN1_ERR(l) fprintf(stderr, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l)); \
  203. exit(EXIT_FAILURE)
  204. #define CHECK_ASN1_HAS(l, w) do { if ((l)->w == NULL) { \
  205. ASN1_ERR(l);\
  206. } } while(0)
  207. #define CHECK_ASN1_HAS_NO(l, w) do { if ((l)->w != NULL) { \
  208. ASN1_ERR(l);\
  209. } } while(0)
  210. #define CHECK_ASN1_TYPE(l, t) do { if ((l)->type != (t)) { \
  211. ASN1_ERR(l);\
  212. } } while(0)
  213. #define CHECK_ASN1_HAS_CHILD(l) CHECK_ASN1_HAS(l, child)
  214. #define CHECK_ASN1_HAS_NO_CHILD(l) CHECK_ASN1_HAS_NO(l, child)
  215. #define CHECK_ASN1_HAS_NEXT(l) CHECK_ASN1_HAS(l, next)
  216. #define CHECK_ASN1_HAS_NO_NEXT(l) CHECK_ASN1_HAS_NO(l, next)
  217. #define CHECK_ASN1_HAS_DATA(l) CHECK_ASN1_HAS(l, data)
  218. #define CHECK_ASN1_HAS_NO_DATA(l) CHECK_ASN1_HAS_NO(l, data)
  219. #ifdef LTC_DER_TESTS_PRINT_FLEXI
  220. static void* s_xmalloc(int l)
  221. {
  222. void *r = XMALLOC(l);
  223. #if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 3
  224. fprintf(stderr, "ALLOC %9d to %p\n", l, r);
  225. #endif
  226. if (!r) {
  227. fprintf(stderr, "Could not allocate %d bytes of memory\n", l);
  228. exit(EXIT_FAILURE);
  229. }
  230. return r;
  231. }
  232. static void s_free(void *p)
  233. {
  234. #if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 3
  235. fprintf(stderr, "FREE %p\n", p);
  236. #endif
  237. XFREE(p);
  238. }
  239. static void s_der_tests_print_flexi_i(ltc_asn1_list* l, unsigned int level)
  240. {
  241. char *buf = NULL;
  242. const char* name = NULL;
  243. const char* text = NULL;
  244. ltc_asn1_list* ostring = NULL;
  245. unsigned int n;
  246. int slen;
  247. switch (l->type)
  248. {
  249. case LTC_ASN1_EOL:
  250. name = "EOL";
  251. slen = snprintf(NULL, 0, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
  252. buf = s_xmalloc(slen);
  253. slen = snprintf(buf, slen, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
  254. text = buf;
  255. break;
  256. case LTC_ASN1_BOOLEAN:
  257. name = "BOOLEAN";
  258. {
  259. if (*(int*)l->data)
  260. text = "true";
  261. else
  262. text = "false";
  263. }
  264. break;
  265. case LTC_ASN1_INTEGER:
  266. name = "INTEGER";
  267. buf = s_xmalloc(((ltc_mp_get_digit_count(l->data) + 1) * ltc_mp.bits_per_digit) / 3);
  268. ltc_mp_toradix(l->data, buf, 10);
  269. text = buf;
  270. break;
  271. case LTC_ASN1_SHORT_INTEGER:
  272. name = "SHORT INTEGER";
  273. break;
  274. case LTC_ASN1_BIT_STRING:
  275. name = "BIT STRING";
  276. break;
  277. case LTC_ASN1_OCTET_STRING:
  278. name = "OCTET STRING";
  279. {
  280. unsigned long ostring_l = l->size;
  281. /* sometimes there's another sequence in an octet string...
  282. * try to decode that... if it fails print out the octet string
  283. */
  284. if (der_decode_sequence_flexi(l->data, &ostring_l, &ostring) == CRYPT_OK) {
  285. text = "";
  286. } else {
  287. int r;
  288. int sz = l->size * 2 + 1;
  289. char* s = buf = s_xmalloc(sz);
  290. for (n = 0; n < l->size; ++n) {
  291. r = snprintf(s, sz, "%02X", ((unsigned char*)l->data)[n]);
  292. if (r < 0 || r >= sz) {
  293. fprintf(stderr, "%s boom\n", name);
  294. exit(EXIT_FAILURE);
  295. }
  296. s += r;
  297. sz -= r;
  298. }
  299. text = buf;
  300. }
  301. }
  302. break;
  303. case LTC_ASN1_NULL:
  304. name = "NULL";
  305. text = "";
  306. break;
  307. case LTC_ASN1_OBJECT_IDENTIFIER:
  308. name = "OBJECT IDENTIFIER";
  309. {
  310. unsigned long len = 0;
  311. if (pk_oid_num_to_str(l->data, l->size, buf, &len) != CRYPT_BUFFER_OVERFLOW) {
  312. fprintf(stderr, "%s WTF\n", name);
  313. exit(EXIT_FAILURE);
  314. }
  315. buf = s_xmalloc(len);
  316. if (pk_oid_num_to_str(l->data, l->size, buf, &len) != CRYPT_OK) {
  317. fprintf(stderr, "%s boom\n", name);
  318. exit(EXIT_FAILURE);
  319. }
  320. text = buf;
  321. }
  322. break;
  323. case LTC_ASN1_IA5_STRING:
  324. name = "IA5 STRING";
  325. text = l->data;
  326. break;
  327. case LTC_ASN1_PRINTABLE_STRING:
  328. name = "PRINTABLE STRING";
  329. text = l->data;
  330. break;
  331. case LTC_ASN1_UTF8_STRING:
  332. name = "UTF8 STRING";
  333. break;
  334. case LTC_ASN1_UTCTIME:
  335. name = "UTCTIME";
  336. {
  337. ltc_utctime* ut = l->data;
  338. slen = 32;
  339. buf = s_xmalloc(slen);
  340. snprintf(buf, slen, "%02d-%02d-%02d %02d:%02d:%02d %c%02d:%02d",
  341. ut->YY, ut->MM, ut->DD, ut->hh, ut->mm, ut->ss,
  342. ut->off_dir ? '-' : '+', ut->off_hh, ut->off_mm);
  343. text = buf;
  344. }
  345. break;
  346. case LTC_ASN1_GENERALIZEDTIME:
  347. name = "GENERALIZED TIME";
  348. {
  349. ltc_generalizedtime* gt = l->data;
  350. slen = 32;
  351. buf = s_xmalloc(slen);
  352. if(gt->fs)
  353. snprintf(buf, slen, "%04d-%02d-%02d %02d:%02d:%02d.%02dZ",
  354. gt->YYYY, gt->MM, gt->DD, gt->hh, gt->mm, gt->ss, gt->fs);
  355. else
  356. snprintf(buf, slen, "%04d-%02d-%02d %02d:%02d:%02dZ",
  357. gt->YYYY, gt->MM, gt->DD, gt->hh, gt->mm, gt->ss);
  358. text = buf;
  359. }
  360. break;
  361. case LTC_ASN1_CHOICE:
  362. name = "CHOICE";
  363. break;
  364. case LTC_ASN1_SEQUENCE:
  365. name = "SEQUENCE";
  366. text = "";
  367. break;
  368. case LTC_ASN1_SET:
  369. name = "SET";
  370. text = "";
  371. break;
  372. case LTC_ASN1_SETOF:
  373. name = "SETOF";
  374. text = "";
  375. break;
  376. case LTC_ASN1_RAW_BIT_STRING:
  377. name = "RAW BIT STRING";
  378. break;
  379. case LTC_ASN1_TELETEX_STRING:
  380. name = "TELETEX STRING";
  381. text = l->data;
  382. break;
  383. case LTC_ASN1_CUSTOM_TYPE:
  384. name = "NON STANDARD";
  385. {
  386. int r;
  387. int sz = 128;
  388. char* s = buf = s_xmalloc(sz);
  389. r = snprintf(s, sz, "[%s %s %llu]", der_asn1_class_to_string_map[l->klass], der_asn1_pc_to_string_map[l->pc], l->tag);
  390. if (r < 0 || r >= sz) {
  391. fprintf(stderr, "%s boom\n", name);
  392. exit(EXIT_FAILURE);
  393. }
  394. s += r;
  395. sz -= r;
  396. text = buf;
  397. }
  398. break;
  399. }
  400. for (n = 0; n < level; ++n) {
  401. fprintf(stderr, " ");
  402. }
  403. if (name) {
  404. if (text)
  405. fprintf(stderr, "%s %s\n", name, text);
  406. else
  407. fprintf(stderr, "%s <missing decoding>\n", name);
  408. }
  409. else
  410. fprintf(stderr, "WTF type=%i\n", l->type);
  411. if (buf) {
  412. s_free(buf);
  413. buf = NULL;
  414. }
  415. if (ostring) {
  416. s_der_tests_print_flexi_i(ostring, level + 1);
  417. der_free_sequence_flexi(ostring);
  418. }
  419. if (l->child)
  420. s_der_tests_print_flexi_i(l->child, level + 1);
  421. if (l->next)
  422. s_der_tests_print_flexi_i(l->next, level);
  423. }
  424. static void s_der_tests_print_flexi(ltc_asn1_list* l)
  425. {
  426. fprintf(stderr, "\n\n");
  427. s_der_tests_print_flexi_i(l, 0);
  428. fprintf(stderr, "\n\n");
  429. }
  430. #else
  431. static void s_der_tests_print_flexi(ltc_asn1_list* l)
  432. {
  433. LTC_UNUSED_PARAM(l);
  434. }
  435. #endif
  436. static void der_cacert_test(void)
  437. {
  438. unsigned char buf[sizeof(ltc_der_tests_cacert_root_cert)];
  439. unsigned long len1 = sizeof(buf), len2;
  440. ltc_asn1_list *decoded_list, *l, *l1, *l2;
  441. DO(base64_decode(s_der_tests_stinky_root_cert, sizeof(s_der_tests_stinky_root_cert), buf, &len1));
  442. len2 = len1;
  443. DO(der_decode_sequence_flexi(buf, &len2, &decoded_list));
  444. der_free_sequence_flexi(decoded_list);
  445. len1 = sizeof(buf);
  446. DO(base64_decode(ltc_der_tests_cacert_root_cert, sizeof(ltc_der_tests_cacert_root_cert), buf, &len1));
  447. len2 = len1;
  448. DO(der_decode_sequence_flexi(buf, &len2, &decoded_list));
  449. CHECK_ASN1_TYPE(decoded_list, LTC_ASN1_SEQUENCE);
  450. CHECK_ASN1_HAS_DATA(decoded_list);
  451. der_sequence_shrink(decoded_list);
  452. CHECK_ASN1_TYPE(decoded_list, LTC_ASN1_SEQUENCE);
  453. CHECK_ASN1_HAS_NO_DATA(decoded_list);
  454. s_der_tests_print_flexi(decoded_list);
  455. l = decoded_list;
  456. /*
  457. SEQUENCE(3 elem)
  458. SEQUENCE(8 elem)
  459. */
  460. CHECK_ASN1_TYPE(l, LTC_ASN1_SEQUENCE);
  461. CHECK_ASN1_HAS_CHILD(l);
  462. CHECK_ASN1_HAS_NO_NEXT(l);
  463. l = l->child;
  464. CHECK_ASN1_TYPE(l, LTC_ASN1_SEQUENCE);
  465. CHECK_ASN1_HAS_CHILD(l);
  466. CHECK_ASN1_HAS_NEXT(l);
  467. l1 = l->child;
  468. /*
  469. [0](1)
  470. INTEGER 2
  471. */
  472. CHECK_ASN1_TYPE(l1, LTC_ASN1_CUSTOM_TYPE);
  473. CHECK_ASN1_HAS_CHILD(l1);
  474. CHECK_ASN1_HAS_NEXT(l1);
  475. l2 = l1->child;
  476. CHECK_ASN1_TYPE(l2, LTC_ASN1_INTEGER);
  477. CHECK_ASN1_HAS_NO_CHILD(l2);
  478. CHECK_ASN1_HAS_NO_NEXT(l2);
  479. l1 = l1->next;
  480. /*
  481. INTEGER 0
  482. */
  483. CHECK_ASN1_TYPE(l1, LTC_ASN1_INTEGER);
  484. CHECK_ASN1_HAS_NO_CHILD(l1);
  485. CHECK_ASN1_HAS_NEXT(l1);
  486. l1 = l1->next;
  487. /*
  488. SEQUENCE(2 elem)
  489. OBJECT IDENTIFIER 1.2.840.113549.1.1.4
  490. NULL
  491. */
  492. CHECK_ASN1_TYPE(l1, LTC_ASN1_SEQUENCE);
  493. CHECK_ASN1_HAS_CHILD(l1);
  494. CHECK_ASN1_HAS_NEXT(l1);
  495. l2 = l1->child;
  496. CHECK_ASN1_TYPE(l2, LTC_ASN1_OBJECT_IDENTIFIER);
  497. CHECK_ASN1_HAS_NO_CHILD(l2);
  498. CHECK_ASN1_HAS_NEXT(l2);
  499. l2 = l2->next;
  500. CHECK_ASN1_TYPE(l2, LTC_ASN1_NULL);
  501. CHECK_ASN1_HAS_NO_CHILD(l2);
  502. CHECK_ASN1_HAS_NO_NEXT(l2);
  503. /*
  504. SEQUENCE(4 elem)
  505. SET(1 elem)
  506. SEQUENCE(2 elem)
  507. OBJECT IDENTIFIER 2.5.4.10
  508. PrintableString Root CA
  509. SET(1 elem)
  510. SEQUENCE(2 elem)
  511. OBJECT IDENTIFIER 2.5.4.11
  512. PrintableString http://www.cacert.org
  513. SET(1 elem)
  514. SEQUENCE(2 elem)
  515. OBJECT IDENTIFIER 2.5.4.3
  516. PrintableString CA Cert Signing Authority
  517. SET(1 elem)
  518. SEQUENCE(2 elem)
  519. OBJECT IDENTIFIER 1.2.840.113549.1.9.1
  520. IA5String [email protected]
  521. */
  522. l = l->next;
  523. /*
  524. SEQUENCE(2 elem)
  525. OBJECT IDENTIFIER 1.2.840.113549.1.1.4
  526. NULL
  527. */
  528. CHECK_ASN1_TYPE(l, LTC_ASN1_SEQUENCE);
  529. CHECK_ASN1_HAS_CHILD(l);
  530. CHECK_ASN1_HAS_NEXT(l);
  531. l1 = l->child;
  532. CHECK_ASN1_TYPE(l1, LTC_ASN1_OBJECT_IDENTIFIER);
  533. CHECK_ASN1_HAS_NO_CHILD(l1);
  534. CHECK_ASN1_HAS_NEXT(l1);
  535. l1 = l1->next;
  536. CHECK_ASN1_TYPE(l1, LTC_ASN1_NULL);
  537. CHECK_ASN1_HAS_NO_CHILD(l1);
  538. CHECK_ASN1_HAS_NO_NEXT(l1);
  539. l = l->next;
  540. /*
  541. BIT STRING(4096 bit)
  542. */
  543. CHECK_ASN1_TYPE(l, LTC_ASN1_BIT_STRING);
  544. CHECK_ASN1_HAS_NO_CHILD(l);
  545. CHECK_ASN1_HAS_NO_NEXT(l);
  546. der_free_sequence_flexi(decoded_list);
  547. }
  548. static void der_set_test(void)
  549. {
  550. ltc_asn1_list list[10];
  551. static const unsigned char oct_str[] = { 1, 2, 3, 4 };
  552. static const unsigned char bin_str[] = { 1, 0, 0, 1 };
  553. static const unsigned long int_val = 12345678UL;
  554. char strs[10][10];
  555. unsigned char outbuf[128];
  556. unsigned long x, val, outlen;
  557. /* make structure and encode it */
  558. LTC_SET_ASN1(list, 0, LTC_ASN1_OCTET_STRING, oct_str, sizeof(oct_str));
  559. LTC_SET_ASN1(list, 1, LTC_ASN1_BIT_STRING, bin_str, sizeof(bin_str));
  560. LTC_SET_ASN1(list, 2, LTC_ASN1_SHORT_INTEGER, &int_val, 1);
  561. /* encode it */
  562. outlen = sizeof(outbuf);
  563. DO(der_encode_set(list, 3, outbuf, &outlen));
  564. /* first let's test the set_decoder out of order to see what happens, we should get all the fields we expect even though they're in a diff order */
  565. LTC_SET_ASN1(list, 0, LTC_ASN1_BIT_STRING, strs[1], sizeof(strs[1]));
  566. LTC_SET_ASN1(list, 1, LTC_ASN1_SHORT_INTEGER, &val, 1);
  567. LTC_SET_ASN1(list, 2, LTC_ASN1_OCTET_STRING, strs[0], sizeof(strs[0]));
  568. DO(der_decode_set(outbuf, outlen, list, 3));
  569. /* now compare the items */
  570. if (memcmp(strs[0], oct_str, sizeof(oct_str))) {
  571. fprintf(stderr, "error decoding set using der_decode_set (oct_str is wrong):\n");
  572. exit(EXIT_FAILURE);
  573. }
  574. if (memcmp(strs[1], bin_str, sizeof(bin_str))) {
  575. fprintf(stderr, "error decoding set using der_decode_set (bin_str is wrong):\n");
  576. exit(EXIT_FAILURE);
  577. }
  578. if (val != int_val) {
  579. fprintf(stderr, "error decoding set using der_decode_set (int_val is wrong):\n");
  580. exit(EXIT_FAILURE);
  581. }
  582. strcpy(strs[0], "one");
  583. strcpy(strs[1], "one2");
  584. strcpy(strs[2], "two");
  585. strcpy(strs[3], "aaa");
  586. strcpy(strs[4], "aaaa");
  587. strcpy(strs[5], "aab");
  588. strcpy(strs[6], "aaab");
  589. strcpy(strs[7], "bbb");
  590. strcpy(strs[8], "bbba");
  591. strcpy(strs[9], "bbbb");
  592. for (x = 0; x < 10; x++) {
  593. LTC_SET_ASN1(list, x, LTC_ASN1_PRINTABLE_STRING, strs[x], XSTRLEN(strs[x]));
  594. }
  595. outlen = sizeof(outbuf);
  596. DO(der_encode_setof(list, 10, outbuf, &outlen));
  597. for (x = 0; x < 10; x++) {
  598. LTC_SET_ASN1(list, x, LTC_ASN1_PRINTABLE_STRING, strs[x], sizeof(strs[x]) - 1);
  599. }
  600. XMEMSET(strs, 0, sizeof(strs));
  601. DO(der_decode_set(outbuf, outlen, list, 10));
  602. /* now compare */
  603. for (x = 1; x < 10; x++) {
  604. if (!(XSTRLEN(strs[x-1]) <= XSTRLEN(strs[x])) && strcmp(strs[x-1], strs[x]) >= 0) {
  605. fprintf(stderr, "error SET OF order at %lu is wrong\n", x);
  606. exit(EXIT_FAILURE);
  607. }
  608. }
  609. }
  610. static void s_der_oid_test(void)
  611. {
  612. static const unsigned char oid_x690_8_19_5_example[] = { 0x06, 0x03, 0x88, 0x37, 0x03 };
  613. unsigned long len, oid[3];
  614. unsigned char buf[64];
  615. ltc_asn1_list *decoded_list, static_list[1];
  616. len = sizeof(oid_x690_8_19_5_example);
  617. DO(der_decode_sequence_flexi(oid_x690_8_19_5_example, &len, &decoded_list));
  618. LTC_SET_ASN1(static_list, 0, LTC_ASN1_OBJECT_IDENTIFIER, (void *)decoded_list->data, decoded_list->size);
  619. len = sizeof(buf);
  620. DO(der_encode_object_identifier(decoded_list->data, decoded_list->size, buf, &len));
  621. der_sequence_free(decoded_list);
  622. COMPARE_TESTVECTOR(buf, len, oid_x690_8_19_5_example, sizeof(oid_x690_8_19_5_example), "OID X6.90 Ch. 8.19.5 Example", 0);
  623. oid[0] = 3;
  624. oid[1] = 4;
  625. oid[2] = 5;
  626. len = sizeof(buf);
  627. SHOULD_FAIL(der_encode_object_identifier(oid, 3, buf, &len));
  628. len = sizeof(buf);
  629. SHOULD_FAIL(der_length_object_identifier(oid, 3, &len));
  630. }
  631. /* we are encoding
  632. SEQUENCE {
  633. PRINTABLE "printable"
  634. IA5 "ia5"
  635. SEQUENCE {
  636. INTEGER 12345678
  637. UTCTIME { 91, 5, 6, 16, 45, 40, 1, 7, 0 }
  638. GENERALIZEDTIME { 2017, 03, 21, 10, 21, 12, 4, 1, 2, 0 }
  639. SEQUENCE {
  640. OCTET STRING { 1, 2, 3, 4 }
  641. BIT STRING { 1, 0, 0, 1 }
  642. SEQUENCE {
  643. OID { 1, 2, 840, 113549 }
  644. NULL
  645. SET OF {
  646. PRINTABLE "333" -- WILL GET SORTED
  647. PRINTABLE "222"
  648. }
  649. }
  650. }
  651. }
  652. */
  653. static void der_flexi_test(void)
  654. {
  655. static const char printable_str[] = "printable";
  656. static const char set1_str[] = "333";
  657. static const char set2_str[] = "222";
  658. static const char ia5_str[] = "ia5";
  659. static const unsigned long int_val = 12345678UL;
  660. static const ltc_utctime utctime = { 91, 5, 6, 16, 45, 40, 1, 7, 0 };
  661. static const ltc_generalizedtime gtime = { 2017, 03, 21, 10, 21, 12, 421, 1, 2, 0 };
  662. static const unsigned char oct_str[] = { 1, 2, 3, 4 };
  663. static const unsigned char bit_str[] = { 1, 0, 0, 1 };
  664. static const unsigned long oid_str[] = { 1, 2, 840, 113549 };
  665. unsigned char encode_buf[192];
  666. unsigned long encode_buf_len, decode_len;
  667. ltc_asn1_list static_list[5][4], *decoded_list, *l;
  668. /* build list */
  669. LTC_SET_ASN1(static_list[0], 0, LTC_ASN1_PRINTABLE_STRING, (void *)printable_str, XSTRLEN(printable_str));
  670. LTC_SET_ASN1(static_list[0], 1, LTC_ASN1_IA5_STRING, (void *)ia5_str, XSTRLEN(ia5_str));
  671. LTC_SET_ASN1(static_list[0], 2, LTC_ASN1_SEQUENCE, static_list[1], 4);
  672. LTC_SET_ASN1(static_list[1], 0, LTC_ASN1_SHORT_INTEGER, (void *)&int_val, 1);
  673. LTC_SET_ASN1(static_list[1], 1, LTC_ASN1_UTCTIME, (void *)&utctime, 1);
  674. LTC_SET_ASN1(static_list[1], 2, LTC_ASN1_GENERALIZEDTIME, (void *)&gtime, 1);
  675. LTC_SET_ASN1(static_list[1], 3, LTC_ASN1_SEQUENCE, static_list[2], 3);
  676. LTC_SET_ASN1(static_list[2], 0, LTC_ASN1_OCTET_STRING, (void *)oct_str, 4);
  677. LTC_SET_ASN1(static_list[2], 1, LTC_ASN1_BIT_STRING, (void *)bit_str, 4);
  678. LTC_SET_ASN1(static_list[2], 2, LTC_ASN1_SEQUENCE, static_list[3], 3);
  679. LTC_SET_ASN1(static_list[3], 0, LTC_ASN1_OBJECT_IDENTIFIER,(void *)oid_str, 4);
  680. LTC_SET_ASN1(static_list[3], 1, LTC_ASN1_NULL, NULL, 0);
  681. LTC_SET_ASN1(static_list[3], 2, LTC_ASN1_SETOF, static_list[4], 2);
  682. LTC_SET_ASN1(static_list[4], 0, LTC_ASN1_PRINTABLE_STRING, set1_str, XSTRLEN(set1_str));
  683. LTC_SET_ASN1(static_list[4], 1, LTC_ASN1_PRINTABLE_STRING, set2_str, XSTRLEN(set2_str));
  684. /* encode it */
  685. encode_buf_len = sizeof(encode_buf);
  686. DO(der_encode_sequence(&static_list[0][0], 3, encode_buf, &encode_buf_len));
  687. #if 0
  688. {
  689. FILE *f;
  690. f = fopen("t.bin", "wb");
  691. fwrite(encode_buf, 1, encode_buf_len, f);
  692. fclose(f);
  693. }
  694. #endif
  695. /* decode with flexi */
  696. decode_len = encode_buf_len;
  697. DO(der_decode_sequence_flexi(encode_buf, &decode_len, &decoded_list));
  698. if (decode_len != encode_buf_len) {
  699. fprintf(stderr, "Decode len of %lu does not match encode len of %lu \n", decode_len, encode_buf_len);
  700. exit(EXIT_FAILURE);
  701. }
  702. /* we expect l->next to be NULL and l->child to not be */
  703. l = decoded_list;
  704. if (l->next != NULL || l->child == NULL) {
  705. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  706. exit(EXIT_FAILURE);
  707. }
  708. /* we expect a SEQUENCE */
  709. if (l->type != LTC_ASN1_SEQUENCE) {
  710. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  711. exit(EXIT_FAILURE);
  712. }
  713. l = l->child;
  714. /* PRINTABLE STRING */
  715. /* we expect printable_str */
  716. if (l->next == NULL || l->child != NULL) {
  717. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  718. exit(EXIT_FAILURE);
  719. }
  720. if (l->type != LTC_ASN1_PRINTABLE_STRING) {
  721. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  722. exit(EXIT_FAILURE);
  723. }
  724. if (l->size != XSTRLEN(printable_str) || memcmp(printable_str, l->data, l->size)) {
  725. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  726. exit(EXIT_FAILURE);
  727. }
  728. /* move to next */
  729. l = l->next;
  730. /* IA5 STRING */
  731. /* we expect ia5_str */
  732. if (l->next == NULL || l->child != NULL) {
  733. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  734. exit(EXIT_FAILURE);
  735. }
  736. if (l->type != LTC_ASN1_IA5_STRING) {
  737. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  738. exit(EXIT_FAILURE);
  739. }
  740. if (l->size != XSTRLEN(ia5_str) || memcmp(ia5_str, l->data, l->size)) {
  741. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  742. exit(EXIT_FAILURE);
  743. }
  744. /* move to next */
  745. l = l->next;
  746. /* expect child anve move down */
  747. if (l->next != NULL || l->child == NULL) {
  748. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  749. exit(EXIT_FAILURE);
  750. }
  751. if (l->type != LTC_ASN1_SEQUENCE) {
  752. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  753. exit(EXIT_FAILURE);
  754. }
  755. l = l->child;
  756. /* INTEGER */
  757. if (l->next == NULL || l->child != NULL) {
  758. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  759. exit(EXIT_FAILURE);
  760. }
  761. if (l->type != LTC_ASN1_INTEGER) {
  762. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  763. exit(EXIT_FAILURE);
  764. }
  765. if (ltc_mp_cmp_d(l->data, 12345678UL) != LTC_MP_EQ) {
  766. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  767. exit(EXIT_FAILURE);
  768. }
  769. /* move to next */
  770. l = l->next;
  771. /* UTCTIME */
  772. if (l->next == NULL || l->child != NULL) {
  773. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  774. exit(EXIT_FAILURE);
  775. }
  776. if (l->type != LTC_ASN1_UTCTIME) {
  777. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  778. exit(EXIT_FAILURE);
  779. }
  780. if (memcmp(l->data, &utctime, sizeof(utctime))) {
  781. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  782. exit(EXIT_FAILURE);
  783. }
  784. /* move to next */
  785. l = l->next;
  786. /* GeneralizedTime */
  787. if (l->next == NULL || l->child != NULL) {
  788. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  789. exit(EXIT_FAILURE);
  790. }
  791. if (l->type != LTC_ASN1_GENERALIZEDTIME) {
  792. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  793. exit(EXIT_FAILURE);
  794. }
  795. if (memcmp(l->data, &gtime, sizeof(gtime))) {
  796. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  797. exit(EXIT_FAILURE);
  798. }
  799. /* move to next */
  800. l = l->next;
  801. /* expect child anve move down */
  802. if (l->next != NULL || l->child == NULL) {
  803. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  804. exit(EXIT_FAILURE);
  805. }
  806. if (l->type != LTC_ASN1_SEQUENCE) {
  807. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  808. exit(EXIT_FAILURE);
  809. }
  810. l = l->child;
  811. /* OCTET STRING */
  812. /* we expect oct_str */
  813. if (l->next == NULL || l->child != NULL) {
  814. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  815. exit(EXIT_FAILURE);
  816. }
  817. if (l->type != LTC_ASN1_OCTET_STRING) {
  818. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  819. exit(EXIT_FAILURE);
  820. }
  821. if (l->size != sizeof(oct_str) || memcmp(oct_str, l->data, l->size)) {
  822. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  823. exit(EXIT_FAILURE);
  824. }
  825. /* move to next */
  826. l = l->next;
  827. /* BIT STRING */
  828. /* we expect oct_str */
  829. if (l->next == NULL || l->child != NULL) {
  830. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  831. exit(EXIT_FAILURE);
  832. }
  833. if (l->type != LTC_ASN1_BIT_STRING) {
  834. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  835. exit(EXIT_FAILURE);
  836. }
  837. if (l->size != sizeof(bit_str) || memcmp(bit_str, l->data, l->size)) {
  838. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  839. exit(EXIT_FAILURE);
  840. }
  841. /* move to next */
  842. l = l->next;
  843. /* expect child anve move down */
  844. if (l->next != NULL || l->child == NULL) {
  845. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  846. exit(EXIT_FAILURE);
  847. }
  848. if (l->type != LTC_ASN1_SEQUENCE) {
  849. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  850. exit(EXIT_FAILURE);
  851. }
  852. l = l->child;
  853. /* OID STRING */
  854. /* we expect oid_str */
  855. if (l->next == NULL || l->child != NULL) {
  856. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  857. exit(EXIT_FAILURE);
  858. }
  859. if (l->type != LTC_ASN1_OBJECT_IDENTIFIER) {
  860. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  861. exit(EXIT_FAILURE);
  862. }
  863. if (l->size != LTC_ARRAY_SIZE(oid_str) || memcmp(oid_str, l->data, l->size*sizeof(oid_str[0]))) {
  864. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  865. exit(EXIT_FAILURE);
  866. }
  867. /* move to next */
  868. l = l->next;
  869. /* NULL */
  870. if (l->type != LTC_ASN1_NULL) {
  871. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  872. exit(EXIT_FAILURE);
  873. }
  874. /* move to next */
  875. l = l->next;
  876. /* expect child anve move down */
  877. if (l->next != NULL || l->child == NULL) {
  878. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  879. exit(EXIT_FAILURE);
  880. }
  881. if (l->type != LTC_ASN1_SET) {
  882. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  883. exit(EXIT_FAILURE);
  884. }
  885. l = l->child;
  886. /* PRINTABLE STRING */
  887. /* we expect printable_str */
  888. if (l->next == NULL || l->child != NULL) {
  889. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  890. exit(EXIT_FAILURE);
  891. }
  892. if (l->type != LTC_ASN1_PRINTABLE_STRING) {
  893. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  894. exit(EXIT_FAILURE);
  895. }
  896. /* note we compare set2_str FIRST because the SET OF is sorted and "222" comes before "333" */
  897. if (l->size != XSTRLEN(set2_str) || memcmp(set2_str, l->data, l->size)) {
  898. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  899. exit(EXIT_FAILURE);
  900. }
  901. /* move to next */
  902. l = l->next;
  903. /* PRINTABLE STRING */
  904. /* we expect printable_str */
  905. if (l->type != LTC_ASN1_PRINTABLE_STRING) {
  906. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  907. exit(EXIT_FAILURE);
  908. }
  909. if (l->size != XSTRLEN(set1_str) || memcmp(set1_str, l->data, l->size)) {
  910. fprintf(stderr, "(%d), %d, %lu, next=%p, prev=%p, parent=%p, child=%p\n", __LINE__, l->type, l->size, l->next, l->prev, l->parent, l->child);
  911. exit(EXIT_FAILURE);
  912. }
  913. der_sequence_free(l);
  914. }
  915. static int der_choice_n_custom_test(void)
  916. {
  917. ltc_asn1_list types[10], host[1], custom[1], root[1], child[1];
  918. int boolean[1];
  919. unsigned char bitbuf[10], octetbuf[10], ia5buf[10], printbuf[10], outbuf[256], custbuf[256], x, y;
  920. wchar_t utf8buf[10];
  921. unsigned long integer, oidbuf[10], outlen, custlen, inlen, n;
  922. void *mpinteger;
  923. ltc_utctime utctime = { 91, 5, 6, 16, 45, 40, 1, 7, 0 };
  924. ltc_generalizedtime gtime = { 2038, 01, 19, 3, 14, 8, 0, 0, 0, 0 };
  925. /* setup variables */
  926. for (x = 0; x < sizeof(bitbuf); x++) { bitbuf[x] = x & 1; }
  927. for (x = 0; x < sizeof(octetbuf); x++) { octetbuf[x] = x; }
  928. for (x = 0; x < sizeof(ia5buf); x++) { ia5buf[x] = 'a'; }
  929. for (x = 0; x < sizeof(printbuf); x++) { printbuf[x] = 'a'; }
  930. for (x = 0; x < LTC_ARRAY_SIZE(utf8buf); x++) { utf8buf[x] = L'a'; }
  931. integer = 1;
  932. boolean[0] = 1;
  933. for (x = 0; x < LTC_ARRAY_SIZE(oidbuf); x++) { oidbuf[x] = x + 1; }
  934. DO(ltc_mp_init(&mpinteger));
  935. n = LTC_ARRAY_SIZE(types);
  936. for (x = 0; x < n * 2; x++) {
  937. /* setup list */
  938. y = 0;
  939. LTC_SET_ASN1(types, y++, LTC_ASN1_PRINTABLE_STRING, printbuf, sizeof(printbuf));
  940. if (x > n) {
  941. LTC_SET_ASN1(types, y++, LTC_ASN1_BIT_STRING, bitbuf, sizeof(bitbuf));
  942. } else {
  943. LTC_SET_ASN1(types, y++, LTC_ASN1_RAW_BIT_STRING, bitbuf, sizeof(bitbuf));
  944. }
  945. LTC_SET_ASN1(types, y++, LTC_ASN1_OCTET_STRING, octetbuf, sizeof(octetbuf));
  946. LTC_SET_ASN1(types, y++, LTC_ASN1_IA5_STRING, ia5buf, sizeof(ia5buf));
  947. LTC_SET_ASN1(types, y++, LTC_ASN1_BOOLEAN, boolean, LTC_ARRAY_SIZE(boolean));
  948. if (x > n) {
  949. LTC_SET_ASN1(types, y++, LTC_ASN1_SHORT_INTEGER, &integer, 1);
  950. } else {
  951. LTC_SET_ASN1(types, y++, LTC_ASN1_INTEGER, mpinteger, 1);
  952. }
  953. LTC_SET_ASN1(types, y++, LTC_ASN1_OBJECT_IDENTIFIER, oidbuf, LTC_ARRAY_SIZE(oidbuf));
  954. if (x > n) {
  955. LTC_SET_ASN1(types, y++, LTC_ASN1_UTCTIME, &utctime, 1);
  956. } else {
  957. LTC_SET_ASN1(types, y++, LTC_ASN1_GENERALIZEDTIME, &gtime, 1);
  958. }
  959. LTC_SET_ASN1(custom, 0, LTC_ASN1_NULL, NULL, 0);
  960. LTC_SET_ASN1_CUSTOM_CONSTRUCTED(types, y++, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0, custom);
  961. LTC_SET_ASN1(types, y++, LTC_ASN1_UTF8_STRING, utf8buf, LTC_ARRAY_SIZE(utf8buf));
  962. LTC_SET_ASN1(host, 0, LTC_ASN1_CHOICE, types, n);
  963. /* encode */
  964. outlen = sizeof(outbuf);
  965. DO(der_encode_sequence(&types[x % n], 1, outbuf, &outlen));
  966. /* custom encode */
  967. child[0] = types[x % n];
  968. if (x < n) {
  969. LTC_SET_ASN1_CUSTOM_CONSTRUCTED(root, 0, LTC_ASN1_CL_CONTEXT_SPECIFIC, 1uLL << (x % n), child);
  970. } else {
  971. LTC_SET_ASN1_CUSTOM_PRIMITIVE(root, 0, LTC_ASN1_CL_CONTEXT_SPECIFIC, 1uLL << (x % n), child->type, child->data, child->size);
  972. }
  973. custlen = sizeof(custbuf);
  974. /* don't try to custom-encode a primitive custom-type */
  975. if (child[0].type != LTC_ASN1_CUSTOM_TYPE || root->pc != LTC_ASN1_PC_PRIMITIVE) {
  976. DO(der_encode_custom_type(root, custbuf, &custlen));
  977. }
  978. /* decode it */
  979. inlen = outlen;
  980. DO(der_decode_sequence(outbuf, inlen, host, 1));
  981. for (y = 0; y < n; y++) {
  982. if (types[y].used && y != (x % n)) {
  983. fprintf(stderr, "CHOICE, flag %u in trial %u was incorrectly set to one\n", y, x);
  984. return 1;
  985. }
  986. if (!types[y].used && y == (x % n)) {
  987. fprintf(stderr, "CHOICE, flag %u in trial %u was incorrectly set to zero\n", y, x);
  988. return 1;
  989. }
  990. }
  991. /* custom decode */
  992. if (child[0].type != LTC_ASN1_CUSTOM_TYPE || root->pc != LTC_ASN1_PC_PRIMITIVE) {
  993. DO(der_decode_custom_type(custbuf, custlen, root));
  994. }
  995. }
  996. ltc_mp_clear(mpinteger);
  997. return 0;
  998. }
  999. static void s_der_decode_print(const void* p, unsigned long* plen)
  1000. {
  1001. ltc_asn1_list *list;
  1002. DO(der_decode_sequence_flexi(p, plen, &list));
  1003. s_der_tests_print_flexi(list);
  1004. der_sequence_free(list);
  1005. }
  1006. static const unsigned char eckey_privc_der[] = {
  1007. 0x30, 0x81, 0xf0, 0x02, 0x01, 0x01, 0x04, 0x18, 0x96, 0x9d, 0x28, 0xf2, 0x40, 0x48, 0x19, 0x11,
  1008. 0x79, 0xb0, 0x47, 0x8e, 0x8c, 0x6b, 0x3d, 0x9b, 0xf2, 0x31, 0x16, 0x10, 0x08, 0x72, 0xb1, 0x86,
  1009. 0xa0, 0x81, 0xb2, 0x30, 0x81, 0xaf, 0x02, 0x01, 0x01, 0x30, 0x24, 0x06, 0x07, 0x2a, 0x86, 0x48,
  1010. 0xce, 0x3d, 0x01, 0x01, 0x02, 0x19, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1011. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30,
  1012. 0x4b, 0x04, 0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1013. 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x04, 0x18, 0x22, 0x12, 0x3d,
  1014. 0xc2, 0x39, 0x5a, 0x05, 0xca, 0xa7, 0x42, 0x3d, 0xae, 0xcc, 0xc9, 0x47, 0x60, 0xa7, 0xd4, 0x62,
  1015. 0x25, 0x6b, 0xd5, 0x69, 0x16, 0x03, 0x15, 0x00, 0xc4, 0x69, 0x68, 0x44, 0x35, 0xde, 0xb3, 0x78,
  1016. 0xc4, 0xb6, 0x5c, 0xa9, 0x59, 0x1e, 0x2a, 0x57, 0x63, 0x05, 0x9a, 0x2e, 0x04, 0x19, 0x02, 0x7d,
  1017. 0x29, 0x77, 0x81, 0x00, 0xc6, 0x5a, 0x1d, 0xa1, 0x78, 0x37, 0x16, 0x58, 0x8d, 0xce, 0x2b, 0x8b,
  1018. 0x4a, 0xee, 0x8e, 0x22, 0x8f, 0x18, 0x96, 0x02, 0x19, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  1019. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0x62, 0xd0, 0x31, 0xc8, 0x3f, 0x42, 0x94, 0xf6, 0x40,
  1020. 0xec, 0x13, 0x02, 0x01, 0x01, 0xa1, 0x1c, 0x03, 0x1a, 0x00, 0x02, 0x55, 0x2c, 0xb8, 0x73, 0x5c,
  1021. 0x9d, 0x98, 0xe4, 0x57, 0xfe, 0xd5, 0x96, 0x0a, 0x73, 0x8d, 0x82, 0xd7, 0xce, 0x05, 0xa9, 0x79,
  1022. 0x91, 0x5c, 0xf9
  1023. };
  1024. static const unsigned char eckey_privs_der[] = {
  1025. 0x30, 0x50, 0x02, 0x01, 0x01, 0x04, 0x14, 0x82, 0xef, 0x42, 0x0b, 0xc7, 0xe2, 0x9f, 0x3a, 0x84,
  1026. 0xe5, 0x74, 0xec, 0x9c, 0xc5, 0x10, 0x26, 0x63, 0x8d, 0xb5, 0x46, 0xa0, 0x07, 0x06, 0x05, 0x2b,
  1027. 0x81, 0x04, 0x00, 0x09, 0xa1, 0x2c, 0x03, 0x2a, 0x00, 0x04, 0xb5, 0xb1, 0x5a, 0xb0, 0x2a, 0x10,
  1028. 0xd1, 0xf5, 0x4d, 0x6a, 0x41, 0xde, 0xcd, 0x69, 0x09, 0xb3, 0x5f, 0x26, 0xb0, 0xa2, 0xaf, 0xd3,
  1029. 0x02, 0x89, 0x5e, 0xd4, 0x96, 0x5c, 0xbc, 0x2a, 0x7e, 0x75, 0x85, 0x86, 0x29, 0xb3, 0x29, 0x13,
  1030. 0x77, 0xc3
  1031. };
  1032. static void der_custom_test(void)
  1033. {
  1034. ltc_asn1_list bool_ean[1], seq1[1], custom[1];
  1035. int boolean;
  1036. unsigned long len;
  1037. unsigned char buf[1024];
  1038. unsigned char buf1[] = { 0xbf, 0xa0, 0x00, 0x04, 0x30, 0x02, 0x05, 0x00 };
  1039. unsigned char buf2[] = { 0x30, 0x08, 0xbf, 0xa0, 0x00, 0x04, 0x30, 0x02, 0x05, 0x00 };
  1040. boolean = 0x1;
  1041. LTC_SET_ASN1(bool_ean, 0, LTC_ASN1_BOOLEAN, &boolean, 1);
  1042. LTC_SET_ASN1(seq1, 0, LTC_ASN1_SEQUENCE, bool_ean, 1);
  1043. LTC_SET_ASN1_CUSTOM_CONSTRUCTED(custom, 0, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0x1000, seq1);
  1044. DO(der_length_custom_type(custom, &len, NULL));
  1045. len = sizeof(buf);
  1046. DO(der_encode_custom_type(custom, buf, &len));
  1047. s_der_decode_print(buf, &len);
  1048. boolean = 0x0;
  1049. DO(der_decode_custom_type(buf, len, custom));
  1050. DO(der_length_sequence(custom, 1, &len));
  1051. len = sizeof(buf);
  1052. DO(der_encode_sequence(custom, 1, buf, &len));
  1053. s_der_decode_print(buf, &len);
  1054. boolean = 0x0;
  1055. DO(der_decode_sequence(buf, len, custom, 1));
  1056. LTC_SET_ASN1_CUSTOM_PRIMITIVE(bool_ean, 0, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0x8000, LTC_ASN1_BOOLEAN, &boolean, 1);
  1057. DO(der_length_custom_type(bool_ean, &len, NULL));
  1058. len = sizeof(buf);
  1059. DO(der_encode_custom_type(bool_ean, buf, &len));
  1060. s_der_decode_print(buf, &len);
  1061. LTC_SET_ASN1_CUSTOM_PRIMITIVE(bool_ean, 0, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0x8000, LTC_ASN1_BOOLEAN, &boolean, 1);
  1062. DO(der_decode_custom_type(buf, len, bool_ean));
  1063. len = sizeof(buf1);
  1064. s_der_decode_print(buf1, &len);
  1065. len = sizeof(buf2);
  1066. s_der_decode_print(buf2, &len);
  1067. len = sizeof(eckey_privc_der);
  1068. s_der_decode_print(eckey_privc_der, &len);
  1069. len = sizeof(eckey_privs_der);
  1070. s_der_decode_print(eckey_privs_der, &len);
  1071. }
  1072. typedef int (*s_der_Xcode)(const void*, unsigned long, void*, unsigned long*);
  1073. typedef struct {
  1074. s_der_Xcode encode;
  1075. s_der_Xcode decode;
  1076. const void* in;
  1077. size_t in_sz;
  1078. size_t factor;
  1079. size_t type_sz;
  1080. const char* what;
  1081. } der_Xcode_t;
  1082. static void der_Xcode_run(const der_Xcode_t* x)
  1083. {
  1084. unsigned long l1, l2, sz;
  1085. void *d1, *d2;
  1086. l1 = 1;
  1087. d1 = XMALLOC(l1 * x->type_sz);
  1088. sz = (x->in_sz * x->factor)/x->type_sz;
  1089. if (x->encode(x->in, sz, d1, &l1) == CRYPT_BUFFER_OVERFLOW) {
  1090. d1 = XREALLOC(d1, l1 * x->type_sz);
  1091. }
  1092. DO(x->encode(x->in, sz, d1, &l1));
  1093. l2 = 1;
  1094. d2 = XMALLOC(l2 * x->type_sz);
  1095. while (x->decode(d1, l1, d2, &l2) == CRYPT_BUFFER_OVERFLOW) {
  1096. d2 = XREALLOC(d2, l2 * x->type_sz);
  1097. }
  1098. DO(x->decode(d1, l1, d2, &l2));
  1099. COMPARE_TESTVECTOR(d2, (l2/x->factor) * x->type_sz, x->in, x->in_sz, x->what, __LINE__);
  1100. XFREE(d2);
  1101. XFREE(d1);
  1102. }
  1103. #if defined(_MSC_VER)
  1104. #define typeof(x) x
  1105. #endif
  1106. #define DER_XCODE_X(n, b, x) { \
  1107. (s_der_Xcode)der_encode_ ## n, \
  1108. (s_der_Xcode)der_decode_ ## n, \
  1109. b, \
  1110. sizeof(b), \
  1111. x, \
  1112. sizeof(typeof(b[0])),\
  1113. #n \
  1114. }
  1115. #define DER_XCODE(n, b) DER_XCODE_X(n, b, 1)
  1116. static void der_Xcode_test(void)
  1117. {
  1118. unsigned long i;
  1119. ltc_asn1_list *list;
  1120. ltc_asn1_list ttex_neg_int[2];
  1121. unsigned char buf[128];
  1122. void* mpinteger;
  1123. const unsigned long oid[3] = { 1, 23, 42 };
  1124. const unsigned char bit_string[] = { 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1 };
  1125. const unsigned char multi_buf[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  1126. const char multi_string[] = {'l','i','b','t','o','m','c','r','y','p','t'};
  1127. const wchar_t wchar_string[] = L"libtomcrypt";
  1128. const unsigned char teletex_neg_int[] = { 0x30, 0x11, 0x14, 0x0b, 0x6c, 0x69, 0x62, 0x74,
  1129. 0x6f, 0x6d, 0x63, 0x72, 0x79, 0x70, 0x74, 0x02,
  1130. 0x02, 0xfc, 0x19 };
  1131. const der_Xcode_t xcode_tests[] =
  1132. {
  1133. DER_XCODE(bit_string, bit_string),
  1134. DER_XCODE_X(raw_bit_string, multi_buf, 8),
  1135. DER_XCODE(octet_string, multi_buf),
  1136. DER_XCODE(object_identifier, oid),
  1137. DER_XCODE(ia5_string, multi_string),
  1138. DER_XCODE(printable_string, multi_string),
  1139. DER_XCODE(utf8_string, wchar_string),
  1140. };
  1141. for (i = 0; i < LTC_ARRAY_SIZE(xcode_tests); ++i) {
  1142. der_Xcode_run(&xcode_tests[i]);
  1143. }
  1144. i = sizeof(teletex_neg_int);
  1145. DO(der_decode_sequence_flexi(teletex_neg_int, &i, &list));
  1146. s_der_tests_print_flexi(list);
  1147. if (list->child == NULL || list->child->next == NULL)
  1148. exit(EXIT_FAILURE);
  1149. ttex_neg_int[0] = *list->child->next;
  1150. i = sizeof(buf);
  1151. DO(der_encode_sequence(ttex_neg_int, 1, buf, &i));
  1152. der_sequence_free(list);
  1153. DO(ltc_mp_init(&mpinteger));
  1154. LTC_SET_ASN1(ttex_neg_int, 0, LTC_ASN1_TELETEX_STRING, buf, sizeof(buf));
  1155. LTC_SET_ASN1(ttex_neg_int, 1, LTC_ASN1_INTEGER, mpinteger, 1);
  1156. DO(der_decode_sequence(teletex_neg_int, sizeof(teletex_neg_int), ttex_neg_int, 2));
  1157. ltc_mp_clear(mpinteger);
  1158. }
  1159. #ifdef LTC_TEST_READDIR
  1160. static int s_der_decode_sequence_flexi(const void *in, unsigned long inlen, void* ctx)
  1161. {
  1162. ltc_asn1_list** list = ctx;
  1163. if (der_decode_sequence_flexi(in, &inlen, list) == CRYPT_OK) {
  1164. s_der_tests_print_flexi(*list);
  1165. der_sequence_free(*list);
  1166. }
  1167. return CRYPT_OK;
  1168. }
  1169. #endif
  1170. static void s_der_regression_test(void)
  1171. {
  1172. static const unsigned char s_broken_sequence[] = {
  1173. 0x30,0x41,0x02,0x84,0x7f,0xff,0xff,0xff,0x1e,0x41,0xb4,0x79,0xad,0x57,0x69,
  1174. 0x05,0xb9,0x60,0xfe,0x14,0xea,0xdb,0x91,0xb0,0xcc,0xf3,0x48,0x43,0xda,0xb9,
  1175. 0x16,0x17,0x3b,0xb8,0xc9,0xcd,0x02,0x1d,0x00,0xad,0xe6,0x59,0x88,0xd2,0x37,
  1176. 0xd3,0x0f,0x9e,0xf4,0x1d,0xd4,0x24,0xa4,0xe1,0xc8,0xf1,0x69,0x67,0xcf,0x33,
  1177. 0x65,0x81,0x3f,0xe8,0x78,0x62,0x36
  1178. };
  1179. static const unsigned char s_addtl_bytes[] = {
  1180. 0x30,0x45,0x02,0x21,0x00,0xb7,0xba,0xba,0xe9,0x33,0x2b,0x54,0xb8,0xa3,0xa0,0x5b,0x70,0x04,0x57,
  1181. 0x98,0x21,0xa8,0x87,0xa1,0xb2,0x14,0x65,0xf7,0xdb,0x8a,0x3d,0x49,0x1b,0x39,0xfd,0x2c,0x3f,0x02,
  1182. 0x20,0x74,0x72,0x91,0xdd,0x2f,0x3f,0x44,0xaf,0x7a,0xce,0x68,0xea,0x33,0x43,0x1d,0x6f,0x94,0xe4,
  1183. 0x18,0xc1,0x06,0xa6,0xe7,0x62,0x85,0xcd,0x59,0xf4,0x32,0x60,0xec,0xce,0x00,0x00
  1184. };
  1185. static const unsigned char issue_507[] = "\x30\x04" /* Start DER-sequence of length 4 */
  1186. "\x0c\x02\xbf\xbf" /* Start UTF8 string of actual length 2 and evaluated length 3 */
  1187. "\xaa" /* One byte padding */
  1188. "\x04\x82\xff\xff"; /* Start OCTET sequence of length 0xffff */
  1189. /* (this will include the adjacent data into the decoded certificate) */
  1190. static const unsigned char utf8_length[] = "\x0c\x02\x61\x61\x61";
  1191. wchar_t wtmp[4];
  1192. unsigned long len, outlen;
  1193. void *x, *y;
  1194. ltc_asn1_list seq[2];
  1195. ltc_asn1_list *l;
  1196. ltc_mp_init_multi(&x, &y, LTC_NULL);
  1197. LTC_SET_ASN1(seq, 0, LTC_ASN1_INTEGER, x, 1UL);
  1198. LTC_SET_ASN1(seq, 1, LTC_ASN1_INTEGER, y, 1UL);
  1199. SHOULD_FAIL(der_decode_sequence(s_broken_sequence, sizeof(s_broken_sequence), seq, 2));
  1200. ltc_mp_cleanup_multi(&y, &x, LTC_NULL);
  1201. len = sizeof(s_broken_sequence);
  1202. ltc_mp_init_multi(&x, &y, LTC_NULL);
  1203. LTC_SET_ASN1(seq, 0, LTC_ASN1_INTEGER, x, 1UL);
  1204. LTC_SET_ASN1(seq, 1, LTC_ASN1_INTEGER, y, 1UL);
  1205. SHOULD_FAIL_WITH(der_decode_sequence(s_addtl_bytes, sizeof(s_addtl_bytes), seq, 2), CRYPT_INPUT_TOO_LONG);
  1206. ltc_mp_cleanup_multi(&y, &x, LTC_NULL);
  1207. len = sizeof(s_addtl_bytes);
  1208. s_der_decode_print(s_addtl_bytes, &len);
  1209. len = sizeof(issue_507);
  1210. SHOULD_FAIL(der_decode_sequence_flexi(issue_507, &len, &l));
  1211. len = sizeof(utf8_length);
  1212. outlen = LTC_ARRAY_SIZE(wtmp);
  1213. DO(der_decode_utf8_string(utf8_length, len, wtmp, &outlen));
  1214. ENSURE(outlen == 2);
  1215. }
  1216. static void der_toolong_test(void)
  1217. {
  1218. int n, err, failed = 0;
  1219. ltc_asn1_list *list;
  1220. unsigned long len, oid[16];
  1221. unsigned char buf5[5], buf12[12], buf32[32];
  1222. static const unsigned char invalid1[] = {
  1223. 0x30,0x19, /* SEQUENCE len=25 bytes */
  1224. 0x30,0x0a, /* SEQUENCE len=10 bytes (which is wrong, should be 9) */
  1225. 0x04,0x05, /* OCTET STRING len=5 */ 0x2b,0x0e,0x03,0x02,0x1a,
  1226. 0x05,0x00, /* NULL */
  1227. 0x04,0x0c, /* OCTET STRING len=12 */ 0xf7,0xff,0x9e,0x8b,0x7b,0xb2,0xe0,0x9b,0x70,0x93,0x5a,0x5d,
  1228. };
  1229. static const unsigned char invalid2[] = {
  1230. 0x30,0x0d, /* SEQUENCE len=13 bytes*/
  1231. 0x02,0x05, /* INTEGER len=5 */ 0x00,0xb7,0xba,0xba,0xe9,
  1232. 0x02,0x04, /* INTEGER len=4 */ 0x74,0x72,0x91,0xdd,
  1233. 0x00,0x00 /* garbage after the sequence, der_decode_sequence_flexi should ignore this */
  1234. };
  1235. static const unsigned char invalid3[] = {
  1236. 0x30,0x0f, /* SEQUENCE len=15 bytes*/
  1237. 0x02,0x05, /* INTEGER len=5 */ 0x00,0xb7,0xba,0xba,0xe9,
  1238. 0x02,0x04, /* INTEGER len=4 */ 0x74,0x72,0x91,0xdd,
  1239. 0x00,0x00 /* garbage inside the sequence */
  1240. };
  1241. static const unsigned char invalid4[] = {
  1242. 0x30, 0x30,
  1243. 0x30, 0x0d,
  1244. 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
  1245. 0x05, 0x00,
  1246. 0x04, 0x20, 0x53, 0x2e, 0xaa, 0xbd, 0x95, 0x74, 0x88, 0x0d, 0xbf, 0x76, 0xb9, 0xb8, 0xcc, 0x00, 0x83, 0x2c,
  1247. 0x20, 0xa6, 0xec, 0x11, 0x3d, 0x68, 0x22, 0x99, 0x55, 0x0d, 0x7a, 0x6e, 0x0f, 0x34, 0x5e, 0x25
  1248. };
  1249. static const unsigned char invalid5[] = {
  1250. 0x30, 0x31,
  1251. 0x30, 0x0e,
  1252. 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
  1253. 0x05, 0x00,
  1254. 0x04, 0x20, 0x53, 0x2e, 0xaa, 0xbd, 0x95,0x74, 0x88, 0x0d, 0xbf, 0x76, 0xb9, 0xb8, 0xcc,0x00, 0x83, 0x2c,
  1255. 0x20, 0xa6, 0xec, 0x11, 0x3d,0x68, 0x22, 0x99, 0x55, 0x0d, 0x7a, 0x6e, 0x0f,0x34, 0x5e, 0x25
  1256. };
  1257. static const unsigned char invalid6[] = {
  1258. 0x30, 0x31,
  1259. 0x30, 0x0c,
  1260. 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
  1261. 0x05, 0x00,
  1262. 0x04, 0x20, 0x53, 0x2e, 0xaa, 0xbd, 0x95,0x74, 0x88, 0x0d, 0xbf, 0x76, 0xb9, 0xb8, 0xcc,0x00, 0x83, 0x2c,
  1263. 0x20, 0xa6, 0xec, 0x11, 0x3d,0x68, 0x22, 0x99, 0x55, 0x0d, 0x7a, 0x6e, 0x0f,0x34, 0x5e, 0x25
  1264. };
  1265. ltc_asn1_list seqsub[2], seqoid[2], seqmain[2], seqint[2];
  1266. void *int1, *int2;
  1267. LTC_SET_ASN1(seqsub, 0, LTC_ASN1_OCTET_STRING, buf5, 5);
  1268. LTC_SET_ASN1(seqsub, 1, LTC_ASN1_NULL, NULL, 0);
  1269. LTC_SET_ASN1(seqmain, 0, LTC_ASN1_SEQUENCE, seqsub, 2);
  1270. LTC_SET_ASN1(seqmain, 1, LTC_ASN1_OCTET_STRING, buf12, 12);
  1271. n = 1;
  1272. len = sizeof(invalid1);
  1273. err = der_decode_sequence_strict(invalid1, len, seqmain, 2);
  1274. if (err == CRYPT_OK) {
  1275. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence\n", n);
  1276. failed = 1;
  1277. }
  1278. len = sizeof(invalid1);
  1279. err = der_decode_sequence_flexi(invalid1, &len, &list);
  1280. if (err == CRYPT_OK) {
  1281. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence_flexi\n", n);
  1282. failed = 1;
  1283. der_sequence_free(list);
  1284. }
  1285. ltc_mp_init_multi(&int1, &int2, LTC_NULL);
  1286. LTC_SET_ASN1(seqint, 0, LTC_ASN1_INTEGER, int1, 1);
  1287. LTC_SET_ASN1(seqint, 1, LTC_ASN1_INTEGER, int2, 1);
  1288. n++;
  1289. len = sizeof(invalid2);
  1290. err = der_decode_sequence_strict(invalid2, len, seqint, 2);
  1291. if (err == CRYPT_OK) {
  1292. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence\n", n);
  1293. failed = 1;
  1294. }
  1295. len = sizeof(invalid2);
  1296. err = der_decode_sequence_flexi(invalid2, &len, &list);
  1297. /* flexi parser should decode this; however returning "len" shorter than "sizeof(invalid2)" */
  1298. if (err != CRYPT_OK || len != 15) {
  1299. fprintf(stderr,"der_decode_sequence_flexi failed, err=%d (expected 0) len=%lu (expected 15)\n", err, len);
  1300. failed = 1;
  1301. }
  1302. if (err == CRYPT_OK)
  1303. der_sequence_free(list);
  1304. n++;
  1305. len = sizeof(invalid3);
  1306. err = der_decode_sequence_strict(invalid3, len, seqint, 2);
  1307. if (err == CRYPT_OK) {
  1308. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence\n", n);
  1309. failed = 1;
  1310. }
  1311. len = sizeof(invalid3);
  1312. err = der_decode_sequence_flexi(invalid3, &len, &list);
  1313. if (err == CRYPT_OK) {
  1314. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence_flexi\n", n);
  1315. failed = 1;
  1316. der_sequence_free(list);
  1317. }
  1318. ltc_mp_deinit_multi(int1, int2, LTC_NULL);
  1319. LTC_SET_ASN1(seqoid, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, LTC_ARRAY_SIZE(oid));
  1320. LTC_SET_ASN1(seqoid, 1, LTC_ASN1_NULL, NULL, 0);
  1321. LTC_SET_ASN1(seqmain, 0, LTC_ASN1_SEQUENCE, seqoid, 2);
  1322. LTC_SET_ASN1(seqmain, 1, LTC_ASN1_OCTET_STRING, buf32, 32);
  1323. n++;
  1324. len = sizeof(invalid4);
  1325. err = der_decode_sequence_strict(invalid4, len, seqmain, 2);
  1326. if (err == CRYPT_OK) {
  1327. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence\n", n);
  1328. failed = 1;
  1329. }
  1330. len = sizeof(invalid4);
  1331. err = der_decode_sequence_flexi(invalid4, &len, &list);
  1332. if (err == CRYPT_OK) {
  1333. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence_flexi\n", n);
  1334. failed = 1;
  1335. der_sequence_free(list);
  1336. }
  1337. n++;
  1338. len = sizeof(invalid5);
  1339. err = der_decode_sequence_strict(invalid5, len, seqmain, 2);
  1340. if (err == CRYPT_OK) {
  1341. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence\n", n);
  1342. failed = 1;
  1343. }
  1344. len = sizeof(invalid5);
  1345. err = der_decode_sequence_flexi(invalid5, &len, &list);
  1346. if (err == CRYPT_OK) {
  1347. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence_flexi\n", n);
  1348. failed = 1;
  1349. der_sequence_free(list);
  1350. }
  1351. n++;
  1352. len = sizeof(invalid6);
  1353. err = der_decode_sequence_strict(invalid6, len, seqmain, 2);
  1354. if (err == CRYPT_OK) {
  1355. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence\n", n);
  1356. failed = 1;
  1357. }
  1358. len = sizeof(invalid6);
  1359. err = der_decode_sequence_flexi(invalid6, &len, &list);
  1360. if (err == CRYPT_OK) {
  1361. fprintf(stderr,"Sequence invalid%d accepted by der_decode_sequence_flexi\n", n);
  1362. failed = 1;
  1363. der_sequence_free(list);
  1364. }
  1365. if (failed) exit(EXIT_FAILURE);
  1366. }
  1367. static void s_der_recursion_limit(void)
  1368. {
  1369. unsigned int n, m;
  1370. unsigned long integer = 123, s;
  1371. ltc_asn1_list seqs[LTC_DER_MAX_RECURSION + 2], dummy[1], *flexi;
  1372. unsigned char buf[2048];
  1373. for (m = 0; m < 3; ++m) {
  1374. LTC_SET_ASN1(dummy, 0, LTC_ASN1_SHORT_INTEGER, &integer, 1);
  1375. LTC_SET_ASN1(seqs, LTC_DER_MAX_RECURSION + 1, LTC_ASN1_SEQUENCE, dummy, 1);
  1376. for (n = m; n < LTC_DER_MAX_RECURSION + 1; ++n) {
  1377. LTC_SET_ASN1(seqs, LTC_DER_MAX_RECURSION - n, LTC_ASN1_SEQUENCE, &seqs[LTC_DER_MAX_RECURSION - n + 1], 1);
  1378. }
  1379. s = sizeof(buf);
  1380. DO(der_encode_sequence(&seqs[m], 1, buf, &s));
  1381. DO(der_decode_sequence(buf, s, &seqs[m], 1));
  1382. if (m < 2) {
  1383. SHOULD_FAIL(der_decode_sequence_flexi(buf, &s, &flexi));
  1384. }
  1385. else {
  1386. DO(der_decode_sequence_flexi(buf, &s, &flexi));
  1387. der_free_sequence_flexi(flexi);
  1388. }
  1389. }
  1390. }
  1391. int der_test(void)
  1392. {
  1393. unsigned long x, y, z, zz, oid[2][32];
  1394. unsigned char buf[3][2048];
  1395. void *a, *b, *c, *d, *e, *f, *g;
  1396. static const unsigned char rsa_oid_der[] = { 0x06, 0x06, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d };
  1397. static const unsigned long rsa_oid[] = { 1, 2, 840, 113549 };
  1398. static const unsigned char rsa_ia5[] = "[email protected]";
  1399. static const unsigned char rsa_ia5_der[] = { 0x16, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x31,
  1400. 0x40, 0x72, 0x73, 0x61, 0x2e, 0x63, 0x6f, 0x6d };
  1401. unsigned long rsa_ia5_len = XSTRLEN((char*)rsa_ia5);
  1402. static const unsigned char rsa_printable[] = "Test User 1";
  1403. static const unsigned char rsa_printable_der[] = { 0x13, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55,
  1404. 0x73, 0x65, 0x72, 0x20, 0x31 };
  1405. unsigned long rsa_printable_len = XSTRLEN((char*)rsa_printable);
  1406. static const ltc_utctime rsa_time1 = { 91, 5, 6, 16, 45, 40, 1, 7, 0 };
  1407. static const ltc_utctime rsa_time2 = { 91, 5, 6, 23, 45, 40, 0, 0, 0 };
  1408. ltc_utctime tmp_time;
  1409. static const unsigned char rsa_time1_der[] = { 0x17, 0x11, 0x39, 0x31, 0x30, 0x35, 0x30, 0x36, 0x31, 0x36, 0x34, 0x35, 0x34, 0x30, 0x2D, 0x30, 0x37, 0x30, 0x30 };
  1410. static const unsigned char rsa_time2_der[] = { 0x17, 0x0d, 0x39, 0x31, 0x30, 0x35, 0x30, 0x36, 0x32, 0x33, 0x34, 0x35, 0x34, 0x30, 0x5a };
  1411. static const wchar_t utf8_1[] = { 0x0041, 0x2262, 0x0391, 0x002E };
  1412. static const unsigned char utf8_1_der[] = { 0x0C, 0x07, 0x41, 0xE2, 0x89, 0xA2, 0xCE, 0x91, 0x2E };
  1413. static const wchar_t utf8_2[] = { 0xD55C, 0xAD6D, 0xC5B4 };
  1414. static const unsigned char utf8_2_der[] = { 0x0C, 0x09, 0xED, 0x95, 0x9C, 0xEA, 0xB5, 0xAD, 0xEC, 0x96, 0xB4 };
  1415. static const wchar_t utf8_3[] = { 0x05E9, 0x05DC, 0x05D5, 0x05DD };
  1416. static const unsigned char utf8_3_der[] = { 0x0C, 0x08, 0xD7, 0xA9, 0xD7, 0x9C, 0xD7, 0x95, 0xD7, 0x9D };
  1417. unsigned char utf8_buf[32];
  1418. wchar_t utf8_out[32];
  1419. #ifdef LTC_TEST_READDIR
  1420. ltc_asn1_list *list;
  1421. #endif
  1422. if (ltc_mp.name == NULL) return CRYPT_NOP;
  1423. s_der_recursion_limit();
  1424. der_Xcode_test();
  1425. #ifdef LTC_TEST_READDIR
  1426. DO(test_process_dir("tests/asn1", &list, s_der_decode_sequence_flexi, NULL, NULL, "DER ASN.1 special cases"));
  1427. #endif
  1428. der_custom_test();
  1429. s_der_regression_test();
  1430. der_toolong_test();
  1431. der_cacert_test();
  1432. s_der_oid_test();
  1433. y = 0xffffff00;
  1434. #if ULONG_MAX == ULLONG_MAX
  1435. y <<= 32;
  1436. #endif
  1437. while (y != 0) {
  1438. /* we have to modify x to be larger than the encoded
  1439. * length as der_decode_asn1_length() checks also if
  1440. * the encoded length is reasonable in regards to the
  1441. * available buffer size.
  1442. */
  1443. x = sizeof(buf[0]);
  1444. DO(der_encode_asn1_length(y, buf[0], &x));
  1445. x = y + x;
  1446. DO(der_decode_asn1_length(buf[0], &x, &z));
  1447. if (y != z) {
  1448. fprintf(stderr, "Failed to en- or decode length correctly! %lu != %lu\n", y, z);
  1449. return 1;
  1450. }
  1451. y >>= 3;
  1452. }
  1453. DO(ltc_mp_init_multi(&a, &b, &c, &d, &e, &f, &g, LTC_NULL));
  1454. for (zz = 0; zz < 16; zz++) {
  1455. #ifdef USE_TFM
  1456. for (z = 0; z < 256; z++) {
  1457. #else
  1458. for (z = 0; z < 1024; z++) {
  1459. #endif
  1460. ENSURE(yarrow_read(buf[0], z, &yarrow_prng) == z);
  1461. DO(ltc_mp_read_unsigned_bin(a, buf[0], z));
  1462. /* if (ltc_mp_iszero(a) == LTC_MP_NO) { a.sign = buf[0][0] & 1 ? LTC_MP_ZPOS : LTC_MP_NEG; } */
  1463. x = sizeof(buf[0]);
  1464. DO(der_encode_integer(a, buf[0], &x));
  1465. DO(der_length_integer(a, &y));
  1466. if (y != x) { fprintf(stderr, "DER INTEGER size mismatch %lu != %lu\n", y, x); return 1; }
  1467. ltc_mp_set_int(b, 0);
  1468. DO(der_decode_integer(buf[0], y, b));
  1469. if (y != x || ltc_mp_cmp(a, b) != LTC_MP_EQ) {
  1470. fprintf(stderr, "%lu: %lu vs %lu\n", z, x, y);
  1471. ltc_mp_deinit_multi(a, b, c, d, e, f, g, LTC_NULL);
  1472. return 1;
  1473. }
  1474. }
  1475. }
  1476. /* test short integer */
  1477. for (zz = 0; zz < 256; zz++) {
  1478. for (z = 1; z < 4; z++) {
  1479. ENSURE(yarrow_read(buf[2], z, &yarrow_prng) == z);
  1480. /* encode with normal */
  1481. DO(ltc_mp_read_unsigned_bin(a, buf[2], z));
  1482. x = sizeof(buf[0]);
  1483. DO(der_encode_integer(a, buf[0], &x));
  1484. /* encode with short */
  1485. y = sizeof(buf[1]);
  1486. DO(der_encode_short_integer(ltc_mp_get_int(a), buf[1], &y));
  1487. if (x != y || memcmp(buf[0], buf[1], x)) {
  1488. fprintf(stderr, "DER INTEGER short encoding failed, %lu, %lu, 0x%lX\n", x, y, ltc_mp_get_int(a));
  1489. for (zz = 0; zz < z; zz++) fprintf(stderr, "%02x ", buf[2][zz]);
  1490. fprintf(stderr, "\n");
  1491. for (z = 0; z < x; z++) fprintf(stderr, "%02x ", buf[0][z]);
  1492. fprintf(stderr, "\n");
  1493. for (z = 0; z < y; z++) fprintf(stderr, "%02x ", buf[1][z]);
  1494. fprintf(stderr, "\n");
  1495. ltc_mp_deinit_multi(a, b, c, d, e, f, g, LTC_NULL);
  1496. return 1;
  1497. }
  1498. /* decode it */
  1499. x = 0;
  1500. DO(der_decode_short_integer(buf[1], y, &x));
  1501. if (x != ltc_mp_get_int(a)) {
  1502. fprintf(stderr, "DER INTEGER short decoding failed, %lu, %lu\n", x, ltc_mp_get_int(a));
  1503. ltc_mp_deinit_multi(a, b, c, d, e, f, g, LTC_NULL);
  1504. return 1;
  1505. }
  1506. }
  1507. }
  1508. ltc_mp_deinit_multi(a, b, c, d, e, f, g, LTC_NULL);
  1509. /* Test bit string */
  1510. for (zz = 1; zz < 1536; zz++) {
  1511. ENSURE(yarrow_read(buf[0], zz, &yarrow_prng) == zz);
  1512. for (z = 0; z < zz; z++) {
  1513. buf[0][z] &= 0x01;
  1514. }
  1515. x = sizeof(buf[1]);
  1516. DO(der_encode_bit_string(buf[0], zz, buf[1], &x));
  1517. DO(der_length_bit_string(zz, &y));
  1518. if (y != x) {
  1519. fprintf(stderr, "\nDER BIT STRING length of encoded not match expected : %lu, %lu, %lu\n", z, x, y);
  1520. return 1;
  1521. }
  1522. y = sizeof(buf[2]);
  1523. DO(der_decode_bit_string(buf[1], x, buf[2], &y));
  1524. if (y != zz || memcmp(buf[0], buf[2], zz)) {
  1525. fprintf(stderr, "%lu, %lu, %d\n", y, zz, memcmp(buf[0], buf[2], zz));
  1526. return 1;
  1527. }
  1528. }
  1529. /* Test octet string */
  1530. for (zz = 1; zz < 1536; zz++) {
  1531. ENSURE(yarrow_read(buf[0], zz, &yarrow_prng) == zz);
  1532. x = sizeof(buf[1]);
  1533. DO(der_encode_octet_string(buf[0], zz, buf[1], &x));
  1534. DO(der_length_octet_string(zz, &y));
  1535. if (y != x) {
  1536. fprintf(stderr, "\nDER OCTET STRING length of encoded not match expected : %lu, %lu, %lu\n", z, x, y);
  1537. return 1;
  1538. }
  1539. y = sizeof(buf[2]);
  1540. DO(der_decode_octet_string(buf[1], x, buf[2], &y));
  1541. if (y != zz || memcmp(buf[0], buf[2], zz)) {
  1542. fprintf(stderr, "%lu, %lu, %d\n", y, zz, memcmp(buf[0], buf[2], zz));
  1543. return 1;
  1544. }
  1545. }
  1546. /* test OID */
  1547. x = sizeof(buf[0]);
  1548. DO(der_encode_object_identifier((unsigned long*)rsa_oid, LTC_ARRAY_SIZE(rsa_oid), buf[0], &x));
  1549. if (x != sizeof(rsa_oid_der) || memcmp(rsa_oid_der, buf[0], x)) {
  1550. fprintf(stderr, "rsa_oid_der encode failed to match, %lu, ", x);
  1551. for (y = 0; y < x; y++) fprintf(stderr, "%02x ", buf[0][y]);
  1552. fprintf(stderr, "\n");
  1553. return 1;
  1554. }
  1555. y = LTC_ARRAY_SIZE(oid[0]);
  1556. DO(der_decode_object_identifier(buf[0], x, oid[0], &y));
  1557. if (y != LTC_ARRAY_SIZE(rsa_oid) || memcmp(rsa_oid, oid[0], sizeof(rsa_oid))) {
  1558. fprintf(stderr, "rsa_oid_der decode failed to match, %lu, ", y);
  1559. for (z = 0; z < y; z++) fprintf(stderr, "%lu ", oid[0][z]);
  1560. fprintf(stderr, "\n");
  1561. return 1;
  1562. }
  1563. /* do random strings */
  1564. for (zz = 0; zz < 5000; zz++) {
  1565. /* pick a random number of words */
  1566. ENSURE(yarrow_read(buf[0], 4, &yarrow_prng) == 4);
  1567. LOAD32L(z, buf[0]);
  1568. z = 2 + (z % (LTC_ARRAY_SIZE(oid[0]) - 2));
  1569. /* fill them in */
  1570. oid[0][0] = buf[0][0] % 3;
  1571. oid[0][1] = buf[0][1] % 40;
  1572. for (y = 2; y < z; y++) {
  1573. ENSURE(yarrow_read(buf[0], 4, &yarrow_prng) == 4);
  1574. LOAD32L(oid[0][y], buf[0]);
  1575. }
  1576. /* encode it */
  1577. x = sizeof(buf[0]);
  1578. DO(der_encode_object_identifier(oid[0], z, buf[0], &x));
  1579. DO(der_length_object_identifier(oid[0], z, &y));
  1580. if (x != y) {
  1581. fprintf(stderr, "Random OID %lu test failed, length mismatch: %lu, %lu\n", z, x, y);
  1582. for (x = 0; x < z; x++) fprintf(stderr, "%lu\n", oid[0][x]);
  1583. return 1;
  1584. }
  1585. /* decode it */
  1586. y = LTC_ARRAY_SIZE(oid[0]);
  1587. DO(der_decode_object_identifier(buf[0], x, oid[1], &y));
  1588. if (y != z) {
  1589. fprintf(stderr, "Random OID %lu test failed, decode length mismatch: %lu, %lu\n", z, x, y);
  1590. return 1;
  1591. }
  1592. if (memcmp(oid[0], oid[1], sizeof(oid[0][0]) * z)) {
  1593. fprintf(stderr, "Random OID %lu test failed, decoded values wrong\n", z);
  1594. for (x = 0; x < z; x++) fprintf(stderr, "%lu\n", oid[0][x]);
  1595. fprintf(stderr, "\n\n Got \n\n");
  1596. for (x = 0; x < z; x++) fprintf(stderr, "%lu\n", oid[1][x]);
  1597. return 1;
  1598. }
  1599. }
  1600. /* IA5 string */
  1601. x = sizeof(buf[0]);
  1602. DO(der_encode_ia5_string(rsa_ia5, rsa_ia5_len, buf[0], &x));
  1603. if (x != sizeof(rsa_ia5_der) || memcmp(buf[0], rsa_ia5_der, x)) {
  1604. fprintf(stderr, "IA5 encode failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_ia5_der));
  1605. return 1;
  1606. }
  1607. DO(der_length_ia5_string(rsa_ia5, rsa_ia5_len, &y));
  1608. if (y != x) {
  1609. fprintf(stderr, "IA5 length failed to match: %lu, %lu\n", x, y);
  1610. return 1;
  1611. }
  1612. y = sizeof(buf[1]);
  1613. DO(der_decode_ia5_string(buf[0], x, buf[1], &y));
  1614. if (y != rsa_ia5_len || memcmp(buf[1], rsa_ia5, rsa_ia5_len)) {
  1615. fprintf(stderr, "DER IA5 failed test vector\n");
  1616. return 1;
  1617. }
  1618. /* Printable string */
  1619. x = sizeof(buf[0]);
  1620. DO(der_encode_printable_string(rsa_printable, rsa_printable_len, buf[0], &x));
  1621. if (x != sizeof(rsa_printable_der) || memcmp(buf[0], rsa_printable_der, x)) {
  1622. fprintf(stderr, "PRINTABLE encode failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_printable_der));
  1623. return 1;
  1624. }
  1625. DO(der_length_printable_string(rsa_printable, rsa_printable_len, &y));
  1626. if (y != x) {
  1627. fprintf(stderr, "printable length failed to match: %lu, %lu\n", x, y);
  1628. return 1;
  1629. }
  1630. y = sizeof(buf[1]);
  1631. DO(der_decode_printable_string(buf[0], x, buf[1], &y));
  1632. if (y != rsa_printable_len || memcmp(buf[1], rsa_printable, rsa_printable_len)) {
  1633. fprintf(stderr, "DER printable failed test vector\n");
  1634. return 1;
  1635. }
  1636. /* Test UTC time */
  1637. x = sizeof(buf[0]);
  1638. DO(der_encode_utctime((ltc_utctime*)&rsa_time1, buf[0], &x));
  1639. if (x != sizeof(rsa_time1_der) || memcmp(buf[0], rsa_time1_der, x)) {
  1640. fprintf(stderr, "UTCTIME encode of rsa_time1 failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_time1_der));
  1641. fprintf(stderr, "\n\n");
  1642. for (y = 0; y < x; y++) fprintf(stderr, "%02x ", buf[0][y]);
  1643. fprintf(stderr, "\n");
  1644. return 1;
  1645. }
  1646. DO(der_length_utctime((ltc_utctime*)&rsa_time1, &y));
  1647. if (y != x) {
  1648. fprintf(stderr, "UTCTIME length failed to match for rsa_time1: %lu, %lu\n", x, y);
  1649. return 1;
  1650. }
  1651. DO(der_decode_utctime(buf[0], &y, &tmp_time));
  1652. if (y != x || memcmp(&rsa_time1, &tmp_time, sizeof(ltc_utctime))) {
  1653. fprintf(stderr, "UTCTIME decode failed for rsa_time1: %lu %lu\n", x, y);
  1654. fprintf(stderr, "\n\n%u %u %u %u %u %u %u %u %u\n\n",
  1655. tmp_time.YY,
  1656. tmp_time.MM,
  1657. tmp_time.DD,
  1658. tmp_time.hh,
  1659. tmp_time.mm,
  1660. tmp_time.ss,
  1661. tmp_time.off_dir,
  1662. tmp_time.off_mm,
  1663. tmp_time.off_hh);
  1664. return 1;
  1665. }
  1666. x = sizeof(buf[0]);
  1667. DO(der_encode_utctime((ltc_utctime*)&rsa_time2, buf[0], &x));
  1668. if (x != sizeof(rsa_time2_der) || memcmp(buf[0], rsa_time2_der, x)) {
  1669. fprintf(stderr, "UTCTIME encode of rsa_time2 failed: %lu, %lu\n", x, (unsigned long)sizeof(rsa_time1_der));
  1670. fprintf(stderr, "\n\n");
  1671. for (y = 0; y < x; y++) fprintf(stderr, "%02x ", buf[0][y]);
  1672. fprintf(stderr, "\n");
  1673. return 1;
  1674. }
  1675. DO(der_length_utctime((ltc_utctime*)&rsa_time2, &y));
  1676. if (y != x) {
  1677. fprintf(stderr, "UTCTIME length failed to match for rsa_time2: %lu, %lu\n", x, y);
  1678. return 1;
  1679. }
  1680. DO(der_decode_utctime(buf[0], &y, &tmp_time));
  1681. if (y != x || memcmp(&rsa_time2, &tmp_time, sizeof(ltc_utctime))) {
  1682. fprintf(stderr, "UTCTIME decode failed for rsa_time2: %lu %lu\n", x, y);
  1683. fprintf(stderr, "\n\n%u %u %u %u %u %u %u %u %u\n\n",
  1684. tmp_time.YY,
  1685. tmp_time.MM,
  1686. tmp_time.DD,
  1687. tmp_time.hh,
  1688. tmp_time.mm,
  1689. tmp_time.ss,
  1690. tmp_time.off_dir,
  1691. tmp_time.off_mm,
  1692. tmp_time.off_hh);
  1693. return 1;
  1694. }
  1695. /* UTF 8 */
  1696. /* encode it */
  1697. x = sizeof(utf8_buf);
  1698. DO(der_encode_utf8_string(utf8_1, sizeof(utf8_1) / sizeof(utf8_1[0]), utf8_buf, &x));
  1699. DO(der_length_utf8_string(utf8_1, sizeof(utf8_1) / sizeof(utf8_1[0]), &y));
  1700. if (x != sizeof(utf8_1_der) || memcmp(utf8_buf, utf8_1_der, x) || x != y) {
  1701. fprintf(stderr, "DER UTF8_1 encoded to %lu bytes\n", x);
  1702. for (y = 0; y < x; y++) fprintf(stderr, "%02x ", (unsigned)utf8_buf[y]);
  1703. fprintf(stderr, "\n");
  1704. return 1;
  1705. }
  1706. /* decode it */
  1707. y = sizeof(utf8_out) / sizeof(utf8_out[0]);
  1708. DO(der_decode_utf8_string(utf8_buf, x, utf8_out, &y));
  1709. if (y != (sizeof(utf8_1) / sizeof(utf8_1[0])) || memcmp(utf8_1, utf8_out, y * sizeof(wchar_t))) {
  1710. fprintf(stderr, "DER UTF8_1 decoded to %lu wchar_t\n", y);
  1711. for (x = 0; x < y; x++) fprintf(stderr, "%04lx ", (unsigned long)utf8_out[x]);
  1712. fprintf(stderr, "\n");
  1713. return 1;
  1714. }
  1715. /* encode it */
  1716. x = sizeof(utf8_buf);
  1717. DO(der_encode_utf8_string(utf8_2, sizeof(utf8_2) / sizeof(utf8_2[0]), utf8_buf, &x));
  1718. if (x != sizeof(utf8_2_der) || memcmp(utf8_buf, utf8_2_der, x)) {
  1719. fprintf(stderr, "DER UTF8_2 encoded to %lu bytes\n", x);
  1720. for (y = 0; y < x; y++) fprintf(stderr, "%02x ", (unsigned)utf8_buf[y]);
  1721. fprintf(stderr, "\n");
  1722. return 1;
  1723. }
  1724. /* decode it */
  1725. y = sizeof(utf8_out) / sizeof(utf8_out[0]);
  1726. DO(der_decode_utf8_string(utf8_buf, x, utf8_out, &y));
  1727. if (y != (sizeof(utf8_2) / sizeof(utf8_2[0])) || memcmp(utf8_2, utf8_out, y * sizeof(wchar_t))) {
  1728. fprintf(stderr, "DER UTF8_2 decoded to %lu wchar_t\n", y);
  1729. for (x = 0; x < y; x++) fprintf(stderr, "%04lx ", (unsigned long)utf8_out[x]);
  1730. fprintf(stderr, "\n");
  1731. return 1;
  1732. }
  1733. /* encode it */
  1734. x = sizeof(utf8_buf);
  1735. DO(der_encode_utf8_string(utf8_3, sizeof(utf8_3) / sizeof(utf8_3[0]), utf8_buf, &x));
  1736. if (x != sizeof(utf8_3_der) || memcmp(utf8_buf, utf8_3_der, x)) {
  1737. fprintf(stderr, "DER UTF8_3 encoded to %lu bytes\n", x);
  1738. for (y = 0; y < x; y++) fprintf(stderr, "%02x ", (unsigned)utf8_buf[y]);
  1739. fprintf(stderr, "\n");
  1740. return 1;
  1741. }
  1742. /* decode it */
  1743. y = sizeof(utf8_out) / sizeof(utf8_out[0]);
  1744. DO(der_decode_utf8_string(utf8_buf, x, utf8_out, &y));
  1745. if (y != (sizeof(utf8_3) / sizeof(utf8_3[0])) || memcmp(utf8_3, utf8_out, y * sizeof(wchar_t))) {
  1746. fprintf(stderr, "DER UTF8_3 decoded to %lu wchar_t\n", y);
  1747. for (x = 0; x < y; x++) fprintf(stderr, "%04lx ", (unsigned long)utf8_out[x]);
  1748. fprintf(stderr, "\n");
  1749. return 1;
  1750. }
  1751. der_set_test();
  1752. der_flexi_test();
  1753. return der_choice_n_custom_test();
  1754. }
  1755. #endif