Skip to content

Commit 6d096d1

Browse files
committed
fix: Clear key memory
1 parent 36ac9a8 commit 6d096d1

File tree

1 file changed

+40
-17
lines changed

1 file changed

+40
-17
lines changed

src/c2pa/c2pa.py

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)