Commit d410c7e1 authored by Christoph Ziebuhr's avatar Christoph Ziebuhr Committed by oroulet

cryptography is always available

parent c6b63b05
...@@ -7,13 +7,7 @@ import copy ...@@ -7,13 +7,7 @@ import copy
from asyncua import ua from asyncua import ua
from asyncua.ua.uaerrors import UaInvalidParameterError from asyncua.ua.uaerrors import UaInvalidParameterError
from ..ua.ua_binary import struct_from_binary, struct_to_binary, header_from_binary, header_to_binary from ..ua.ua_binary import struct_from_binary, struct_to_binary, header_from_binary, header_to_binary
from ..crypto.uacrypto import InvalidSignature
try:
from ..crypto.uacrypto import InvalidSignature
except ImportError:
class InvalidSignature(Exception): # type: ignore
pass
_logger = logging.getLogger("asyncua.uaprotocol") _logger = logging.getLogger("asyncua.uaprotocol")
......
...@@ -4,28 +4,13 @@ import time ...@@ -4,28 +4,13 @@ import time
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from ..ua import CryptographyNone, SecurityPolicy, MessageSecurityMode, UaError from ..ua import CryptographyNone, SecurityPolicy, MessageSecurityMode, UaError
from ..crypto import uacrypto
try:
from ..crypto import uacrypto
CRYPTOGRAPHY_AVAILABLE = True
except ImportError:
CRYPTOGRAPHY_AVAILABLE = False
POLICY_NONE_URI = "http://opcfoundation.org/UA/SecurityPolicy#None" POLICY_NONE_URI = "http://opcfoundation.org/UA/SecurityPolicy#None"
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
def require_cryptography(obj):
"""
Raise exception if cryptography module is not available.
Call this function in constructors.
"""
if not CRYPTOGRAPHY_AVAILABLE:
raise UaError(f"Can't use {obj.__class__.__name__}, cryptography module is not installed")
class Signer: class Signer:
""" """
Abstract base class for cryptographic signature algorithm Abstract base class for cryptographic signature algorithm
...@@ -237,7 +222,6 @@ class Cryptography(CryptographyNone): ...@@ -237,7 +222,6 @@ class Cryptography(CryptographyNone):
class SignerRsa(Signer): class SignerRsa(Signer):
def __init__(self, client_pk): def __init__(self, client_pk):
require_cryptography(self)
self.client_pk = client_pk self.client_pk = client_pk
self.key_size = self.client_pk.key_size // 8 self.key_size = self.client_pk.key_size // 8
...@@ -250,7 +234,6 @@ class SignerRsa(Signer): ...@@ -250,7 +234,6 @@ class SignerRsa(Signer):
class VerifierRsa(Verifier): class VerifierRsa(Verifier):
def __init__(self, server_cert): def __init__(self, server_cert):
require_cryptography(self)
self.server_cert = server_cert self.server_cert = server_cert
self.key_size = self.server_cert.public_key().key_size // 8 self.key_size = self.server_cert.public_key().key_size // 8
...@@ -263,7 +246,6 @@ class VerifierRsa(Verifier): ...@@ -263,7 +246,6 @@ class VerifierRsa(Verifier):
class EncryptorRsa(Encryptor): class EncryptorRsa(Encryptor):
def __init__(self, server_cert, enc_fn, padding_size): def __init__(self, server_cert, enc_fn, padding_size):
require_cryptography(self)
self.server_cert = server_cert self.server_cert = server_cert
self.key_size = self.server_cert.public_key().key_size // 8 self.key_size = self.server_cert.public_key().key_size // 8
self.encryptor = enc_fn self.encryptor = enc_fn
...@@ -285,7 +267,6 @@ class EncryptorRsa(Encryptor): ...@@ -285,7 +267,6 @@ class EncryptorRsa(Encryptor):
class DecryptorRsa(Decryptor): class DecryptorRsa(Decryptor):
def __init__(self, client_pk, dec_fn, padding_size): def __init__(self, client_pk, dec_fn, padding_size):
require_cryptography(self)
self.client_pk = client_pk self.client_pk = client_pk
self.key_size = self.client_pk.key_size // 8 self.key_size = self.client_pk.key_size // 8
self.decryptor = dec_fn self.decryptor = dec_fn
...@@ -307,7 +288,6 @@ class DecryptorRsa(Decryptor): ...@@ -307,7 +288,6 @@ class DecryptorRsa(Decryptor):
class SignerAesCbc(Signer): class SignerAesCbc(Signer):
def __init__(self, key): def __init__(self, key):
require_cryptography(self)
self.key = key self.key = key
def signature_size(self): def signature_size(self):
...@@ -319,7 +299,6 @@ class SignerAesCbc(Signer): ...@@ -319,7 +299,6 @@ class SignerAesCbc(Signer):
class VerifierAesCbc(Verifier): class VerifierAesCbc(Verifier):
def __init__(self, key): def __init__(self, key):
require_cryptography(self)
self.key = key self.key = key
def signature_size(self): def signature_size(self):
...@@ -333,7 +312,6 @@ class VerifierAesCbc(Verifier): ...@@ -333,7 +312,6 @@ class VerifierAesCbc(Verifier):
class EncryptorAesCbc(Encryptor): class EncryptorAesCbc(Encryptor):
def __init__(self, key, init_vec): def __init__(self, key, init_vec):
require_cryptography(self)
self.cipher = uacrypto.cipher_aes_cbc(key, init_vec) self.cipher = uacrypto.cipher_aes_cbc(key, init_vec)
def plain_block_size(self): def plain_block_size(self):
...@@ -348,7 +326,6 @@ class EncryptorAesCbc(Encryptor): ...@@ -348,7 +326,6 @@ class EncryptorAesCbc(Encryptor):
class DecryptorAesCbc(Decryptor): class DecryptorAesCbc(Decryptor):
def __init__(self, key, init_vec): def __init__(self, key, init_vec):
require_cryptography(self)
self.cipher = uacrypto.cipher_aes_cbc(key, init_vec) self.cipher = uacrypto.cipher_aes_cbc(key, init_vec)
def plain_block_size(self): def plain_block_size(self):
...@@ -363,7 +340,6 @@ class DecryptorAesCbc(Decryptor): ...@@ -363,7 +340,6 @@ class DecryptorAesCbc(Decryptor):
class SignerSha256(Signer): class SignerSha256(Signer):
def __init__(self, client_pk): def __init__(self, client_pk):
require_cryptography(self)
self.client_pk = client_pk self.client_pk = client_pk
self.key_size = self.client_pk.key_size // 8 self.key_size = self.client_pk.key_size // 8
...@@ -376,7 +352,6 @@ class SignerSha256(Signer): ...@@ -376,7 +352,6 @@ class SignerSha256(Signer):
class VerifierSha256(Verifier): class VerifierSha256(Verifier):
def __init__(self, server_cert): def __init__(self, server_cert):
require_cryptography(self)
self.server_cert = server_cert self.server_cert = server_cert
self.key_size = self.server_cert.public_key().key_size // 8 self.key_size = self.server_cert.public_key().key_size // 8
...@@ -389,7 +364,6 @@ class VerifierSha256(Verifier): ...@@ -389,7 +364,6 @@ class VerifierSha256(Verifier):
class SignerHMac256(Signer): class SignerHMac256(Signer):
def __init__(self, key): def __init__(self, key):
require_cryptography(self)
self.key = key self.key = key
def signature_size(self): def signature_size(self):
...@@ -401,7 +375,6 @@ class SignerHMac256(Signer): ...@@ -401,7 +375,6 @@ class SignerHMac256(Signer):
class VerifierHMac256(Verifier): class VerifierHMac256(Verifier):
def __init__(self, key): def __init__(self, key):
require_cryptography(self)
self.key = key self.key = key
def signature_size(self): def signature_size(self):
...@@ -415,7 +388,6 @@ class VerifierHMac256(Verifier): ...@@ -415,7 +388,6 @@ class VerifierHMac256(Verifier):
class SignerPssSha256(Signer): class SignerPssSha256(Signer):
def __init__(self, client_pk): def __init__(self, client_pk):
require_cryptography(self)
self.client_pk = client_pk self.client_pk = client_pk
self.key_size = self.client_pk.key_size // 8 self.key_size = self.client_pk.key_size // 8
...@@ -428,7 +400,6 @@ class SignerPssSha256(Signer): ...@@ -428,7 +400,6 @@ class SignerPssSha256(Signer):
class VerifierPssSha256(Verifier): class VerifierPssSha256(Verifier):
def __init__(self, server_cert): def __init__(self, server_cert):
require_cryptography(self)
self.server_cert = server_cert self.server_cert = server_cert
self.key_size = self.server_cert.public_key().key_size // 8 self.key_size = self.server_cert.public_key().key_size // 8
...@@ -476,7 +447,6 @@ class SecurityPolicyAes128Sha256RsaOaep(SecurityPolicy): ...@@ -476,7 +447,6 @@ class SecurityPolicyAes128Sha256RsaOaep(SecurityPolicy):
return uacrypto.encrypt_rsa_oaep(pubkey, data) return uacrypto.encrypt_rsa_oaep(pubkey, data)
def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None): def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None):
require_cryptography(self)
if isinstance(peer_cert, bytes): if isinstance(peer_cert, bytes):
peer_cert = uacrypto.x509_from_der(peer_cert) peer_cert = uacrypto.x509_from_der(peer_cert)
# even in Sign mode we need to asymmetrically encrypt secrets # even in Sign mode we need to asymmetrically encrypt secrets
...@@ -550,7 +520,6 @@ class SecurityPolicyAes256Sha256RsaPss(SecurityPolicy): ...@@ -550,7 +520,6 @@ class SecurityPolicyAes256Sha256RsaPss(SecurityPolicy):
return uacrypto.encrypt_rsa_oaep_sha256(pubkey, data) return uacrypto.encrypt_rsa_oaep_sha256(pubkey, data)
def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None): def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None):
require_cryptography(self)
if isinstance(peer_cert, bytes): if isinstance(peer_cert, bytes):
peer_cert = uacrypto.x509_from_der(peer_cert) peer_cert = uacrypto.x509_from_der(peer_cert)
# even in Sign mode we need to asymmetrically encrypt secrets # even in Sign mode we need to asymmetrically encrypt secrets
...@@ -632,7 +601,6 @@ class SecurityPolicyBasic128Rsa15(SecurityPolicy): ...@@ -632,7 +601,6 @@ class SecurityPolicyBasic128Rsa15(SecurityPolicy):
def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None): def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None):
_logger.warning("DEPRECATED! Do not use SecurityPolicyBasic128Rsa15 anymore!") _logger.warning("DEPRECATED! Do not use SecurityPolicyBasic128Rsa15 anymore!")
require_cryptography(self)
if isinstance(peer_cert, bytes): if isinstance(peer_cert, bytes):
peer_cert = uacrypto.x509_from_der(peer_cert) peer_cert = uacrypto.x509_from_der(peer_cert)
# even in Sign mode we need to asymmetrically encrypt secrets # even in Sign mode we need to asymmetrically encrypt secrets
...@@ -712,7 +680,6 @@ class SecurityPolicyBasic256(SecurityPolicy): ...@@ -712,7 +680,6 @@ class SecurityPolicyBasic256(SecurityPolicy):
def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None): def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None):
_logger.warning("DEPRECATED! Do not use SecurityPolicyBasic256 anymore!") _logger.warning("DEPRECATED! Do not use SecurityPolicyBasic256 anymore!")
require_cryptography(self)
if isinstance(peer_cert, bytes): if isinstance(peer_cert, bytes):
peer_cert = uacrypto.x509_from_der(peer_cert) peer_cert = uacrypto.x509_from_der(peer_cert)
# even in Sign mode we need to asymmetrically encrypt secrets # even in Sign mode we need to asymmetrically encrypt secrets
...@@ -790,7 +757,6 @@ class SecurityPolicyBasic256Sha256(SecurityPolicy): ...@@ -790,7 +757,6 @@ class SecurityPolicyBasic256Sha256(SecurityPolicy):
return uacrypto.encrypt_rsa_oaep(pubkey, data) return uacrypto.encrypt_rsa_oaep(pubkey, data)
def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None): def __init__(self, peer_cert, host_cert, client_pk, mode, permission_ruleset=None):
require_cryptography(self)
if isinstance(peer_cert, bytes): if isinstance(peer_cert, bytes):
peer_cert = uacrypto.x509_from_der(peer_cert) peer_cert = uacrypto.x509_from_der(peer_cert)
# even in Sign mode we need to asymmetrically encrypt secrets # even in Sign mode we need to asymmetrically encrypt secrets
......
...@@ -24,12 +24,7 @@ from .users import User, UserRole ...@@ -24,12 +24,7 @@ from .users import User, UserRole
from .internal_session import InternalSession from .internal_session import InternalSession
from .event_generator import EventGenerator from .event_generator import EventGenerator
from ..crypto.validator import CertificateValidatorMethod from ..crypto.validator import CertificateValidatorMethod
from ..crypto import uacrypto
try:
from asyncua.crypto import uacrypto
except ImportError:
logging.getLogger(__name__).warning("cryptography is not installed, use of crypto disabled")
uacrypto = False
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -403,9 +398,6 @@ class InternalServer: ...@@ -403,9 +398,6 @@ class InternalServer:
# decrypt password if we can # decrypt password if we can
if str(token.EncryptionAlgorithm) != "None": if str(token.EncryptionAlgorithm) != "None":
if not uacrypto:
# raise # Should I raise a significant exception?
return False
try: try:
if token.EncryptionAlgorithm == "http://www.w3.org/2001/04/xmlenc#rsa-1_5": if token.EncryptionAlgorithm == "http://www.w3.org/2001/04/xmlenc#rsa-1_5":
raw_pw = uacrypto.decrypt_rsa15(self.private_key, password) raw_pw = uacrypto.decrypt_rsa15(self.private_key, password)
......
...@@ -513,10 +513,8 @@ def application_to_strings(app): ...@@ -513,10 +513,8 @@ def application_to_strings(app):
def cert_to_string(der): def cert_to_string(der):
if not der: if not der:
return "[no certificate]" return "[no certificate]"
try:
from .crypto import uacrypto from .crypto import uacrypto
except ImportError:
return f"{len(der)} bytes"
cert = uacrypto.x509_from_der(der) cert = uacrypto.x509_from_der(der)
return uacrypto.x509_to_string(cert) return uacrypto.x509_to_string(cert)
......
...@@ -13,15 +13,7 @@ from asyncua import ua ...@@ -13,15 +13,7 @@ from asyncua import ua
from asyncua.server.user_managers import CertificateUserManager from asyncua.server.user_managers import CertificateUserManager
from asyncua.crypto.security_policies import Verifier, Decryptor from asyncua.crypto.security_policies import Verifier, Decryptor
from asyncua.crypto.validator import CertificateValidator, CertificateValidatorOptions from asyncua.crypto.validator import CertificateValidator, CertificateValidatorOptions
from asyncua.crypto import uacrypto, security_policies
try:
from asyncua.crypto import uacrypto
from asyncua.crypto import security_policies
except ImportError:
print("WARNING: CRYPTO NOT AVAILABLE, CRYPTO TESTS DISABLED!!")
disable_crypto_tests = True
else:
disable_crypto_tests = False
pytestmark = pytest.mark.asyncio pytestmark = pytest.mark.asyncio
......
...@@ -6,14 +6,7 @@ from asyncua import Server ...@@ -6,14 +6,7 @@ from asyncua import Server
from asyncua import ua from asyncua import ua
from asyncua.server.users import UserRole from asyncua.server.users import UserRole
from asyncua.server.user_managers import CertificateUserManager from asyncua.server.user_managers import CertificateUserManager
from asyncua.crypto import security_policies
try:
from asyncua.crypto import security_policies
except ImportError:
print("WARNING: CRYPTO NOT AVAILABLE, CRYPTO TESTS DISABLED!!")
disable_crypto_tests = True
else:
disable_crypto_tests = False
pytestmark = pytest.mark.asyncio pytestmark = pytest.mark.asyncio
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment