Skip to content

Commit 38b30ef

Browse files
committed
Fix resource leaks
1 parent 8714822 commit 38b30ef

3 files changed

Lines changed: 24 additions & 8 deletions

File tree

scripts/build_ffi.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,7 @@ def build_ffi(local_wolfssl, features):
650650
word32 sz, const byte* authIn, word32 authInSz);
651651
int wc_AesGcmDecryptFinal(Aes* aes, const byte* authTag,
652652
word32 authTagSz);
653+
void wc_AesFree(Aes* aes);
653654
"""
654655

655656
if features["AES"] and features["AES_SIV"]:
@@ -962,6 +963,7 @@ def build_ffi(local_wolfssl, features):
962963
int wc_PemToDer(const unsigned char* buff, long longSz, int type,
963964
DerBuffer** pDer, void* heap, EncryptedInfo* info,
964965
int* keyFormat);
966+
void wc_FreeDer(DerBuffer** pDer);
965967
int wc_DerToPemEx(const byte* der, word32 derSz, byte* output, word32 outSz,
966968
byte *cipher_info, int type);
967969
"""

wolfcrypt/asn.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ def pem_to_der(pem, pem_type):
4242
err = "Error converting from PEM to DER. ({})".format(ret)
4343
raise WolfCryptError(err)
4444

45-
return _ffi.buffer(der[0][0].buffer, der[0][0].length)[:]
45+
result = _ffi.buffer(der[0][0].buffer, der[0][0].length)[:]
46+
_lib.wc_FreeDer(der)
47+
return result
4648

4749
def der_to_pem(der, pem_type):
4850
pem_length = _lib.wc_DerToPemEx(der, len(der), _ffi.NULL, 0, _ffi.NULL,

wolfcrypt/ciphers.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ def encrypt(self, string):
191191
self._enc = _ffi.new(self._native_type)
192192
ret = self._set_key(_ENCRYPTION)
193193
if ret < 0: # pragma: no cover
194+
self._enc = None
194195
raise WolfCryptError("Invalid key error (%d)" % ret)
195196

196197
result = _ffi.new("byte[%d]" % len(string))
@@ -223,6 +224,7 @@ def decrypt(self, string):
223224
self._dec = _ffi.new(self._native_type)
224225
ret = self._set_key(_DECRYPTION)
225226
if ret < 0: # pragma: no cover
227+
self._dec = None
226228
raise WolfCryptError("Invalid key error (%d)" % ret)
227229

228230
result = _ffi.new("byte[%d]" % len(string))
@@ -405,11 +407,16 @@ def __init__(self, key, IV, tag_bytes=16):
405407
raise ValueError("key must be %s in length, not %d" %
406408
(self._key_sizes, len(key)))
407409
self._native_object = _ffi.new(self._native_type)
408-
_lib.wc_AesInit(self._native_object, _ffi.NULL, -2)
410+
ret = _lib.wc_AesInit(self._native_object, _ffi.NULL, -2)
411+
if ret < 0:
412+
raise WolfCryptError("AES init error (%d)" % ret)
409413
ret = _lib.wc_AesGcmInit(self._native_object, key, len(key), IV, len(IV))
410414
if ret < 0:
411415
raise WolfCryptError("Init error (%d)" % ret)
412416

417+
def __del__(self):
418+
_lib.wc_AesFree(self._native_object)
419+
413420
def set_aad(self, data):
414421
"""
415422
Set the additional authentication data for the stream
@@ -497,10 +504,11 @@ def __init__(self, key="", size=32):
497504
self._dec = None
498505
self._key = None
499506
if len(key) > 0:
500-
if size not in self._key_sizes:
501-
raise ValueError("Invalid key size %d" % size)
502507
self._key = t2b(key)
503-
self.key_size = size
508+
if len(self._key) not in self._key_sizes:
509+
raise ValueError("key must be %s in length, not %d" %
510+
(self._key_sizes, len(self._key)))
511+
self.key_size = len(self._key)
504512
self._IV_nonce = []
505513
self._IV_counter = 0
506514

@@ -510,13 +518,13 @@ def _set_key(self, direction):
510518
if self._enc:
511519
ret = _lib.wc_Chacha_SetKey(self._enc, self._key, len(self._key))
512520
if ret == 0:
513-
_lib.wc_Chacha_SetIV(self._enc, self._IV_nonce, self._IV_counter)
521+
ret = _lib.wc_Chacha_SetIV(self._enc, self._IV_nonce, self._IV_counter)
514522
if ret != 0:
515523
return ret
516524
if self._dec:
517525
ret = _lib.wc_Chacha_SetKey(self._dec, self._key, len(self._key))
518526
if ret == 0:
519-
_lib.wc_Chacha_SetIV(self._dec, self._IV_nonce, self._IV_counter)
527+
ret = _lib.wc_Chacha_SetIV(self._dec, self._IV_nonce, self._IV_counter)
520528
if ret != 0:
521529
return ret
522530
return 0
@@ -627,6 +635,11 @@ class Des3(_Cipher):
627635
key_size = 24
628636
_native_type = "Des3 *"
629637

638+
def __init__(self, key, mode, IV=None):
639+
if mode != MODE_CBC:
640+
raise ValueError("Des3 only supports MODE_CBC")
641+
super().__init__(key, mode, IV)
642+
630643
def _set_key(self, direction):
631644
if direction == _ENCRYPTION:
632645
return _lib.wc_Des3_SetKey(self._enc, self._key,
@@ -2021,7 +2034,6 @@ def decapsulate(self, ct):
20212034
)
20222035

20232036
if ret < 0: # pragma: no cover
2024-
self.native_object = None
20252037
raise WolfCryptError("wc_KyberKey_Decapsulate() error (%d)" % ret)
20262038

20272039
return _ffi.buffer(ss, ss_size)[:]

0 commit comments

Comments
 (0)