base.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. # This file is dual licensed under the terms of the Apache License, Version
  2. # 2.0, and the BSD License. See the LICENSE file in the root of this repository
  3. # for complete details.
  4. from __future__ import absolute_import, division, print_function
  5. import abc
  6. import datetime
  7. import os
  8. from enum import Enum
  9. import six
  10. from cryptography import utils
  11. from cryptography.hazmat.backends import _get_backend
  12. from cryptography.hazmat.primitives.asymmetric import (
  13. dsa,
  14. ec,
  15. ed25519,
  16. ed448,
  17. rsa,
  18. )
  19. from cryptography.x509.extensions import Extension, ExtensionType
  20. from cryptography.x509.name import Name
  21. from cryptography.x509.oid import ObjectIdentifier
  22. _EARLIEST_UTC_TIME = datetime.datetime(1950, 1, 1)
  23. class AttributeNotFound(Exception):
  24. def __init__(self, msg, oid):
  25. super(AttributeNotFound, self).__init__(msg)
  26. self.oid = oid
  27. def _reject_duplicate_extension(extension, extensions):
  28. # This is quadratic in the number of extensions
  29. for e in extensions:
  30. if e.oid == extension.oid:
  31. raise ValueError("This extension has already been set.")
  32. def _reject_duplicate_attribute(oid, attributes):
  33. # This is quadratic in the number of attributes
  34. for attr_oid, _ in attributes:
  35. if attr_oid == oid:
  36. raise ValueError("This attribute has already been set.")
  37. def _convert_to_naive_utc_time(time):
  38. """Normalizes a datetime to a naive datetime in UTC.
  39. time -- datetime to normalize. Assumed to be in UTC if not timezone
  40. aware.
  41. """
  42. if time.tzinfo is not None:
  43. offset = time.utcoffset()
  44. offset = offset if offset else datetime.timedelta()
  45. return time.replace(tzinfo=None) - offset
  46. else:
  47. return time
  48. class Version(Enum):
  49. v1 = 0
  50. v3 = 2
  51. def load_pem_x509_certificate(data, backend=None):
  52. backend = _get_backend(backend)
  53. return backend.load_pem_x509_certificate(data)
  54. def load_der_x509_certificate(data, backend=None):
  55. backend = _get_backend(backend)
  56. return backend.load_der_x509_certificate(data)
  57. def load_pem_x509_csr(data, backend=None):
  58. backend = _get_backend(backend)
  59. return backend.load_pem_x509_csr(data)
  60. def load_der_x509_csr(data, backend=None):
  61. backend = _get_backend(backend)
  62. return backend.load_der_x509_csr(data)
  63. def load_pem_x509_crl(data, backend=None):
  64. backend = _get_backend(backend)
  65. return backend.load_pem_x509_crl(data)
  66. def load_der_x509_crl(data, backend=None):
  67. backend = _get_backend(backend)
  68. return backend.load_der_x509_crl(data)
  69. class InvalidVersion(Exception):
  70. def __init__(self, msg, parsed_version):
  71. super(InvalidVersion, self).__init__(msg)
  72. self.parsed_version = parsed_version
  73. @six.add_metaclass(abc.ABCMeta)
  74. class Certificate(object):
  75. @abc.abstractmethod
  76. def fingerprint(self, algorithm):
  77. """
  78. Returns bytes using digest passed.
  79. """
  80. @abc.abstractproperty
  81. def serial_number(self):
  82. """
  83. Returns certificate serial number
  84. """
  85. @abc.abstractproperty
  86. def version(self):
  87. """
  88. Returns the certificate version
  89. """
  90. @abc.abstractmethod
  91. def public_key(self):
  92. """
  93. Returns the public key
  94. """
  95. @abc.abstractproperty
  96. def not_valid_before(self):
  97. """
  98. Not before time (represented as UTC datetime)
  99. """
  100. @abc.abstractproperty
  101. def not_valid_after(self):
  102. """
  103. Not after time (represented as UTC datetime)
  104. """
  105. @abc.abstractproperty
  106. def issuer(self):
  107. """
  108. Returns the issuer name object.
  109. """
  110. @abc.abstractproperty
  111. def subject(self):
  112. """
  113. Returns the subject name object.
  114. """
  115. @abc.abstractproperty
  116. def signature_hash_algorithm(self):
  117. """
  118. Returns a HashAlgorithm corresponding to the type of the digest signed
  119. in the certificate.
  120. """
  121. @abc.abstractproperty
  122. def signature_algorithm_oid(self):
  123. """
  124. Returns the ObjectIdentifier of the signature algorithm.
  125. """
  126. @abc.abstractproperty
  127. def extensions(self):
  128. """
  129. Returns an Extensions object.
  130. """
  131. @abc.abstractproperty
  132. def signature(self):
  133. """
  134. Returns the signature bytes.
  135. """
  136. @abc.abstractproperty
  137. def tbs_certificate_bytes(self):
  138. """
  139. Returns the tbsCertificate payload bytes as defined in RFC 5280.
  140. """
  141. @abc.abstractmethod
  142. def __eq__(self, other):
  143. """
  144. Checks equality.
  145. """
  146. @abc.abstractmethod
  147. def __ne__(self, other):
  148. """
  149. Checks not equal.
  150. """
  151. @abc.abstractmethod
  152. def __hash__(self):
  153. """
  154. Computes a hash.
  155. """
  156. @abc.abstractmethod
  157. def public_bytes(self, encoding):
  158. """
  159. Serializes the certificate to PEM or DER format.
  160. """
  161. @six.add_metaclass(abc.ABCMeta)
  162. class CertificateRevocationList(object):
  163. @abc.abstractmethod
  164. def public_bytes(self, encoding):
  165. """
  166. Serializes the CRL to PEM or DER format.
  167. """
  168. @abc.abstractmethod
  169. def fingerprint(self, algorithm):
  170. """
  171. Returns bytes using digest passed.
  172. """
  173. @abc.abstractmethod
  174. def get_revoked_certificate_by_serial_number(self, serial_number):
  175. """
  176. Returns an instance of RevokedCertificate or None if the serial_number
  177. is not in the CRL.
  178. """
  179. @abc.abstractproperty
  180. def signature_hash_algorithm(self):
  181. """
  182. Returns a HashAlgorithm corresponding to the type of the digest signed
  183. in the certificate.
  184. """
  185. @abc.abstractproperty
  186. def signature_algorithm_oid(self):
  187. """
  188. Returns the ObjectIdentifier of the signature algorithm.
  189. """
  190. @abc.abstractproperty
  191. def issuer(self):
  192. """
  193. Returns the X509Name with the issuer of this CRL.
  194. """
  195. @abc.abstractproperty
  196. def next_update(self):
  197. """
  198. Returns the date of next update for this CRL.
  199. """
  200. @abc.abstractproperty
  201. def last_update(self):
  202. """
  203. Returns the date of last update for this CRL.
  204. """
  205. @abc.abstractproperty
  206. def extensions(self):
  207. """
  208. Returns an Extensions object containing a list of CRL extensions.
  209. """
  210. @abc.abstractproperty
  211. def signature(self):
  212. """
  213. Returns the signature bytes.
  214. """
  215. @abc.abstractproperty
  216. def tbs_certlist_bytes(self):
  217. """
  218. Returns the tbsCertList payload bytes as defined in RFC 5280.
  219. """
  220. @abc.abstractmethod
  221. def __eq__(self, other):
  222. """
  223. Checks equality.
  224. """
  225. @abc.abstractmethod
  226. def __ne__(self, other):
  227. """
  228. Checks not equal.
  229. """
  230. @abc.abstractmethod
  231. def __len__(self):
  232. """
  233. Number of revoked certificates in the CRL.
  234. """
  235. @abc.abstractmethod
  236. def __getitem__(self, idx):
  237. """
  238. Returns a revoked certificate (or slice of revoked certificates).
  239. """
  240. @abc.abstractmethod
  241. def __iter__(self):
  242. """
  243. Iterator over the revoked certificates
  244. """
  245. @abc.abstractmethod
  246. def is_signature_valid(self, public_key):
  247. """
  248. Verifies signature of revocation list against given public key.
  249. """
  250. @six.add_metaclass(abc.ABCMeta)
  251. class CertificateSigningRequest(object):
  252. @abc.abstractmethod
  253. def __eq__(self, other):
  254. """
  255. Checks equality.
  256. """
  257. @abc.abstractmethod
  258. def __ne__(self, other):
  259. """
  260. Checks not equal.
  261. """
  262. @abc.abstractmethod
  263. def __hash__(self):
  264. """
  265. Computes a hash.
  266. """
  267. @abc.abstractmethod
  268. def public_key(self):
  269. """
  270. Returns the public key
  271. """
  272. @abc.abstractproperty
  273. def subject(self):
  274. """
  275. Returns the subject name object.
  276. """
  277. @abc.abstractproperty
  278. def signature_hash_algorithm(self):
  279. """
  280. Returns a HashAlgorithm corresponding to the type of the digest signed
  281. in the certificate.
  282. """
  283. @abc.abstractproperty
  284. def signature_algorithm_oid(self):
  285. """
  286. Returns the ObjectIdentifier of the signature algorithm.
  287. """
  288. @abc.abstractproperty
  289. def extensions(self):
  290. """
  291. Returns the extensions in the signing request.
  292. """
  293. @abc.abstractmethod
  294. def public_bytes(self, encoding):
  295. """
  296. Encodes the request to PEM or DER format.
  297. """
  298. @abc.abstractproperty
  299. def signature(self):
  300. """
  301. Returns the signature bytes.
  302. """
  303. @abc.abstractproperty
  304. def tbs_certrequest_bytes(self):
  305. """
  306. Returns the PKCS#10 CertificationRequestInfo bytes as defined in RFC
  307. 2986.
  308. """
  309. @abc.abstractproperty
  310. def is_signature_valid(self):
  311. """
  312. Verifies signature of signing request.
  313. """
  314. @abc.abstractproperty
  315. def get_attribute_for_oid(self):
  316. """
  317. Get the attribute value for a given OID.
  318. """
  319. @six.add_metaclass(abc.ABCMeta)
  320. class RevokedCertificate(object):
  321. @abc.abstractproperty
  322. def serial_number(self):
  323. """
  324. Returns the serial number of the revoked certificate.
  325. """
  326. @abc.abstractproperty
  327. def revocation_date(self):
  328. """
  329. Returns the date of when this certificate was revoked.
  330. """
  331. @abc.abstractproperty
  332. def extensions(self):
  333. """
  334. Returns an Extensions object containing a list of Revoked extensions.
  335. """
  336. class CertificateSigningRequestBuilder(object):
  337. def __init__(self, subject_name=None, extensions=[], attributes=[]):
  338. """
  339. Creates an empty X.509 certificate request (v1).
  340. """
  341. self._subject_name = subject_name
  342. self._extensions = extensions
  343. self._attributes = attributes
  344. def subject_name(self, name):
  345. """
  346. Sets the certificate requestor's distinguished name.
  347. """
  348. if not isinstance(name, Name):
  349. raise TypeError("Expecting x509.Name object.")
  350. if self._subject_name is not None:
  351. raise ValueError("The subject name may only be set once.")
  352. return CertificateSigningRequestBuilder(
  353. name, self._extensions, self._attributes
  354. )
  355. def add_extension(self, extension, critical):
  356. """
  357. Adds an X.509 extension to the certificate request.
  358. """
  359. if not isinstance(extension, ExtensionType):
  360. raise TypeError("extension must be an ExtensionType")
  361. extension = Extension(extension.oid, critical, extension)
  362. _reject_duplicate_extension(extension, self._extensions)
  363. return CertificateSigningRequestBuilder(
  364. self._subject_name,
  365. self._extensions + [extension],
  366. self._attributes,
  367. )
  368. def add_attribute(self, oid, value):
  369. """
  370. Adds an X.509 attribute with an OID and associated value.
  371. """
  372. if not isinstance(oid, ObjectIdentifier):
  373. raise TypeError("oid must be an ObjectIdentifier")
  374. if not isinstance(value, bytes):
  375. raise TypeError("value must be bytes")
  376. _reject_duplicate_attribute(oid, self._attributes)
  377. return CertificateSigningRequestBuilder(
  378. self._subject_name,
  379. self._extensions,
  380. self._attributes + [(oid, value)],
  381. )
  382. def sign(self, private_key, algorithm, backend=None):
  383. """
  384. Signs the request using the requestor's private key.
  385. """
  386. backend = _get_backend(backend)
  387. if self._subject_name is None:
  388. raise ValueError("A CertificateSigningRequest must have a subject")
  389. return backend.create_x509_csr(self, private_key, algorithm)
  390. class CertificateBuilder(object):
  391. def __init__(
  392. self,
  393. issuer_name=None,
  394. subject_name=None,
  395. public_key=None,
  396. serial_number=None,
  397. not_valid_before=None,
  398. not_valid_after=None,
  399. extensions=[],
  400. ):
  401. self._version = Version.v3
  402. self._issuer_name = issuer_name
  403. self._subject_name = subject_name
  404. self._public_key = public_key
  405. self._serial_number = serial_number
  406. self._not_valid_before = not_valid_before
  407. self._not_valid_after = not_valid_after
  408. self._extensions = extensions
  409. def issuer_name(self, name):
  410. """
  411. Sets the CA's distinguished name.
  412. """
  413. if not isinstance(name, Name):
  414. raise TypeError("Expecting x509.Name object.")
  415. if self._issuer_name is not None:
  416. raise ValueError("The issuer name may only be set once.")
  417. return CertificateBuilder(
  418. name,
  419. self._subject_name,
  420. self._public_key,
  421. self._serial_number,
  422. self._not_valid_before,
  423. self._not_valid_after,
  424. self._extensions,
  425. )
  426. def subject_name(self, name):
  427. """
  428. Sets the requestor's distinguished name.
  429. """
  430. if not isinstance(name, Name):
  431. raise TypeError("Expecting x509.Name object.")
  432. if self._subject_name is not None:
  433. raise ValueError("The subject name may only be set once.")
  434. return CertificateBuilder(
  435. self._issuer_name,
  436. name,
  437. self._public_key,
  438. self._serial_number,
  439. self._not_valid_before,
  440. self._not_valid_after,
  441. self._extensions,
  442. )
  443. def public_key(self, key):
  444. """
  445. Sets the requestor's public key (as found in the signing request).
  446. """
  447. if not isinstance(
  448. key,
  449. (
  450. dsa.DSAPublicKey,
  451. rsa.RSAPublicKey,
  452. ec.EllipticCurvePublicKey,
  453. ed25519.Ed25519PublicKey,
  454. ed448.Ed448PublicKey,
  455. ),
  456. ):
  457. raise TypeError(
  458. "Expecting one of DSAPublicKey, RSAPublicKey,"
  459. " EllipticCurvePublicKey, Ed25519PublicKey or"
  460. " Ed448PublicKey."
  461. )
  462. if self._public_key is not None:
  463. raise ValueError("The public key may only be set once.")
  464. return CertificateBuilder(
  465. self._issuer_name,
  466. self._subject_name,
  467. key,
  468. self._serial_number,
  469. self._not_valid_before,
  470. self._not_valid_after,
  471. self._extensions,
  472. )
  473. def serial_number(self, number):
  474. """
  475. Sets the certificate serial number.
  476. """
  477. if not isinstance(number, six.integer_types):
  478. raise TypeError("Serial number must be of integral type.")
  479. if self._serial_number is not None:
  480. raise ValueError("The serial number may only be set once.")
  481. if number <= 0:
  482. raise ValueError("The serial number should be positive.")
  483. # ASN.1 integers are always signed, so most significant bit must be
  484. # zero.
  485. if number.bit_length() >= 160: # As defined in RFC 5280
  486. raise ValueError(
  487. "The serial number should not be more than 159 " "bits."
  488. )
  489. return CertificateBuilder(
  490. self._issuer_name,
  491. self._subject_name,
  492. self._public_key,
  493. number,
  494. self._not_valid_before,
  495. self._not_valid_after,
  496. self._extensions,
  497. )
  498. def not_valid_before(self, time):
  499. """
  500. Sets the certificate activation time.
  501. """
  502. if not isinstance(time, datetime.datetime):
  503. raise TypeError("Expecting datetime object.")
  504. if self._not_valid_before is not None:
  505. raise ValueError("The not valid before may only be set once.")
  506. time = _convert_to_naive_utc_time(time)
  507. if time < _EARLIEST_UTC_TIME:
  508. raise ValueError(
  509. "The not valid before date must be on or after"
  510. " 1950 January 1)."
  511. )
  512. if self._not_valid_after is not None and time > self._not_valid_after:
  513. raise ValueError(
  514. "The not valid before date must be before the not valid after "
  515. "date."
  516. )
  517. return CertificateBuilder(
  518. self._issuer_name,
  519. self._subject_name,
  520. self._public_key,
  521. self._serial_number,
  522. time,
  523. self._not_valid_after,
  524. self._extensions,
  525. )
  526. def not_valid_after(self, time):
  527. """
  528. Sets the certificate expiration time.
  529. """
  530. if not isinstance(time, datetime.datetime):
  531. raise TypeError("Expecting datetime object.")
  532. if self._not_valid_after is not None:
  533. raise ValueError("The not valid after may only be set once.")
  534. time = _convert_to_naive_utc_time(time)
  535. if time < _EARLIEST_UTC_TIME:
  536. raise ValueError(
  537. "The not valid after date must be on or after"
  538. " 1950 January 1."
  539. )
  540. if (
  541. self._not_valid_before is not None
  542. and time < self._not_valid_before
  543. ):
  544. raise ValueError(
  545. "The not valid after date must be after the not valid before "
  546. "date."
  547. )
  548. return CertificateBuilder(
  549. self._issuer_name,
  550. self._subject_name,
  551. self._public_key,
  552. self._serial_number,
  553. self._not_valid_before,
  554. time,
  555. self._extensions,
  556. )
  557. def add_extension(self, extension, critical):
  558. """
  559. Adds an X.509 extension to the certificate.
  560. """
  561. if not isinstance(extension, ExtensionType):
  562. raise TypeError("extension must be an ExtensionType")
  563. extension = Extension(extension.oid, critical, extension)
  564. _reject_duplicate_extension(extension, self._extensions)
  565. return CertificateBuilder(
  566. self._issuer_name,
  567. self._subject_name,
  568. self._public_key,
  569. self._serial_number,
  570. self._not_valid_before,
  571. self._not_valid_after,
  572. self._extensions + [extension],
  573. )
  574. def sign(self, private_key, algorithm, backend=None):
  575. """
  576. Signs the certificate using the CA's private key.
  577. """
  578. backend = _get_backend(backend)
  579. if self._subject_name is None:
  580. raise ValueError("A certificate must have a subject name")
  581. if self._issuer_name is None:
  582. raise ValueError("A certificate must have an issuer name")
  583. if self._serial_number is None:
  584. raise ValueError("A certificate must have a serial number")
  585. if self._not_valid_before is None:
  586. raise ValueError("A certificate must have a not valid before time")
  587. if self._not_valid_after is None:
  588. raise ValueError("A certificate must have a not valid after time")
  589. if self._public_key is None:
  590. raise ValueError("A certificate must have a public key")
  591. return backend.create_x509_certificate(self, private_key, algorithm)
  592. class CertificateRevocationListBuilder(object):
  593. def __init__(
  594. self,
  595. issuer_name=None,
  596. last_update=None,
  597. next_update=None,
  598. extensions=[],
  599. revoked_certificates=[],
  600. ):
  601. self._issuer_name = issuer_name
  602. self._last_update = last_update
  603. self._next_update = next_update
  604. self._extensions = extensions
  605. self._revoked_certificates = revoked_certificates
  606. def issuer_name(self, issuer_name):
  607. if not isinstance(issuer_name, Name):
  608. raise TypeError("Expecting x509.Name object.")
  609. if self._issuer_name is not None:
  610. raise ValueError("The issuer name may only be set once.")
  611. return CertificateRevocationListBuilder(
  612. issuer_name,
  613. self._last_update,
  614. self._next_update,
  615. self._extensions,
  616. self._revoked_certificates,
  617. )
  618. def last_update(self, last_update):
  619. if not isinstance(last_update, datetime.datetime):
  620. raise TypeError("Expecting datetime object.")
  621. if self._last_update is not None:
  622. raise ValueError("Last update may only be set once.")
  623. last_update = _convert_to_naive_utc_time(last_update)
  624. if last_update < _EARLIEST_UTC_TIME:
  625. raise ValueError(
  626. "The last update date must be on or after" " 1950 January 1."
  627. )
  628. if self._next_update is not None and last_update > self._next_update:
  629. raise ValueError(
  630. "The last update date must be before the next update date."
  631. )
  632. return CertificateRevocationListBuilder(
  633. self._issuer_name,
  634. last_update,
  635. self._next_update,
  636. self._extensions,
  637. self._revoked_certificates,
  638. )
  639. def next_update(self, next_update):
  640. if not isinstance(next_update, datetime.datetime):
  641. raise TypeError("Expecting datetime object.")
  642. if self._next_update is not None:
  643. raise ValueError("Last update may only be set once.")
  644. next_update = _convert_to_naive_utc_time(next_update)
  645. if next_update < _EARLIEST_UTC_TIME:
  646. raise ValueError(
  647. "The last update date must be on or after" " 1950 January 1."
  648. )
  649. if self._last_update is not None and next_update < self._last_update:
  650. raise ValueError(
  651. "The next update date must be after the last update date."
  652. )
  653. return CertificateRevocationListBuilder(
  654. self._issuer_name,
  655. self._last_update,
  656. next_update,
  657. self._extensions,
  658. self._revoked_certificates,
  659. )
  660. def add_extension(self, extension, critical):
  661. """
  662. Adds an X.509 extension to the certificate revocation list.
  663. """
  664. if not isinstance(extension, ExtensionType):
  665. raise TypeError("extension must be an ExtensionType")
  666. extension = Extension(extension.oid, critical, extension)
  667. _reject_duplicate_extension(extension, self._extensions)
  668. return CertificateRevocationListBuilder(
  669. self._issuer_name,
  670. self._last_update,
  671. self._next_update,
  672. self._extensions + [extension],
  673. self._revoked_certificates,
  674. )
  675. def add_revoked_certificate(self, revoked_certificate):
  676. """
  677. Adds a revoked certificate to the CRL.
  678. """
  679. if not isinstance(revoked_certificate, RevokedCertificate):
  680. raise TypeError("Must be an instance of RevokedCertificate")
  681. return CertificateRevocationListBuilder(
  682. self._issuer_name,
  683. self._last_update,
  684. self._next_update,
  685. self._extensions,
  686. self._revoked_certificates + [revoked_certificate],
  687. )
  688. def sign(self, private_key, algorithm, backend=None):
  689. backend = _get_backend(backend)
  690. if self._issuer_name is None:
  691. raise ValueError("A CRL must have an issuer name")
  692. if self._last_update is None:
  693. raise ValueError("A CRL must have a last update time")
  694. if self._next_update is None:
  695. raise ValueError("A CRL must have a next update time")
  696. return backend.create_x509_crl(self, private_key, algorithm)
  697. class RevokedCertificateBuilder(object):
  698. def __init__(
  699. self, serial_number=None, revocation_date=None, extensions=[]
  700. ):
  701. self._serial_number = serial_number
  702. self._revocation_date = revocation_date
  703. self._extensions = extensions
  704. def serial_number(self, number):
  705. if not isinstance(number, six.integer_types):
  706. raise TypeError("Serial number must be of integral type.")
  707. if self._serial_number is not None:
  708. raise ValueError("The serial number may only be set once.")
  709. if number <= 0:
  710. raise ValueError("The serial number should be positive")
  711. # ASN.1 integers are always signed, so most significant bit must be
  712. # zero.
  713. if number.bit_length() >= 160: # As defined in RFC 5280
  714. raise ValueError(
  715. "The serial number should not be more than 159 " "bits."
  716. )
  717. return RevokedCertificateBuilder(
  718. number, self._revocation_date, self._extensions
  719. )
  720. def revocation_date(self, time):
  721. if not isinstance(time, datetime.datetime):
  722. raise TypeError("Expecting datetime object.")
  723. if self._revocation_date is not None:
  724. raise ValueError("The revocation date may only be set once.")
  725. time = _convert_to_naive_utc_time(time)
  726. if time < _EARLIEST_UTC_TIME:
  727. raise ValueError(
  728. "The revocation date must be on or after" " 1950 January 1."
  729. )
  730. return RevokedCertificateBuilder(
  731. self._serial_number, time, self._extensions
  732. )
  733. def add_extension(self, extension, critical):
  734. if not isinstance(extension, ExtensionType):
  735. raise TypeError("extension must be an ExtensionType")
  736. extension = Extension(extension.oid, critical, extension)
  737. _reject_duplicate_extension(extension, self._extensions)
  738. return RevokedCertificateBuilder(
  739. self._serial_number,
  740. self._revocation_date,
  741. self._extensions + [extension],
  742. )
  743. def build(self, backend=None):
  744. backend = _get_backend(backend)
  745. if self._serial_number is None:
  746. raise ValueError("A revoked certificate must have a serial number")
  747. if self._revocation_date is None:
  748. raise ValueError(
  749. "A revoked certificate must have a revocation date"
  750. )
  751. return backend.create_x509_revoked_certificate(self)
  752. def random_serial_number():
  753. return utils.int_from_bytes(os.urandom(20), "big") >> 1