Skip to content

Commit c23165b

Browse files
committed
Fix resource leaks
1 parent 9a031df commit c23165b

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
@@ -649,6 +649,7 @@ def build_ffi(local_wolfssl, features):
649649
word32 sz, const byte* authIn, word32 authInSz);
650650
int wc_AesGcmDecryptFinal(Aes* aes, const byte* authTag,
651651
word32 authTagSz);
652+
void wc_AesFree(Aes* aes);
652653
"""
653654

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

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))
@@ -224,6 +225,7 @@ def decrypt(self, string):
224225
self._dec = _ffi.new(self._native_type)
225226
ret = self._set_key(_DECRYPTION)
226227
if ret < 0: # pragma: no cover
228+
self._dec = None
227229
raise WolfCryptError("Invalid key error (%d)" % ret)
228230

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

418+
def __del__(self):
419+
_lib.wc_AesFree(self._native_object)
420+
414421
def set_aad(self, data):
415422
"""
416423
Set the additional authentication data for the stream
@@ -498,10 +505,11 @@ def __init__(self, key="", size=32):
498505
self._dec = None
499506
self._key = None
500507
if len(key) > 0:
501-
if not size in self._key_sizes:
502-
raise ValueError("Invalid key size %d" % size)
503508
self._key = t2b(key)
504-
self.key_size = size
509+
if len(self._key) not in self._key_sizes:
510+
raise ValueError("key must be %s in length, not %d" %
511+
(self._key_sizes, len(self._key)))
512+
self.key_size = len(self._key)
505513
self._IV_nonce = []
506514
self._IV_counter = 0
507515

@@ -511,13 +519,13 @@ def _set_key(self, direction):
511519
if self._enc:
512520
ret = _lib.wc_Chacha_SetKey(self._enc, self._key, len(self._key))
513521
if ret == 0:
514-
_lib.wc_Chacha_SetIV(self._enc, self._IV_nonce, self._IV_counter)
522+
ret = _lib.wc_Chacha_SetIV(self._enc, self._IV_nonce, self._IV_counter)
515523
if ret != 0:
516524
return ret
517525
if self._dec:
518526
ret = _lib.wc_Chacha_SetKey(self._dec, self._key, len(self._key))
519527
if ret == 0:
520-
_lib.wc_Chacha_SetIV(self._dec, self._IV_nonce, self._IV_counter)
528+
ret = _lib.wc_Chacha_SetIV(self._dec, self._IV_nonce, self._IV_counter)
521529
if ret != 0:
522530
return ret
523531
return 0
@@ -628,6 +636,11 @@ class Des3(_Cipher):
628636
key_size = 24
629637
_native_type = "Des3 *"
630638

639+
def __init__(self, key, mode, IV=None):
640+
if mode != MODE_CBC:
641+
raise ValueError("Des3 only supports MODE_CBC")
642+
super().__init__(key, mode, IV)
643+
631644
def _set_key(self, direction):
632645
if direction == _ENCRYPTION:
633646
return _lib.wc_Des3_SetKey(self._enc, self._key,
@@ -2024,7 +2037,6 @@ def decapsulate(self, ct):
20242037
)
20252038

20262039
if ret < 0: # pragma: no cover
2027-
self.native_object = None
20282040
raise WolfCryptError("wc_KyberKey_Decapsulate() error (%d)" % ret)
20292041

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

0 commit comments

Comments
 (0)