@@ -2720,28 +2720,51 @@ def ed25519_sign(data: bytes, private_key: str) -> bytes:
27202720 C2paError: If there was an error signing the data
27212721 C2paError.Encoding: If the private key contains invalid UTF-8 chars
27222722 """
2723- data_array = (ctypes .c_ubyte * len (data ))(* data )
2724- try :
2725- key_str = private_key .encode ('utf-8' )
2726- except UnicodeError as e :
2727- raise C2paError .Encoding (
2728- f"Invalid UTF-8 characters in private key: { str (e )} " )
2723+ # Validate input data
2724+ if not data :
2725+ raise C2paError ("Data to sign cannot be empty" )
27292726
2730- signature_ptr = _lib .c2pa_ed25519_sign (data_array , len (data ), key_str )
2727+ # Validate private key format
2728+ if not private_key or not isinstance (private_key , str ):
2729+ raise C2paError ("Private key must be a non-empty string" )
27312730
2732- if not signature_ptr :
2733- error = _parse_operation_result_for_error (_lib .c2pa_error ())
2734- if error :
2735- raise C2paError (error )
2736- raise C2paError ("Failed to sign data with Ed25519" )
2731+ # Create secure memory buffer for data
2732+ data_array = None
2733+ key_bytes = None
27372734
27382735 try :
2739- # Ed25519 signatures are always 64 bytes
2740- signature = bytes (signature_ptr [:64 ])
2741- finally :
2742- _lib .c2pa_signature_free (signature_ptr )
2736+ # Create data array with size validation
2737+ data_size = len (data )
2738+ data_array = (ctypes .c_ubyte * data_size )(* data )
2739+
2740+ # Encode private key to bytes
2741+ try :
2742+ key_bytes = private_key .encode ('utf-8' )
2743+ except UnicodeError as e :
2744+ raise C2paError .Encoding (
2745+ f"Invalid UTF-8 characters in private key: { str (e )} " )
2746+
2747+ # Perform the signing operation
2748+ signature_ptr = _lib .c2pa_ed25519_sign (data_array , data_size , key_bytes )
27432749
2744- return signature
2750+ if not signature_ptr :
2751+ error = _parse_operation_result_for_error (_lib .c2pa_error ())
2752+ if error :
2753+ raise C2paError (error )
2754+ raise C2paError ("Failed to sign data with Ed25519" )
2755+
2756+ try :
2757+ # Ed25519 signatures are always 64 bytes
2758+ signature = bytes (signature_ptr [:64 ])
2759+ finally :
2760+ _lib .c2pa_signature_free (signature_ptr )
2761+
2762+ return signature
2763+
2764+ finally :
2765+ if key_bytes :
2766+ ctypes .memset (key_bytes , 0 , len (key_bytes ))
2767+ del key_bytes
27452768
27462769
27472770__all__ = [
0 commit comments