| # This file is dual licensed under the terms of the Apache License, Version |
| # 2.0, and the BSD License. See the LICENSE file in the root of this repository |
| # for complete details. |
| |
| from __future__ import absolute_import, division, print_function |
| |
| from cryptography import x509 |
| from cryptography.hazmat.backends import _get_backend |
| from cryptography.hazmat.primitives import serialization |
| from cryptography.hazmat.primitives.asymmetric import dsa, ec, rsa |
| |
| |
| def load_key_and_certificates(data, password, backend=None): |
| backend = _get_backend(backend) |
| return backend.load_key_and_certificates_from_pkcs12(data, password) |
| |
| |
| def serialize_key_and_certificates(name, key, cert, cas, encryption_algorithm): |
| if key is not None and not isinstance( |
| key, |
| ( |
| rsa.RSAPrivateKeyWithSerialization, |
| dsa.DSAPrivateKeyWithSerialization, |
| ec.EllipticCurvePrivateKeyWithSerialization, |
| ), |
| ): |
| raise TypeError("Key must be RSA, DSA, or EllipticCurve private key.") |
| if cert is not None and not isinstance(cert, x509.Certificate): |
| raise TypeError("cert must be a certificate") |
| |
| if cas is not None: |
| cas = list(cas) |
| if not all(isinstance(val, x509.Certificate) for val in cas): |
| raise TypeError("all values in cas must be certificates") |
| |
| if not isinstance( |
| encryption_algorithm, serialization.KeySerializationEncryption |
| ): |
| raise TypeError( |
| "Key encryption algorithm must be a " |
| "KeySerializationEncryption instance" |
| ) |
| |
| if key is None and cert is None and not cas: |
| raise ValueError("You must supply at least one of key, cert, or cas") |
| |
| backend = _get_backend(None) |
| return backend.serialize_key_and_certificates_to_pkcs12( |
| name, key, cert, cas, encryption_algorithm |
| ) |