CTTestUtils.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "CTTestUtils.h"
  6. #include <stdint.h>
  7. #include <iomanip>
  8. #include "CTSerialization.h"
  9. #include "gtest/gtest.h"
  10. #include "mozilla/Assertions.h"
  11. #include "mozilla/Move.h"
  12. #include "mozilla/Vector.h"
  13. #include "pkix/Input.h"
  14. #include "pkix/pkix.h"
  15. #include "pkix/pkixnss.h"
  16. #include "pkix/pkixtypes.h"
  17. #include "pkix/Result.h"
  18. #include "pkixcheck.h"
  19. #include "pkixutil.h"
  20. #include "SignedCertificateTimestamp.h"
  21. #include "SignedTreeHead.h"
  22. namespace mozilla { namespace ct {
  23. using namespace mozilla::pkix;
  24. // The following test vectors are from the CT test data repository at
  25. // https://github.com/google/certificate-transparency/tree/master/test/testdata
  26. // test-cert.pem
  27. const char kDefaultDerCert[] =
  28. "308202ca30820233a003020102020106300d06092a864886f70d01010505003055310b3009"
  29. "06035504061302474231243022060355040a131b4365727469666963617465205472616e73"
  30. "706172656e6379204341310e300c0603550408130557616c65733110300e06035504071307"
  31. "4572772057656e301e170d3132303630313030303030305a170d3232303630313030303030"
  32. "305a3052310b30090603550406130247423121301f060355040a1318436572746966696361"
  33. "7465205472616e73706172656e6379310e300c0603550408130557616c65733110300e0603"
  34. "55040713074572772057656e30819f300d06092a864886f70d010101050003818d00308189"
  35. "02818100b1fa37936111f8792da2081c3fe41925008531dc7f2c657bd9e1de4704160b4c9f"
  36. "19d54ada4470404c1c51341b8f1f7538dddd28d9aca48369fc5646ddcc7617f8168aae5b41"
  37. "d43331fca2dadfc804d57208949061f9eef902ca47ce88c644e000f06eeeccabdc9dd2f68a"
  38. "22ccb09dc76e0dbc73527765b1a37a8c676253dcc10203010001a381ac3081a9301d060355"
  39. "1d0e041604146a0d982a3b62c44b6d2ef4e9bb7a01aa9cb798e2307d0603551d2304763074"
  40. "80145f9d880dc873e654d4f80dd8e6b0c124b447c355a159a4573055310b30090603550406"
  41. "1302474231243022060355040a131b4365727469666963617465205472616e73706172656e"
  42. "6379204341310e300c0603550408130557616c65733110300e060355040713074572772057"
  43. "656e82010030090603551d1304023000300d06092a864886f70d010105050003818100171c"
  44. "d84aac414a9a030f22aac8f688b081b2709b848b4e5511406cd707fed028597a9faefc2eee"
  45. "2978d633aaac14ed3235197da87e0f71b8875f1ac9e78b281749ddedd007e3ecf50645f8cb"
  46. "f667256cd6a1647b5e13203bb8582de7d6696f656d1c60b95f456b7fcf338571908f1c6972"
  47. "7d24c4fccd249295795814d1dac0e6";
  48. // key hash of test-cert.pem's issuer (ca-cert.pem)
  49. const char kDefaultIssuerKeyHash[] =
  50. "02adddca08b8bf9861f035940c940156d8350fdff899a6239c6bd77255b8f8fc";
  51. const char kDefaultDerTbsCert[] =
  52. "30820233a003020102020107300d06092a864886f70d01010505003055310b300906035504"
  53. "061302474231243022060355040a131b4365727469666963617465205472616e7370617265"
  54. "6e6379204341310e300c0603550408130557616c65733110300e0603550407130745727720"
  55. "57656e301e170d3132303630313030303030305a170d3232303630313030303030305a3052"
  56. "310b30090603550406130247423121301f060355040a131843657274696669636174652054"
  57. "72616e73706172656e6379310e300c0603550408130557616c65733110300e060355040713"
  58. "074572772057656e30819f300d06092a864886f70d010101050003818d0030818902818100"
  59. "beef98e7c26877ae385f75325a0c1d329bedf18faaf4d796bf047eb7e1ce15c95ba2f80ee4"
  60. "58bd7db86f8a4b252191a79bd700c38e9c0389b45cd4dc9a120ab21e0cb41cd0e72805a410"
  61. "cd9c5bdb5d4927726daf1710f60187377ea25b1a1e39eed0b88119dc154dc68f7da8e30caf"
  62. "158a33e6c9509f4a05b01409ff5dd87eb50203010001a381ac3081a9301d0603551d0e0416"
  63. "04142031541af25c05ffd8658b6843794f5e9036f7b4307d0603551d230476307480145f9d"
  64. "880dc873e654d4f80dd8e6b0c124b447c355a159a4573055310b3009060355040613024742"
  65. "31243022060355040a131b4365727469666963617465205472616e73706172656e63792043"
  66. "41310e300c0603550408130557616c65733110300e060355040713074572772057656e8201"
  67. "0030090603551d1304023000";
  68. // DigitallySigned of test-cert.proof
  69. const char kTestDigitallySigned[] =
  70. "0403004730450220606e10ae5c2d5a1b0aed49dc4937f48de71a4e9784e9c208dfbfe9ef53"
  71. "6cf7f2022100beb29c72d7d06d61d06bdb38a069469aa86fe12e18bb7cc45689a2c0187ef5"
  72. "a5";
  73. // test-cert.proof
  74. const char kTestSignedCertificateTimestamp[] =
  75. "00df1c2ec11500945247a96168325ddc5c7959e8f7c6d388fc002e0bbd3f74d7640000013d"
  76. "db27ded900000403004730450220606e10ae5c2d5a1b0aed49dc4937f48de71a4e9784e9c2"
  77. "08dfbfe9ef536cf7f2022100beb29c72d7d06d61d06bdb38a069469aa86fe12e18bb7cc456"
  78. "89a2c0187ef5a5";
  79. // ct-server-key-public.pem
  80. const char kEcP256PublicKey[] =
  81. "3059301306072a8648ce3d020106082a8648ce3d0301070342000499783cb14533c0161a5a"
  82. "b45bf95d08a29cd0ea8dd4c84274e2be59ad15c676960cf0afa1074a57ac644b23479e5b3f"
  83. "b7b245eb4b420ef370210371a944beaceb";
  84. // key id (sha256) of ct-server-key-public.pem
  85. const char kTestKeyId[] =
  86. "df1c2ec11500945247a96168325ddc5c7959e8f7c6d388fc002e0bbd3f74d764";
  87. // signature field of DigitallySigned from test-cert.proof
  88. const char kTestSCTSignatureData[] =
  89. "30450220606e10ae5c2d5a1b0aed49dc4937f48de71a4e9784e9c208dfbfe9ef536cf7f202"
  90. "2100beb29c72d7d06d61d06bdb38a069469aa86fe12e18bb7cc45689a2c0187ef5a5";
  91. // signature field of DigitallySigned from test-embedded-pre-cert.proof
  92. const char kTestSCTPrecertSignatureData[] =
  93. "30450220482f6751af35dba65436be1fd6640f3dbf9a41429495924530288fa3e5e23e0602"
  94. "2100e4edc0db3ac572b1e2f5e8ab6a680653987dcf41027dfeffa105519d89edbf08";
  95. // For the sample STH
  96. const char kSampleSTHSHA256RootHash[] =
  97. "726467216167397babca293dca398e4ce6b621b18b9bc42f30c900d1f92ac1e4";
  98. const char kSampleSTHTreeHeadSignature[] =
  99. "0403004730450220365a91a2a88f2b9332f41d8959fa7086da7e6d634b7b089bc9da066426"
  100. "6c7a20022100e38464f3c0fd066257b982074f7ac87655e0c8f714768a050b4be9a7b441cb"
  101. "d3";
  102. const size_t kSampleSTHTreeSize = 21u;
  103. const uint64_t kSampleSTHTimestamp = 1396877277237u;
  104. // test-embedded-cert.pem
  105. const char kTestEmbeddedCertData[] =
  106. "30820359308202c2a003020102020107300d06092a864886f70d01010505"
  107. "003055310b300906035504061302474231243022060355040a131b436572"
  108. "7469666963617465205472616e73706172656e6379204341310e300c0603"
  109. "550408130557616c65733110300e060355040713074572772057656e301e"
  110. "170d3132303630313030303030305a170d3232303630313030303030305a"
  111. "3052310b30090603550406130247423121301f060355040a131843657274"
  112. "69666963617465205472616e73706172656e6379310e300c060355040813"
  113. "0557616c65733110300e060355040713074572772057656e30819f300d06"
  114. "092a864886f70d010101050003818d0030818902818100beef98e7c26877"
  115. "ae385f75325a0c1d329bedf18faaf4d796bf047eb7e1ce15c95ba2f80ee4"
  116. "58bd7db86f8a4b252191a79bd700c38e9c0389b45cd4dc9a120ab21e0cb4"
  117. "1cd0e72805a410cd9c5bdb5d4927726daf1710f60187377ea25b1a1e39ee"
  118. "d0b88119dc154dc68f7da8e30caf158a33e6c9509f4a05b01409ff5dd87e"
  119. "b50203010001a382013a30820136301d0603551d0e041604142031541af2"
  120. "5c05ffd8658b6843794f5e9036f7b4307d0603551d230476307480145f9d"
  121. "880dc873e654d4f80dd8e6b0c124b447c355a159a4573055310b30090603"
  122. "5504061302474231243022060355040a131b436572746966696361746520"
  123. "5472616e73706172656e6379204341310e300c0603550408130557616c65"
  124. "733110300e060355040713074572772057656e82010030090603551d1304"
  125. "02300030818a060a2b06010401d679020402047c047a0078007600df1c2e"
  126. "c11500945247a96168325ddc5c7959e8f7c6d388fc002e0bbd3f74d76400"
  127. "00013ddb27df9300000403004730450220482f6751af35dba65436be1fd6"
  128. "640f3dbf9a41429495924530288fa3e5e23e06022100e4edc0db3ac572b1"
  129. "e2f5e8ab6a680653987dcf41027dfeffa105519d89edbf08300d06092a86"
  130. "4886f70d0101050500038181008a0c4bef099d479279afa0a28e689f91e1"
  131. "c4421be2d269a2ea6ca4e8215ddeddca1504a11e7c87c4b77e80f0e97903"
  132. "5268f27ca20e166804ae556f316981f96a394ab7abfd3e255ac0044513fe"
  133. "76570c6795abe4703133d303f89f3afa6bbcfc517319dfd95b934241211f"
  134. "634035c3d078307a68c6075a2e20c89f36b8910ca0";
  135. const char kTestTbsCertData[] =
  136. "30820233a003020102020107300d06092a864886f70d0101050500305531"
  137. "0b300906035504061302474231243022060355040a131b43657274696669"
  138. "63617465205472616e73706172656e6379204341310e300c060355040813"
  139. "0557616c65733110300e060355040713074572772057656e301e170d3132"
  140. "303630313030303030305a170d3232303630313030303030305a3052310b"
  141. "30090603550406130247423121301f060355040a13184365727469666963"
  142. "617465205472616e73706172656e6379310e300c0603550408130557616c"
  143. "65733110300e060355040713074572772057656e30819f300d06092a8648"
  144. "86f70d010101050003818d0030818902818100beef98e7c26877ae385f75"
  145. "325a0c1d329bedf18faaf4d796bf047eb7e1ce15c95ba2f80ee458bd7db8"
  146. "6f8a4b252191a79bd700c38e9c0389b45cd4dc9a120ab21e0cb41cd0e728"
  147. "05a410cd9c5bdb5d4927726daf1710f60187377ea25b1a1e39eed0b88119"
  148. "dc154dc68f7da8e30caf158a33e6c9509f4a05b01409ff5dd87eb5020301"
  149. "0001a381ac3081a9301d0603551d0e041604142031541af25c05ffd8658b"
  150. "6843794f5e9036f7b4307d0603551d230476307480145f9d880dc873e654"
  151. "d4f80dd8e6b0c124b447c355a159a4573055310b30090603550406130247"
  152. "4231243022060355040a131b4365727469666963617465205472616e7370"
  153. "6172656e6379204341310e300c0603550408130557616c65733110300e06"
  154. "0355040713074572772057656e82010030090603551d1304023000";
  155. // test-embedded-with-preca-cert.pem
  156. const char kTestEmbeddedWithPreCaCertData[] =
  157. "30820359308202c2a003020102020108300d06092a864886f70d01010505"
  158. "003055310b300906035504061302474231243022060355040a131b436572"
  159. "7469666963617465205472616e73706172656e6379204341310e300c0603"
  160. "550408130557616c65733110300e060355040713074572772057656e301e"
  161. "170d3132303630313030303030305a170d3232303630313030303030305a"
  162. "3052310b30090603550406130247423121301f060355040a131843657274"
  163. "69666963617465205472616e73706172656e6379310e300c060355040813"
  164. "0557616c65733110300e060355040713074572772057656e30819f300d06"
  165. "092a864886f70d010101050003818d0030818902818100afaeeacac51ab7"
  166. "cebdf9eacae7dd175295e193955a17989aef8d97ab7cdff7761093c0b823"
  167. "d2a4e3a51a17b86f28162b66a2538935ebecdc1036233da2dd6531b0c63b"
  168. "cc68761ebdc854037b77399246b870a7b72b14c9b1667de09a9640ed9f3f"
  169. "3c725d950b4d26559869fe7f1e919a66eb76d35c0117c6bcd0d8cfd21028"
  170. "b10203010001a382013a30820136301d0603551d0e04160414612c64efac"
  171. "79b728397c9d93e6df86465fa76a88307d0603551d230476307480145f9d"
  172. "880dc873e654d4f80dd8e6b0c124b447c355a159a4573055310b30090603"
  173. "5504061302474231243022060355040a131b436572746966696361746520"
  174. "5472616e73706172656e6379204341310e300c0603550408130557616c65"
  175. "733110300e060355040713074572772057656e82010030090603551d1304"
  176. "02300030818a060a2b06010401d679020402047c047a0078007600df1c2e"
  177. "c11500945247a96168325ddc5c7959e8f7c6d388fc002e0bbd3f74d76400"
  178. "00013ddb27e05b000004030047304502207aa79604c47480f3727b084f90"
  179. "b3989f79091885e00484431a2a297cbf3a355c022100b49fd8120b0d644c"
  180. "d7e75269b4da6317a9356cb950224fc11cc296b2e39b2386300d06092a86"
  181. "4886f70d010105050003818100a3a86c41ad0088a25aedc4e7b529a2ddbf"
  182. "9e187ffb362157e9302d961b73b43cba0ae1e230d9e45049b7e8c924792e"
  183. "bbe7d175baa87b170dfad8ee788984599d05257994084e2e0e796fca5836"
  184. "881c3e053553e06ab230f919089b914e4a8e2da45f8a87f2c81a25a61f04"
  185. "fe1cace60155653827d41fad9f0658f287d058192c";
  186. // ca-cert.pem
  187. const char kCaCertData[] =
  188. "308202d030820239a003020102020100300d06092a864886f70d01010505"
  189. "003055310b300906035504061302474231243022060355040a131b436572"
  190. "7469666963617465205472616e73706172656e6379204341310e300c0603"
  191. "550408130557616c65733110300e060355040713074572772057656e301e"
  192. "170d3132303630313030303030305a170d3232303630313030303030305a"
  193. "3055310b300906035504061302474231243022060355040a131b43657274"
  194. "69666963617465205472616e73706172656e6379204341310e300c060355"
  195. "0408130557616c65733110300e060355040713074572772057656e30819f"
  196. "300d06092a864886f70d010101050003818d0030818902818100d58a6853"
  197. "6210a27119936e778321181c2a4013c6d07b8c76eb9157d3d0fb4b3b516e"
  198. "cecbd1c98d91c52f743fab635d55099cd13abaf31ae541442451a74c7816"
  199. "f2243cf848cf2831cce67ba04a5a23819f3cba37e624d9c3bdb299b839dd"
  200. "fe2631d2cb3a84fc7bb2b5c52fcfc14fff406f5cd44669cbb2f7cfdf86fb"
  201. "6ab9d1b10203010001a381af3081ac301d0603551d0e041604145f9d880d"
  202. "c873e654d4f80dd8e6b0c124b447c355307d0603551d230476307480145f"
  203. "9d880dc873e654d4f80dd8e6b0c124b447c355a159a4573055310b300906"
  204. "035504061302474231243022060355040a131b4365727469666963617465"
  205. "205472616e73706172656e6379204341310e300c0603550408130557616c"
  206. "65733110300e060355040713074572772057656e820100300c0603551d13"
  207. "040530030101ff300d06092a864886f70d0101050500038181000608cc4a"
  208. "6d64f2205e146c04b276f92b0efa94a5daf23afc3806606d3990d0a1ea23"
  209. "3d40295769463b046661e7fa1d179915209aea2e0a775176411227d7c003"
  210. "07c7470e61584fd7334224727f51d690bc47a9df354db0f6eb25955de189"
  211. "3c4dd5202b24a2f3e440d274b54e1bd376269ca96289b76ecaa41090e14f"
  212. "3b0a942e";
  213. // intermediate-cert.pem
  214. const char kIntermediateCertData[] =
  215. "308202dd30820246a003020102020109300d06092a864886f70d01010505"
  216. "003055310b300906035504061302474231243022060355040a131b436572"
  217. "7469666963617465205472616e73706172656e6379204341310e300c0603"
  218. "550408130557616c65733110300e060355040713074572772057656e301e"
  219. "170d3132303630313030303030305a170d3232303630313030303030305a"
  220. "3062310b30090603550406130247423131302f060355040a132843657274"
  221. "69666963617465205472616e73706172656e637920496e7465726d656469"
  222. "617465204341310e300c0603550408130557616c65733110300e06035504"
  223. "0713074572772057656e30819f300d06092a864886f70d01010105000381"
  224. "8d0030818902818100d76a678d116f522e55ff821c90642508b7074b14d7"
  225. "71159064f7927efdedb87135a1365ee7de18cbd5ce865f860c78f433b4d0"
  226. "d3d3407702e7a3ef542b1dfe9bbaa7cdf94dc5975fc729f86f105f381b24"
  227. "3535cf9c800f5ca780c1d3c84400ee65d16ee9cf52db8adffe50f5c49335"
  228. "0b2190bf50d5bc36f3cac5a8daae92cd8b0203010001a381af3081ac301d"
  229. "0603551d0e04160414965508050278479e8773764131bc143a47e229ab30"
  230. "7d0603551d230476307480145f9d880dc873e654d4f80dd8e6b0c124b447"
  231. "c355a159a4573055310b300906035504061302474231243022060355040a"
  232. "131b4365727469666963617465205472616e73706172656e637920434131"
  233. "0e300c0603550408130557616c65733110300e0603550407130745727720"
  234. "57656e820100300c0603551d13040530030101ff300d06092a864886f70d"
  235. "0101050500038181002206dab1c66b71dce095c3f6aa2ef72cf7761be7ab"
  236. "d7fc39c31a4cfe1bd96d6734ca82f22dde5a0c8bbbdd825d7b6f3e7612ad"
  237. "8db300a7e21169886023262284c3aa5d2191efda10bf9235d37b3a2a340d"
  238. "59419b94a48566f3fac3cd8b53d5a4e98270ead297b07210f9ce4a2138b1"
  239. "8811143b93fa4e7a87dd37e1385f2c2908";
  240. // test-embedded-with-intermediate-cert.pem
  241. const char kTestEmbeddedWithIntermediateCertData[] =
  242. "30820366308202cfa003020102020102300d06092a864886f70d01010505"
  243. "003062310b30090603550406130247423131302f060355040a1328436572"
  244. "7469666963617465205472616e73706172656e637920496e7465726d6564"
  245. "69617465204341310e300c0603550408130557616c65733110300e060355"
  246. "040713074572772057656e301e170d3132303630313030303030305a170d"
  247. "3232303630313030303030305a3052310b30090603550406130247423121"
  248. "301f060355040a13184365727469666963617465205472616e7370617265"
  249. "6e6379310e300c0603550408130557616c65733110300e06035504071307"
  250. "4572772057656e30819f300d06092a864886f70d010101050003818d0030"
  251. "818902818100bb272b26e5deb5459d4acca027e8f12a4d839ac3730a6a10"
  252. "9ff7e25498ddbd3f1895d08ba41f8de34967a3a086ce13a90dd5adbb5418"
  253. "4bdc08e1ac7826adb8dc9c717bfd7da5b41b4db1736e00f1dac3cec9819c"
  254. "cb1a28ba120b020a820e940dd61f95b5432a4bc05d0818f18ce2154eb38d"
  255. "2fa7d22d72b976e560db0c7fc77f0203010001a382013a30820136301d06"
  256. "03551d0e04160414b1b148e658e703f5f7f3105f20b3c384d7eff1bf307d"
  257. "0603551d23047630748014965508050278479e8773764131bc143a47e229"
  258. "aba159a4573055310b300906035504061302474231243022060355040a13"
  259. "1b4365727469666963617465205472616e73706172656e6379204341310e"
  260. "300c0603550408130557616c65733110300e060355040713074572772057"
  261. "656e82010930090603551d130402300030818a060a2b06010401d6790204"
  262. "02047c047a0078007600df1c2ec11500945247a96168325ddc5c7959e8f7"
  263. "c6d388fc002e0bbd3f74d7640000013ddb27e2a400000403004730450221"
  264. "00a6d34517f3392d9ec5d257adf1c597dc45bd4cd3b73856c616a9fb99e5"
  265. "ae75a802205e26c8d1c7e222fe8cda29baeb04a834ee97d34fd81718f1aa"
  266. "e0cd66f4b8a93f300d06092a864886f70d0101050500038181000f95a5b4"
  267. "e128a914b1e88be8b32964221b58f4558433d020a8e246cca65a40bcbf5f"
  268. "2d48933ebc99be6927ca756472fb0bdc7f505f41f462f2bc19d0b299c990"
  269. "918df8820f3d31db37979e8bad563b17f00ae67b0f8731c106c943a73bf5"
  270. "36af168afe21ef4adfcae19a3cc074899992bf506bc5ce1decaaf07ffeeb"
  271. "c805c039";
  272. // test-embedded-with-intermediate-preca-cert.pem
  273. const char kTestEmbeddedWithIntermediatePreCaCertData[] =
  274. "30820366308202cfa003020102020103300d06092a864886f70d01010505"
  275. "003062310b30090603550406130247423131302f060355040a1328436572"
  276. "7469666963617465205472616e73706172656e637920496e7465726d6564"
  277. "69617465204341310e300c0603550408130557616c65733110300e060355"
  278. "040713074572772057656e301e170d3132303630313030303030305a170d"
  279. "3232303630313030303030305a3052310b30090603550406130247423121"
  280. "301f060355040a13184365727469666963617465205472616e7370617265"
  281. "6e6379310e300c0603550408130557616c65733110300e06035504071307"
  282. "4572772057656e30819f300d06092a864886f70d010101050003818d0030"
  283. "818902818100d4497056cdfc65e1342cc3df6e654b8af0104702acd2275c"
  284. "7d3fb1fc438a89b212110d6419bcc13ae47d64bba241e6706b9ed627f8b3"
  285. "4a0d7dff1c44b96287c54bea9d10dc017bceb64f7b6aff3c35a474afec40"
  286. "38ab3640b0cd1fb0582ec03b179a2776c8c435d14ab4882d59d7b724fa37"
  287. "7ca6db08392173f9c6056b3abadf0203010001a382013a30820136301d06"
  288. "03551d0e0416041432da5518d87f1d26ea2767973c0bef286e786a4a307d"
  289. "0603551d23047630748014965508050278479e8773764131bc143a47e229"
  290. "aba159a4573055310b300906035504061302474231243022060355040a13"
  291. "1b4365727469666963617465205472616e73706172656e6379204341310e"
  292. "300c0603550408130557616c65733110300e060355040713074572772057"
  293. "656e82010930090603551d130402300030818a060a2b06010401d6790204"
  294. "02047c047a0078007600df1c2ec11500945247a96168325ddc5c7959e8f7"
  295. "c6d388fc002e0bbd3f74d7640000013ddb27e3be00000403004730450221"
  296. "00d9f61a07fee021e3159f3ca2f570d833ff01374b2096cba5658c5e16fb"
  297. "43eb3002200b76fe475138d8cf76833831304dabf043eb1213c96e13ff4f"
  298. "a37f7cd3c8dc1f300d06092a864886f70d01010505000381810088ee4e9e"
  299. "5eed6b112cc764b151ed929400e9406789c15fbbcfcdab2f10b400234139"
  300. "e6ce65c1e51b47bf7c8950f80bccd57168567954ed35b0ce9346065a5eae"
  301. "5bf95d41da8e27cee9eeac688f4bd343f9c2888327abd8b9f68dcb1e3050"
  302. "041d31bda8e2dd6d39b3664de5ce0870f5fc7e6a00d6ed00528458d953d2"
  303. "37586d73";
  304. static uint8_t
  305. CharToByte(char c)
  306. {
  307. if (c >= '0' && c <= '9') {
  308. return c - '0';
  309. } else if (c >= 'a' && c <= 'f') {
  310. return c - 'a' + 10;
  311. } else if (c >= 'A' && c <= 'F') {
  312. return c - 'A' + 10;
  313. }
  314. MOZ_RELEASE_ASSERT(false);
  315. return 0;
  316. }
  317. static Buffer
  318. HexToBytes(const char* hexData)
  319. {
  320. size_t hexLen = strlen(hexData);
  321. MOZ_RELEASE_ASSERT(hexLen > 0 && (hexLen % 2 == 0));
  322. size_t resultLen = hexLen / 2;
  323. Buffer result;
  324. MOZ_RELEASE_ASSERT(result.reserve(resultLen));
  325. for (size_t i = 0; i < resultLen; ++i) {
  326. uint8_t hi = CharToByte(hexData[i*2]);
  327. uint8_t lo = CharToByte(hexData[i*2 + 1]);
  328. result.infallibleAppend((hi << 4) | lo);
  329. }
  330. return result;
  331. }
  332. void
  333. GetX509CertLogEntry(LogEntry& entry)
  334. {
  335. entry.Reset();
  336. entry.type = ct::LogEntry::Type::X509;
  337. entry.leafCertificate = HexToBytes(kDefaultDerCert);
  338. }
  339. Buffer
  340. GetDEREncodedX509Cert()
  341. {
  342. return HexToBytes(kDefaultDerCert);
  343. }
  344. void
  345. GetPrecertLogEntry(LogEntry& entry)
  346. {
  347. entry.Reset();
  348. entry.type = ct::LogEntry::Type::Precert;
  349. entry.issuerKeyHash = HexToBytes(kDefaultIssuerKeyHash);
  350. entry.tbsCertificate = HexToBytes(kDefaultDerTbsCert);
  351. }
  352. Buffer
  353. GetTestDigitallySigned()
  354. {
  355. return HexToBytes(kTestDigitallySigned);
  356. }
  357. Buffer
  358. GetTestDigitallySignedData()
  359. {
  360. Buffer encoded = GetTestDigitallySigned();
  361. // The encoded buffer contains the signature data itself from the 4th byte.
  362. // The first bytes are:
  363. // 1 byte of hash algorithm
  364. // 1 byte of signature algorithm
  365. // 2 bytes - prefix containing length of the signature data.
  366. Buffer result;
  367. MOZ_RELEASE_ASSERT(result.append(encoded.begin() + 4, encoded.end()));
  368. return result;
  369. }
  370. Buffer
  371. GetTestSignedCertificateTimestamp()
  372. {
  373. return HexToBytes(kTestSignedCertificateTimestamp);
  374. }
  375. Buffer
  376. GetTestPublicKey()
  377. {
  378. return HexToBytes(kEcP256PublicKey);
  379. }
  380. Buffer
  381. GetTestPublicKeyId()
  382. {
  383. return HexToBytes(kTestKeyId);
  384. }
  385. void
  386. GetX509CertSCT(SignedCertificateTimestamp& sct)
  387. {
  388. sct.version = ct::SignedCertificateTimestamp::Version::V1;
  389. sct.logId = HexToBytes(kTestKeyId);
  390. // Time the log issued a SCT for this certificate, which is
  391. // Fri Apr 5 10:04:16.089 2013
  392. sct.timestamp = INT64_C(1365181456089);
  393. sct.extensions.clear();
  394. sct.signature.hashAlgorithm =
  395. ct::DigitallySigned::HashAlgorithm::SHA256;
  396. sct.signature.signatureAlgorithm =
  397. ct::DigitallySigned::SignatureAlgorithm::ECDSA;
  398. sct.signature.signatureData = HexToBytes(kTestSCTSignatureData);
  399. }
  400. void
  401. GetPrecertSCT(SignedCertificateTimestamp& sct)
  402. {
  403. sct.version = ct::SignedCertificateTimestamp::Version::V1;
  404. sct.logId = HexToBytes(kTestKeyId);
  405. // Time the log issued a SCT for this Precertificate, which is
  406. // Fri Apr 5 10:04:16.275 2013
  407. sct.timestamp = INT64_C(1365181456275);
  408. sct.extensions.clear();
  409. sct.signature.hashAlgorithm =
  410. ct::DigitallySigned::HashAlgorithm::SHA256;
  411. sct.signature.signatureAlgorithm =
  412. ct::DigitallySigned::SignatureAlgorithm::ECDSA;
  413. sct.signature.signatureData = HexToBytes(kTestSCTPrecertSignatureData);
  414. }
  415. Buffer
  416. GetDefaultIssuerKeyHash()
  417. {
  418. return HexToBytes(kDefaultIssuerKeyHash);
  419. }
  420. // A sample, valid STH
  421. void
  422. GetSampleSignedTreeHead(SignedTreeHead& sth)
  423. {
  424. sth.version = SignedTreeHead::Version::V1;
  425. sth.timestamp = kSampleSTHTimestamp;
  426. sth.treeSize = kSampleSTHTreeSize;
  427. sth.sha256RootHash = GetSampleSTHSHA256RootHash();
  428. GetSampleSTHTreeHeadDecodedSignature(sth.signature);
  429. }
  430. Buffer
  431. GetSampleSTHSHA256RootHash()
  432. {
  433. return HexToBytes(kSampleSTHSHA256RootHash);
  434. }
  435. Buffer
  436. GetSampleSTHTreeHeadSignature()
  437. {
  438. return HexToBytes(kSampleSTHTreeHeadSignature);
  439. }
  440. void
  441. GetSampleSTHTreeHeadDecodedSignature(DigitallySigned& signature)
  442. {
  443. Buffer ths = HexToBytes(kSampleSTHTreeHeadSignature);
  444. Input thsInput;
  445. ASSERT_EQ(Success, thsInput.Init(ths.begin(), ths.length()));
  446. Reader thsReader(thsInput);
  447. ASSERT_EQ(Success, DecodeDigitallySigned(thsReader, signature));
  448. ASSERT_TRUE(thsReader.AtEnd());
  449. }
  450. Buffer
  451. GetDEREncodedTestEmbeddedCert()
  452. {
  453. return HexToBytes(kTestEmbeddedCertData);
  454. }
  455. Buffer
  456. GetDEREncodedTestTbsCert()
  457. {
  458. return HexToBytes(kTestTbsCertData);
  459. }
  460. Buffer
  461. GetDEREncodedTestEmbeddedWithPreCACert()
  462. {
  463. return HexToBytes(kTestEmbeddedWithPreCaCertData);
  464. }
  465. Buffer
  466. GetDEREncodedCACert()
  467. {
  468. return HexToBytes(kCaCertData);
  469. }
  470. Buffer
  471. GetDEREncodedIntermediateCert()
  472. {
  473. return HexToBytes(kIntermediateCertData);
  474. }
  475. Buffer
  476. GetDEREncodedTestEmbeddedWithIntermediateCert()
  477. {
  478. return HexToBytes(kTestEmbeddedWithIntermediateCertData);
  479. }
  480. Buffer
  481. GetDEREncodedTestEmbeddedWithIntermediatePreCACert()
  482. {
  483. return HexToBytes(kTestEmbeddedWithIntermediatePreCaCertData);
  484. }
  485. Buffer
  486. ExtractCertSPKI(Input cert)
  487. {
  488. BackCert backCert(cert, EndEntityOrCA::MustBeEndEntity, nullptr);
  489. MOZ_RELEASE_ASSERT(backCert.Init() == Success);
  490. Input spkiInput = backCert.GetSubjectPublicKeyInfo();
  491. Buffer spki;
  492. MOZ_RELEASE_ASSERT(InputToBuffer(spkiInput, spki) == Success);
  493. return spki;
  494. }
  495. Buffer
  496. ExtractCertSPKI(const Buffer& cert)
  497. {
  498. return ExtractCertSPKI(InputForBuffer(cert));
  499. }
  500. void
  501. ExtractEmbeddedSCTList(Input cert, Buffer& result)
  502. {
  503. result.clear();
  504. BackCert backCert(cert, EndEntityOrCA::MustBeEndEntity, nullptr);
  505. ASSERT_EQ(Success, backCert.Init());
  506. const Input* scts = backCert.GetSignedCertificateTimestamps();
  507. if (scts) {
  508. Input sctList;
  509. ASSERT_EQ(Success,
  510. ExtractSignedCertificateTimestampListFromExtension(*scts,
  511. sctList));
  512. ASSERT_EQ(Success, InputToBuffer(sctList, result));
  513. }
  514. }
  515. void
  516. ExtractEmbeddedSCTList(const Buffer& cert, Buffer& result)
  517. {
  518. ExtractEmbeddedSCTList(InputForBuffer(cert), result);
  519. }
  520. class OCSPExtensionTrustDomain : public TrustDomain
  521. {
  522. public:
  523. Result GetCertTrust(EndEntityOrCA, const CertPolicyId&,
  524. Input, TrustLevel&) override
  525. {
  526. ADD_FAILURE();
  527. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  528. }
  529. Result FindIssuer(Input, IssuerChecker&, Time) override
  530. {
  531. ADD_FAILURE();
  532. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  533. }
  534. Result CheckRevocation(EndEntityOrCA, const CertID&, Time, Duration,
  535. const Input*, const Input*) override
  536. {
  537. ADD_FAILURE();
  538. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  539. }
  540. Result IsChainValid(const DERArray&, Time) override
  541. {
  542. ADD_FAILURE();
  543. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  544. }
  545. Result DigestBuf(Input item, DigestAlgorithm digestAlg,
  546. /*out*/ uint8_t* digestBuf, size_t digestBufLen) override
  547. {
  548. return DigestBufNSS(item, digestAlg, digestBuf, digestBufLen);
  549. }
  550. Result CheckSignatureDigestAlgorithm(DigestAlgorithm, EndEntityOrCA, Time)
  551. override
  552. {
  553. ADD_FAILURE();
  554. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  555. }
  556. Result CheckECDSACurveIsAcceptable(EndEntityOrCA, NamedCurve) override
  557. {
  558. ADD_FAILURE();
  559. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  560. }
  561. Result VerifyECDSASignedDigest(const SignedDigest& signedDigest,
  562. Input subjectPublicKeyInfo) override
  563. {
  564. return VerifyECDSASignedDigestNSS(signedDigest, subjectPublicKeyInfo,
  565. nullptr);
  566. }
  567. Result CheckRSAPublicKeyModulusSizeInBits(EndEntityOrCA, unsigned int)
  568. override
  569. {
  570. ADD_FAILURE();
  571. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  572. }
  573. Result VerifyRSAPKCS1SignedDigest(const SignedDigest& signedDigest,
  574. Input subjectPublicKeyInfo) override
  575. {
  576. return VerifyRSAPKCS1SignedDigestNSS(signedDigest, subjectPublicKeyInfo,
  577. nullptr);
  578. }
  579. Result CheckValidityIsAcceptable(Time, Time, EndEntityOrCA, KeyPurposeId)
  580. override
  581. {
  582. ADD_FAILURE();
  583. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  584. }
  585. Result NetscapeStepUpMatchesServerAuth(Time, bool&) override
  586. {
  587. ADD_FAILURE();
  588. return Result::FATAL_ERROR_LIBRARY_FAILURE;
  589. }
  590. void NoteAuxiliaryExtension(AuxiliaryExtension extension, Input data) override
  591. {
  592. if (extension != AuxiliaryExtension::SCTListFromOCSPResponse) {
  593. ADD_FAILURE();
  594. return;
  595. }
  596. if (InputToBuffer(data, signedCertificateTimestamps) != Success) {
  597. ADD_FAILURE();
  598. return;
  599. }
  600. }
  601. Buffer signedCertificateTimestamps;
  602. };
  603. void
  604. ExtractSCTListFromOCSPResponse(Input cert,
  605. Input issuerSPKI,
  606. Input encodedResponse,
  607. Time time,
  608. Buffer& result)
  609. {
  610. result.clear();
  611. BackCert backCert(cert, EndEntityOrCA::MustBeEndEntity, nullptr);
  612. ASSERT_EQ(Success, backCert.Init());
  613. CertID certID(backCert.GetIssuer(), issuerSPKI, backCert.GetSerialNumber());
  614. bool expired;
  615. OCSPExtensionTrustDomain trustDomain;
  616. Result rv = VerifyEncodedOCSPResponse(trustDomain, certID,
  617. time, /*time*/
  618. 1000, /*maxLifetimeInDays*/
  619. encodedResponse, expired);
  620. ASSERT_EQ(Success, rv);
  621. result = Move(trustDomain.signedCertificateTimestamps);
  622. }
  623. Buffer
  624. cloneBuffer(const Buffer& buffer)
  625. {
  626. Buffer cloned;
  627. MOZ_RELEASE_ASSERT(cloned.appendAll(buffer));
  628. return cloned;
  629. }
  630. Input
  631. InputForBuffer(const Buffer& buffer)
  632. {
  633. Input input;
  634. MOZ_RELEASE_ASSERT(Success ==
  635. input.Init(buffer.begin(), buffer.length()));
  636. return input;
  637. }
  638. Input InputForSECItem(const SECItem& item)
  639. {
  640. Input input;
  641. MOZ_RELEASE_ASSERT(Success ==
  642. input.Init(item.data, item.len));
  643. return input;
  644. }
  645. } } // namespace mozilla::ct
  646. namespace mozilla {
  647. std::ostream&
  648. operator<<(std::ostream& stream, const ct::Buffer& buffer)
  649. {
  650. if (buffer.empty()) {
  651. stream << "EMPTY";
  652. } else {
  653. for (size_t i = 0; i < buffer.length(); ++i) {
  654. if (i >= 1000) {
  655. stream << "...";
  656. break;
  657. }
  658. stream << std::hex << std::setw(2) << std::setfill('0')
  659. << static_cast<unsigned>(buffer[i]);
  660. }
  661. }
  662. stream << std::dec;
  663. return stream;
  664. }
  665. } // namespace mozilla