/ acme / acme / test_util.py
test_util.py
 1  """Test utilities.
 2  
 3  .. warning:: This module is not part of the public API.
 4  
 5  """
 6  import os
 7  import pkg_resources
 8  
 9  from cryptography.hazmat.backends import default_backend
10  from cryptography.hazmat.primitives import serialization
11  import OpenSSL
12  
13  from acme import jose
14  
15  
16  def vector_path(*names):
17      """Path to a test vector."""
18      return pkg_resources.resource_filename(
19          __name__, os.path.join('testdata', *names))
20  
21  
22  def load_vector(*names):
23      """Load contents of a test vector."""
24      # luckily, resource_string opens file in binary mode
25      return pkg_resources.resource_string(
26          __name__, os.path.join('testdata', *names))
27  
28  
29  def _guess_loader(filename, loader_pem, loader_der):
30      _, ext = os.path.splitext(filename)
31      if ext.lower() == '.pem':
32          return loader_pem
33      elif ext.lower() == '.der':
34          return loader_der
35      else:  # pragma: no cover
36          raise ValueError("Loader could not be recognized based on extension")
37  
38  
39  def load_cert(*names):
40      """Load certificate."""
41      loader = _guess_loader(
42          names[-1], OpenSSL.crypto.FILETYPE_PEM, OpenSSL.crypto.FILETYPE_ASN1)
43      return jose.ComparableX509(OpenSSL.crypto.load_certificate(
44          loader, load_vector(*names)))
45  
46  
47  def load_csr(*names):
48      """Load certificate request."""
49      loader = _guess_loader(
50          names[-1], OpenSSL.crypto.FILETYPE_PEM, OpenSSL.crypto.FILETYPE_ASN1)
51      return jose.ComparableX509(OpenSSL.crypto.load_certificate_request(
52          loader, load_vector(*names)))
53  
54  
55  def load_rsa_private_key(*names):
56      """Load RSA private key."""
57      loader = _guess_loader(names[-1], serialization.load_pem_private_key,
58                             serialization.load_der_private_key)
59      return jose.ComparableRSAKey(loader(
60          load_vector(*names), password=None, backend=default_backend()))
61  
62  
63  def load_pyopenssl_private_key(*names):
64      """Load pyOpenSSL private key."""
65      loader = _guess_loader(
66          names[-1], OpenSSL.crypto.FILETYPE_PEM, OpenSSL.crypto.FILETYPE_ASN1)
67      return OpenSSL.crypto.load_privatekey(loader, load_vector(*names))