Merge pull request #225 from dgarske/csharp_cleanup

Implement `IDisposable` for CSharp classes for cleanup of unmanaged resources
pull/226/head
Anthony Hu 2022-07-15 16:31:41 -04:00 committed by GitHub
commit 63be95dd1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 74 additions and 23 deletions

View File

@ -183,7 +183,7 @@ namespace wolfTPM
DER = 2, DER = 2,
} }
public class KeyBlob public class KeyBlob : IDisposable
{ {
const string DLLNAME = "wolftpm"; const string DLLNAME = "wolftpm";
@ -211,16 +211,24 @@ namespace wolfTPM
{ {
keyblob = wolfTPM2_NewKeyBlob(); keyblob = wolfTPM2_NewKeyBlob();
} }
~KeyBlob() => Dispose(false);
~KeyBlob() public void Dispose()
{ {
if (keyblob != IntPtr.Zero) Dispose(true);
{ GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
/* free un-managed objects */
if (keyblob != IntPtr.Zero) {
/* ignore return code */ /* ignore return code */
wolfTPM2_FreeKeyBlob(keyblob); wolfTPM2_FreeKeyBlob(keyblob);
keyblob = IntPtr.Zero;
} }
} }
public int GetKeyBlobAsBuffer(byte[] buffer) public int GetKeyBlobAsBuffer(byte[] buffer)
{ {
int rc = wolfTPM2_GetKeyBlobAsBuffer(buffer, buffer.Length, int rc = wolfTPM2_GetKeyBlobAsBuffer(buffer, buffer.Length,
@ -250,7 +258,7 @@ namespace wolfTPM
} }
} }
public class Key public class Key : IDisposable
{ {
const string DLLNAME = "wolftpm"; const string DLLNAME = "wolftpm";
@ -279,16 +287,24 @@ namespace wolfTPM
{ {
key = wolfTPM2_NewKey(); key = wolfTPM2_NewKey();
} }
~Key() => Dispose(false);
~Key() public void Dispose()
{ {
if (key != IntPtr.Zero) Dispose(true);
{ GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
/* free un-managed objects */
if (key != IntPtr.Zero) {
/* ignore return code */ /* ignore return code */
wolfTPM2_FreeKey(key); wolfTPM2_FreeKey(key);
key = IntPtr.Zero;
} }
} }
public IntPtr GetHandle() public IntPtr GetHandle()
{ {
return wolfTPM2_GetHandleRefFromKey(key); return wolfTPM2_GetHandleRefFromKey(key);
@ -311,10 +327,9 @@ namespace wolfTPM
} }
return rc; return rc;
} }
} }
public class Template public class Template : IDisposable
{ {
const string DLLNAME = "wolftpm"; const string DLLNAME = "wolftpm";
@ -329,11 +344,23 @@ namespace wolfTPM
{ {
template = wolfTPM2_NewPublicTemplate(); template = wolfTPM2_NewPublicTemplate();
} }
~Template() => Dispose(false);
~Template() public void Dispose()
{ {
wolfTPM2_FreePublicTemplate(template); Dispose(true);
GC.SuppressFinalize(this);
} }
protected virtual void Dispose(bool disposing)
{
/* free un-managed objects */
if (template != IntPtr.Zero) {
/* ignore return code */
wolfTPM2_FreePublicTemplate(template);
template = IntPtr.Zero;
}
}
/* non-device functions: template and auth */ /* non-device functions: template and auth */
[DllImport(DLLNAME, EntryPoint = "wolfTPM2_GetKeyTemplate_RSA")] [DllImport(DLLNAME, EntryPoint = "wolfTPM2_GetKeyTemplate_RSA")]
@ -476,7 +503,7 @@ namespace wolfTPM
} }
} }
public class Session public class Session : IDisposable
{ {
const string DLLNAME = "wolftpm"; const string DLLNAME = "wolftpm";
@ -497,18 +524,25 @@ namespace wolfTPM
session = wolfTPM2_NewSession(); session = wolfTPM2_NewSession();
sessionIdx = 1; /* for most commands the index is 1 */ sessionIdx = 1; /* for most commands the index is 1 */
} }
public Session(int index) public Session(int index)
{ {
session = wolfTPM2_NewSession(); session = wolfTPM2_NewSession();
sessionIdx = index; sessionIdx = index;
} }
~Session() => Dispose(false);
~Session() public void Dispose()
{ {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
/* free un-managed objects */
if (session != IntPtr.Zero) { if (session != IntPtr.Zero) {
/* ignore return code on free */ /* ignore return code */
wolfTPM2_FreeSession(session); wolfTPM2_FreeSession(session);
session = IntPtr.Zero;
} }
} }
@ -556,7 +590,7 @@ namespace wolfTPM
} }
} }
public class Csr public class Csr : IDisposable
{ {
const string DLLNAME = "wolftpm"; const string DLLNAME = "wolftpm";
@ -572,15 +606,24 @@ namespace wolfTPM
{ {
csr = wolfTPM2_NewCSR(); csr = wolfTPM2_NewCSR();
} }
~Csr() => Dispose(false);
~Csr() public void Dispose()
{ {
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
/* free un-managed objects */
if (csr != IntPtr.Zero) { if (csr != IntPtr.Zero) {
/* ignore return code on free */ /* ignore return code */
wolfTPM2_FreeCSR(csr); wolfTPM2_FreeCSR(csr);
csr = IntPtr.Zero;
} }
} }
[DllImport(DLLNAME, EntryPoint = "wolfTPM2_CSR_SetCustomExt")] [DllImport(DLLNAME, EntryPoint = "wolfTPM2_CSR_SetCustomExt")]
private static extern int wolfTPM2_CSR_SetCustomExt(IntPtr dev, private static extern int wolfTPM2_CSR_SetCustomExt(IntPtr dev,
IntPtr csr, IntPtr csr,
@ -679,7 +722,7 @@ namespace wolfTPM
} }
} }
public class Device public class Device : IDisposable
{ {
/* ================================================================== */ /* ================================================================== */
/* Constants */ /* Constants */
@ -696,12 +739,20 @@ namespace wolfTPM
{ {
device = wolfTPM2_New(); device = wolfTPM2_New();
} }
~Device() => Dispose(false);
~Device() public void Dispose()
{ {
if (device != IntPtr.Zero) Dispose(true);
{ GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
/* free un-managed objects */
if (device != IntPtr.Zero) {
/* ignore return code */
wolfTPM2_Free(device); wolfTPM2_Free(device);
device = IntPtr.Zero;
} }
} }