interfaces.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  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 six
  7. @six.add_metaclass(abc.ABCMeta)
  8. class CipherBackend(object):
  9. @abc.abstractmethod
  10. def cipher_supported(self, cipher, mode):
  11. """
  12. Return True if the given cipher and mode are supported.
  13. """
  14. @abc.abstractmethod
  15. def create_symmetric_encryption_ctx(self, cipher, mode):
  16. """
  17. Get a CipherContext that can be used for encryption.
  18. """
  19. @abc.abstractmethod
  20. def create_symmetric_decryption_ctx(self, cipher, mode):
  21. """
  22. Get a CipherContext that can be used for decryption.
  23. """
  24. @six.add_metaclass(abc.ABCMeta)
  25. class HashBackend(object):
  26. @abc.abstractmethod
  27. def hash_supported(self, algorithm):
  28. """
  29. Return True if the hash algorithm is supported by this backend.
  30. """
  31. @abc.abstractmethod
  32. def create_hash_ctx(self, algorithm):
  33. """
  34. Create a HashContext for calculating a message digest.
  35. """
  36. @six.add_metaclass(abc.ABCMeta)
  37. class HMACBackend(object):
  38. @abc.abstractmethod
  39. def hmac_supported(self, algorithm):
  40. """
  41. Return True if the hash algorithm is supported for HMAC by this
  42. backend.
  43. """
  44. @abc.abstractmethod
  45. def create_hmac_ctx(self, key, algorithm):
  46. """
  47. Create a context for calculating a message authentication code.
  48. """
  49. @six.add_metaclass(abc.ABCMeta)
  50. class CMACBackend(object):
  51. @abc.abstractmethod
  52. def cmac_algorithm_supported(self, algorithm):
  53. """
  54. Returns True if the block cipher is supported for CMAC by this backend
  55. """
  56. @abc.abstractmethod
  57. def create_cmac_ctx(self, algorithm):
  58. """
  59. Create a context for calculating a message authentication code.
  60. """
  61. @six.add_metaclass(abc.ABCMeta)
  62. class PBKDF2HMACBackend(object):
  63. @abc.abstractmethod
  64. def pbkdf2_hmac_supported(self, algorithm):
  65. """
  66. Return True if the hash algorithm is supported for PBKDF2 by this
  67. backend.
  68. """
  69. @abc.abstractmethod
  70. def derive_pbkdf2_hmac(
  71. self, algorithm, length, salt, iterations, key_material
  72. ):
  73. """
  74. Return length bytes derived from provided PBKDF2 parameters.
  75. """
  76. @six.add_metaclass(abc.ABCMeta)
  77. class RSABackend(object):
  78. @abc.abstractmethod
  79. def generate_rsa_private_key(self, public_exponent, key_size):
  80. """
  81. Generate an RSAPrivateKey instance with public_exponent and a modulus
  82. of key_size bits.
  83. """
  84. @abc.abstractmethod
  85. def rsa_padding_supported(self, padding):
  86. """
  87. Returns True if the backend supports the given padding options.
  88. """
  89. @abc.abstractmethod
  90. def generate_rsa_parameters_supported(self, public_exponent, key_size):
  91. """
  92. Returns True if the backend supports the given parameters for key
  93. generation.
  94. """
  95. @abc.abstractmethod
  96. def load_rsa_private_numbers(self, numbers):
  97. """
  98. Returns an RSAPrivateKey provider.
  99. """
  100. @abc.abstractmethod
  101. def load_rsa_public_numbers(self, numbers):
  102. """
  103. Returns an RSAPublicKey provider.
  104. """
  105. @six.add_metaclass(abc.ABCMeta)
  106. class DSABackend(object):
  107. @abc.abstractmethod
  108. def generate_dsa_parameters(self, key_size):
  109. """
  110. Generate a DSAParameters instance with a modulus of key_size bits.
  111. """
  112. @abc.abstractmethod
  113. def generate_dsa_private_key(self, parameters):
  114. """
  115. Generate a DSAPrivateKey instance with parameters as a DSAParameters
  116. object.
  117. """
  118. @abc.abstractmethod
  119. def generate_dsa_private_key_and_parameters(self, key_size):
  120. """
  121. Generate a DSAPrivateKey instance using key size only.
  122. """
  123. @abc.abstractmethod
  124. def dsa_hash_supported(self, algorithm):
  125. """
  126. Return True if the hash algorithm is supported by the backend for DSA.
  127. """
  128. @abc.abstractmethod
  129. def dsa_parameters_supported(self, p, q, g):
  130. """
  131. Return True if the parameters are supported by the backend for DSA.
  132. """
  133. @abc.abstractmethod
  134. def load_dsa_private_numbers(self, numbers):
  135. """
  136. Returns a DSAPrivateKey provider.
  137. """
  138. @abc.abstractmethod
  139. def load_dsa_public_numbers(self, numbers):
  140. """
  141. Returns a DSAPublicKey provider.
  142. """
  143. @abc.abstractmethod
  144. def load_dsa_parameter_numbers(self, numbers):
  145. """
  146. Returns a DSAParameters provider.
  147. """
  148. @six.add_metaclass(abc.ABCMeta)
  149. class EllipticCurveBackend(object):
  150. @abc.abstractmethod
  151. def elliptic_curve_signature_algorithm_supported(
  152. self, signature_algorithm, curve
  153. ):
  154. """
  155. Returns True if the backend supports the named elliptic curve with the
  156. specified signature algorithm.
  157. """
  158. @abc.abstractmethod
  159. def elliptic_curve_supported(self, curve):
  160. """
  161. Returns True if the backend supports the named elliptic curve.
  162. """
  163. @abc.abstractmethod
  164. def generate_elliptic_curve_private_key(self, curve):
  165. """
  166. Return an object conforming to the EllipticCurvePrivateKey interface.
  167. """
  168. @abc.abstractmethod
  169. def load_elliptic_curve_public_numbers(self, numbers):
  170. """
  171. Return an EllipticCurvePublicKey provider using the given numbers.
  172. """
  173. @abc.abstractmethod
  174. def load_elliptic_curve_private_numbers(self, numbers):
  175. """
  176. Return an EllipticCurvePrivateKey provider using the given numbers.
  177. """
  178. @abc.abstractmethod
  179. def elliptic_curve_exchange_algorithm_supported(self, algorithm, curve):
  180. """
  181. Returns whether the exchange algorithm is supported by this backend.
  182. """
  183. @abc.abstractmethod
  184. def derive_elliptic_curve_private_key(self, private_value, curve):
  185. """
  186. Compute the private key given the private value and curve.
  187. """
  188. @six.add_metaclass(abc.ABCMeta)
  189. class PEMSerializationBackend(object):
  190. @abc.abstractmethod
  191. def load_pem_private_key(self, data, password):
  192. """
  193. Loads a private key from PEM encoded data, using the provided password
  194. if the data is encrypted.
  195. """
  196. @abc.abstractmethod
  197. def load_pem_public_key(self, data):
  198. """
  199. Loads a public key from PEM encoded data.
  200. """
  201. @abc.abstractmethod
  202. def load_pem_parameters(self, data):
  203. """
  204. Load encryption parameters from PEM encoded data.
  205. """
  206. @six.add_metaclass(abc.ABCMeta)
  207. class DERSerializationBackend(object):
  208. @abc.abstractmethod
  209. def load_der_private_key(self, data, password):
  210. """
  211. Loads a private key from DER encoded data. Uses the provided password
  212. if the data is encrypted.
  213. """
  214. @abc.abstractmethod
  215. def load_der_public_key(self, data):
  216. """
  217. Loads a public key from DER encoded data.
  218. """
  219. @abc.abstractmethod
  220. def load_der_parameters(self, data):
  221. """
  222. Load encryption parameters from DER encoded data.
  223. """
  224. @six.add_metaclass(abc.ABCMeta)
  225. class X509Backend(object):
  226. @abc.abstractmethod
  227. def load_pem_x509_certificate(self, data):
  228. """
  229. Load an X.509 certificate from PEM encoded data.
  230. """
  231. @abc.abstractmethod
  232. def load_der_x509_certificate(self, data):
  233. """
  234. Load an X.509 certificate from DER encoded data.
  235. """
  236. @abc.abstractmethod
  237. def load_der_x509_csr(self, data):
  238. """
  239. Load an X.509 CSR from DER encoded data.
  240. """
  241. @abc.abstractmethod
  242. def load_pem_x509_csr(self, data):
  243. """
  244. Load an X.509 CSR from PEM encoded data.
  245. """
  246. @abc.abstractmethod
  247. def create_x509_csr(self, builder, private_key, algorithm):
  248. """
  249. Create and sign an X.509 CSR from a CSR builder object.
  250. """
  251. @abc.abstractmethod
  252. def create_x509_certificate(self, builder, private_key, algorithm):
  253. """
  254. Create and sign an X.509 certificate from a CertificateBuilder object.
  255. """
  256. @abc.abstractmethod
  257. def create_x509_crl(self, builder, private_key, algorithm):
  258. """
  259. Create and sign an X.509 CertificateRevocationList from a
  260. CertificateRevocationListBuilder object.
  261. """
  262. @abc.abstractmethod
  263. def create_x509_revoked_certificate(self, builder):
  264. """
  265. Create a RevokedCertificate object from a RevokedCertificateBuilder
  266. object.
  267. """
  268. @abc.abstractmethod
  269. def x509_name_bytes(self, name):
  270. """
  271. Compute the DER encoded bytes of an X509 Name object.
  272. """
  273. @six.add_metaclass(abc.ABCMeta)
  274. class DHBackend(object):
  275. @abc.abstractmethod
  276. def generate_dh_parameters(self, generator, key_size):
  277. """
  278. Generate a DHParameters instance with a modulus of key_size bits.
  279. Using the given generator. Often 2 or 5.
  280. """
  281. @abc.abstractmethod
  282. def generate_dh_private_key(self, parameters):
  283. """
  284. Generate a DHPrivateKey instance with parameters as a DHParameters
  285. object.
  286. """
  287. @abc.abstractmethod
  288. def generate_dh_private_key_and_parameters(self, generator, key_size):
  289. """
  290. Generate a DHPrivateKey instance using key size only.
  291. Using the given generator. Often 2 or 5.
  292. """
  293. @abc.abstractmethod
  294. def load_dh_private_numbers(self, numbers):
  295. """
  296. Load a DHPrivateKey from DHPrivateNumbers
  297. """
  298. @abc.abstractmethod
  299. def load_dh_public_numbers(self, numbers):
  300. """
  301. Load a DHPublicKey from DHPublicNumbers.
  302. """
  303. @abc.abstractmethod
  304. def load_dh_parameter_numbers(self, numbers):
  305. """
  306. Load DHParameters from DHParameterNumbers.
  307. """
  308. @abc.abstractmethod
  309. def dh_parameters_supported(self, p, g, q=None):
  310. """
  311. Returns whether the backend supports DH with these parameter values.
  312. """
  313. @abc.abstractmethod
  314. def dh_x942_serialization_supported(self):
  315. """
  316. Returns True if the backend supports the serialization of DH objects
  317. with subgroup order (q).
  318. """
  319. @six.add_metaclass(abc.ABCMeta)
  320. class ScryptBackend(object):
  321. @abc.abstractmethod
  322. def derive_scrypt(self, key_material, salt, length, n, r, p):
  323. """
  324. Return bytes derived from provided Scrypt parameters.
  325. """