errors.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. package x509
  2. import "fmt"
  3. // To preserve error IDs, only append to this list, never insert.
  4. const (
  5. ErrInvalidID ErrorID = iota
  6. ErrInvalidCertList
  7. ErrTrailingCertList
  8. ErrUnexpectedlyCriticalCertListExtension
  9. ErrUnexpectedlyNonCriticalCertListExtension
  10. ErrInvalidCertListAuthKeyID
  11. ErrTrailingCertListAuthKeyID
  12. ErrInvalidCertListIssuerAltName
  13. ErrInvalidCertListCRLNumber
  14. ErrTrailingCertListCRLNumber
  15. ErrNegativeCertListCRLNumber
  16. ErrInvalidCertListDeltaCRL
  17. ErrTrailingCertListDeltaCRL
  18. ErrNegativeCertListDeltaCRL
  19. ErrInvalidCertListIssuingDP
  20. ErrTrailingCertListIssuingDP
  21. ErrCertListIssuingDPMultipleTypes
  22. ErrCertListIssuingDPInvalidFullName
  23. ErrInvalidCertListFreshestCRL
  24. ErrInvalidCertListAuthInfoAccess
  25. ErrTrailingCertListAuthInfoAccess
  26. ErrUnhandledCriticalCertListExtension
  27. ErrUnexpectedlyCriticalRevokedCertExtension
  28. ErrUnexpectedlyNonCriticalRevokedCertExtension
  29. ErrInvalidRevocationReason
  30. ErrTrailingRevocationReason
  31. ErrInvalidRevocationInvalidityDate
  32. ErrTrailingRevocationInvalidityDate
  33. ErrInvalidRevocationIssuer
  34. ErrUnhandledCriticalRevokedCertExtension
  35. ErrMaxID
  36. )
  37. // idToError gives a template x509.Error for each defined ErrorID; where the Summary
  38. // field may hold format specifiers that take field parameters.
  39. var idToError map[ErrorID]Error
  40. var errorInfo = []Error{
  41. {
  42. ID: ErrInvalidCertList,
  43. Summary: "x509: failed to parse CertificateList: %v",
  44. Field: "CertificateList",
  45. SpecRef: "RFC 5280 s5.1",
  46. Category: InvalidASN1Content,
  47. Fatal: true,
  48. },
  49. {
  50. ID: ErrTrailingCertList,
  51. Summary: "x509: trailing data after CertificateList",
  52. Field: "CertificateList",
  53. SpecRef: "RFC 5280 s5.1",
  54. Category: InvalidASN1Content,
  55. Fatal: true,
  56. },
  57. {
  58. ID: ErrUnexpectedlyCriticalCertListExtension,
  59. Summary: "x509: certificate list extension %v marked critical but expected to be non-critical",
  60. Field: "tbsCertList.crlExtensions.*.critical",
  61. SpecRef: "RFC 5280 s5.2",
  62. Category: MalformedCRL,
  63. },
  64. {
  65. ID: ErrUnexpectedlyNonCriticalCertListExtension,
  66. Summary: "x509: certificate list extension %v marked non-critical but expected to be critical",
  67. Field: "tbsCertList.crlExtensions.*.critical",
  68. SpecRef: "RFC 5280 s5.2",
  69. Category: MalformedCRL,
  70. },
  71. {
  72. ID: ErrInvalidCertListAuthKeyID,
  73. Summary: "x509: failed to unmarshal certificate-list authority key-id: %v",
  74. Field: "tbsCertList.crlExtensions.*.AuthorityKeyIdentifier",
  75. SpecRef: "RFC 5280 s5.2.1",
  76. Category: InvalidASN1Content,
  77. Fatal: true,
  78. },
  79. {
  80. ID: ErrTrailingCertListAuthKeyID,
  81. Summary: "x509: trailing data after certificate list auth key ID",
  82. Field: "tbsCertList.crlExtensions.*.AuthorityKeyIdentifier",
  83. SpecRef: "RFC 5280 s5.2.1",
  84. Category: InvalidASN1Content,
  85. Fatal: true,
  86. },
  87. {
  88. ID: ErrInvalidCertListIssuerAltName,
  89. Summary: "x509: failed to parse CRL issuer alt name: %v",
  90. Field: "tbsCertList.crlExtensions.*.IssuerAltName",
  91. SpecRef: "RFC 5280 s5.2.2",
  92. Category: InvalidASN1Content,
  93. Fatal: true,
  94. },
  95. {
  96. ID: ErrInvalidCertListCRLNumber,
  97. Summary: "x509: failed to unmarshal certificate-list crl-number: %v",
  98. Field: "tbsCertList.crlExtensions.*.CRLNumber",
  99. SpecRef: "RFC 5280 s5.2.3",
  100. Category: InvalidASN1Content,
  101. Fatal: true,
  102. },
  103. {
  104. ID: ErrTrailingCertListCRLNumber,
  105. Summary: "x509: trailing data after certificate list crl-number",
  106. Field: "tbsCertList.crlExtensions.*.CRLNumber",
  107. SpecRef: "RFC 5280 s5.2.3",
  108. Category: InvalidASN1Content,
  109. Fatal: true,
  110. },
  111. {
  112. ID: ErrNegativeCertListCRLNumber,
  113. Summary: "x509: negative certificate list crl-number: %d",
  114. Field: "tbsCertList.crlExtensions.*.CRLNumber",
  115. SpecRef: "RFC 5280 s5.2.3",
  116. Category: MalformedCRL,
  117. Fatal: true,
  118. },
  119. {
  120. ID: ErrInvalidCertListDeltaCRL,
  121. Summary: "x509: failed to unmarshal certificate-list delta-crl: %v",
  122. Field: "tbsCertList.crlExtensions.*.BaseCRLNumber",
  123. SpecRef: "RFC 5280 s5.2.4",
  124. Category: InvalidASN1Content,
  125. Fatal: true,
  126. },
  127. {
  128. ID: ErrTrailingCertListDeltaCRL,
  129. Summary: "x509: trailing data after certificate list delta-crl",
  130. Field: "tbsCertList.crlExtensions.*.BaseCRLNumber",
  131. SpecRef: "RFC 5280 s5.2.4",
  132. Category: InvalidASN1Content,
  133. Fatal: true,
  134. },
  135. {
  136. ID: ErrNegativeCertListDeltaCRL,
  137. Summary: "x509: negative certificate list base-crl-number: %d",
  138. Field: "tbsCertList.crlExtensions.*.BaseCRLNumber",
  139. SpecRef: "RFC 5280 s5.2.4",
  140. Category: MalformedCRL,
  141. Fatal: true,
  142. },
  143. {
  144. ID: ErrInvalidCertListIssuingDP,
  145. Summary: "x509: failed to unmarshal certificate list issuing distribution point: %v",
  146. Field: "tbsCertList.crlExtensions.*.IssuingDistributionPoint",
  147. SpecRef: "RFC 5280 s5.2.5",
  148. Category: InvalidASN1Content,
  149. Fatal: true,
  150. },
  151. {
  152. ID: ErrTrailingCertListIssuingDP,
  153. Summary: "x509: trailing data after certificate list issuing distribution point",
  154. Field: "tbsCertList.crlExtensions.*.IssuingDistributionPoint",
  155. SpecRef: "RFC 5280 s5.2.5",
  156. Category: InvalidASN1Content,
  157. Fatal: true,
  158. },
  159. {
  160. ID: ErrCertListIssuingDPMultipleTypes,
  161. Summary: "x509: multiple cert types set in issuing-distribution-point: user:%v CA:%v attr:%v",
  162. Field: "tbsCertList.crlExtensions.*.IssuingDistributionPoint",
  163. SpecRef: "RFC 5280 s5.2.5",
  164. SpecText: "at most one of onlyContainsUserCerts, onlyContainsCACerts, and onlyContainsAttributeCerts may be set to TRUE.",
  165. Category: MalformedCRL,
  166. Fatal: true,
  167. },
  168. {
  169. ID: ErrCertListIssuingDPInvalidFullName,
  170. Summary: "x509: failed to parse CRL issuing-distribution-point fullName: %v",
  171. Field: "tbsCertList.crlExtensions.*.IssuingDistributionPoint.distributionPoint",
  172. SpecRef: "RFC 5280 s5.2.5",
  173. Category: InvalidASN1Content,
  174. Fatal: true,
  175. },
  176. {
  177. ID: ErrInvalidCertListFreshestCRL,
  178. Summary: "x509: failed to unmarshal certificate list freshestCRL: %v",
  179. Field: "tbsCertList.crlExtensions.*.FreshestCRL",
  180. SpecRef: "RFC 5280 s5.2.6",
  181. Category: InvalidASN1Content,
  182. Fatal: true,
  183. },
  184. {
  185. ID: ErrInvalidCertListAuthInfoAccess,
  186. Summary: "x509: failed to unmarshal certificate list authority info access: %v",
  187. Field: "tbsCertList.crlExtensions.*.AuthorityInfoAccess",
  188. SpecRef: "RFC 5280 s5.2.7",
  189. Category: InvalidASN1Content,
  190. Fatal: true,
  191. },
  192. {
  193. ID: ErrTrailingCertListAuthInfoAccess,
  194. Summary: "x509: trailing data after certificate list authority info access",
  195. Field: "tbsCertList.crlExtensions.*.AuthorityInfoAccess",
  196. SpecRef: "RFC 5280 s5.2.7",
  197. Category: InvalidASN1Content,
  198. Fatal: true,
  199. },
  200. {
  201. ID: ErrUnhandledCriticalCertListExtension,
  202. Summary: "x509: unhandled critical extension in certificate list: %v",
  203. Field: "tbsCertList.revokedCertificates.crlExtensions.*",
  204. SpecRef: "RFC 5280 s5.2",
  205. SpecText: "If a CRL contains a critical extension that the application cannot process, then the application MUST NOT use that CRL to determine the status of certificates.",
  206. Category: MalformedCRL,
  207. Fatal: true,
  208. },
  209. {
  210. ID: ErrUnexpectedlyCriticalRevokedCertExtension,
  211. Summary: "x509: revoked certificate extension %v marked critical but expected to be non-critical",
  212. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.critical",
  213. SpecRef: "RFC 5280 s5.3",
  214. Category: MalformedCRL,
  215. },
  216. {
  217. ID: ErrUnexpectedlyNonCriticalRevokedCertExtension,
  218. Summary: "x509: revoked certificate extension %v marked non-critical but expected to be critical",
  219. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.critical",
  220. SpecRef: "RFC 5280 s5.3",
  221. Category: MalformedCRL,
  222. },
  223. {
  224. ID: ErrInvalidRevocationReason,
  225. Summary: "x509: failed to parse revocation reason: %v",
  226. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.CRLReason",
  227. SpecRef: "RFC 5280 s5.3.1",
  228. Category: InvalidASN1Content,
  229. Fatal: true,
  230. },
  231. {
  232. ID: ErrTrailingRevocationReason,
  233. Summary: "x509: trailing data after revoked certificate reason",
  234. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.CRLReason",
  235. SpecRef: "RFC 5280 s5.3.1",
  236. Category: InvalidASN1Content,
  237. Fatal: true,
  238. },
  239. {
  240. ID: ErrInvalidRevocationInvalidityDate,
  241. Summary: "x509: failed to parse revoked certificate invalidity date: %v",
  242. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.InvalidityDate",
  243. SpecRef: "RFC 5280 s5.3.2",
  244. Category: InvalidASN1Content,
  245. Fatal: true,
  246. },
  247. {
  248. ID: ErrTrailingRevocationInvalidityDate,
  249. Summary: "x509: trailing data after revoked certificate invalidity date",
  250. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.InvalidityDate",
  251. SpecRef: "RFC 5280 s5.3.2",
  252. Category: InvalidASN1Content,
  253. Fatal: true,
  254. },
  255. {
  256. ID: ErrInvalidRevocationIssuer,
  257. Summary: "x509: failed to parse revocation issuer %v",
  258. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*.CertificateIssuer",
  259. SpecRef: "RFC 5280 s5.3.3",
  260. Category: InvalidASN1Content,
  261. Fatal: true,
  262. },
  263. {
  264. ID: ErrUnhandledCriticalRevokedCertExtension,
  265. Summary: "x509: unhandled critical extension in revoked certificate: %v",
  266. Field: "tbsCertList.revokedCertificates.crlEntryExtensions.*",
  267. SpecRef: "RFC 5280 s5.3",
  268. SpecText: "If a CRL contains a critical CRL entry extension that the application cannot process, then the application MUST NOT use that CRL to determine the status of any certificates.",
  269. Category: MalformedCRL,
  270. Fatal: true,
  271. },
  272. }
  273. func init() {
  274. idToError = make(map[ErrorID]Error, len(errorInfo))
  275. for _, info := range errorInfo {
  276. idToError[info.ID] = info
  277. }
  278. }
  279. // NewError builds a new x509.Error based on the template for the given id.
  280. func NewError(id ErrorID, args ...interface{}) Error {
  281. var err Error
  282. if id >= ErrMaxID {
  283. err.ID = id
  284. err.Summary = fmt.Sprintf("Unknown error ID %v: args %+v", id, args)
  285. err.Fatal = true
  286. } else {
  287. err = idToError[id]
  288. err.Summary = fmt.Sprintf(err.Summary, args...)
  289. }
  290. return err
  291. }