You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							90 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							90 lines
						
					
					
						
							2.2 KiB
						
					
					
				from ..utils import base64url_encode, ensure_binary
 | 
						|
 | 
						|
 | 
						|
class Key:
 | 
						|
    """
 | 
						|
    A simple interface for implementing JWK keys.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, key, algorithm):
 | 
						|
        pass
 | 
						|
 | 
						|
    def sign(self, msg):
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def verify(self, msg, sig):
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def public_key(self):
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def to_pem(self):
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def to_dict(self):
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def encrypt(self, plain_text, aad=None):
 | 
						|
        """
 | 
						|
        Encrypt the plain text and generate an auth tag if appropriate
 | 
						|
 | 
						|
        Args:
 | 
						|
            plain_text (bytes): Data to encrypt
 | 
						|
            aad (bytes, optional): Authenticated Additional Data if key's algorithm supports auth mode
 | 
						|
 | 
						|
        Returns:
 | 
						|
            (bytes, bytes, bytes): IV, cipher text, and auth tag
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def decrypt(self, cipher_text, iv=None, aad=None, tag=None):
 | 
						|
        """
 | 
						|
        Decrypt the cipher text and validate the auth tag if present
 | 
						|
        Args:
 | 
						|
            cipher_text (bytes): Cipher text to decrypt
 | 
						|
            iv (bytes): IV if block mode
 | 
						|
            aad (bytes): Additional Authenticated Data to verify if auth mode
 | 
						|
            tag (bytes): Authentication tag if auth mode
 | 
						|
 | 
						|
        Returns:
 | 
						|
            bytes: Decrypted value
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def wrap_key(self, key_data):
 | 
						|
        """
 | 
						|
        Wrap the the plain text key data
 | 
						|
 | 
						|
        Args:
 | 
						|
            key_data (bytes): Key data to wrap
 | 
						|
 | 
						|
        Returns:
 | 
						|
            bytes: Wrapped key
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
    def unwrap_key(self, wrapped_key):
 | 
						|
        """
 | 
						|
        Unwrap the the wrapped key data
 | 
						|
 | 
						|
        Args:
 | 
						|
            wrapped_key (bytes): Wrapped key data to unwrap
 | 
						|
 | 
						|
        Returns:
 | 
						|
            bytes: Unwrapped key
 | 
						|
        """
 | 
						|
        raise NotImplementedError()
 | 
						|
 | 
						|
 | 
						|
class DIRKey(Key):
 | 
						|
    def __init__(self, key_data, algorithm):
 | 
						|
        self._key = ensure_binary(key_data)
 | 
						|
        self._alg = algorithm
 | 
						|
 | 
						|
    def to_dict(self):
 | 
						|
        return {
 | 
						|
            "alg": self._alg,
 | 
						|
            "kty": "oct",
 | 
						|
            "k": base64url_encode(self._key),
 | 
						|
        }
 |