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,
}
public class KeyBlob
public class KeyBlob : IDisposable
{
const string DLLNAME = "wolftpm";
@ -211,16 +211,24 @@ namespace wolfTPM
{
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 */
wolfTPM2_FreeKeyBlob(keyblob);
keyblob = IntPtr.Zero;
}
}
public int GetKeyBlobAsBuffer(byte[] buffer)
{
int rc = wolfTPM2_GetKeyBlobAsBuffer(buffer, buffer.Length,
@ -250,7 +258,7 @@ namespace wolfTPM
}
}
public class Key
public class Key : IDisposable
{
const string DLLNAME = "wolftpm";
@ -279,16 +287,24 @@ namespace wolfTPM
{
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 */
wolfTPM2_FreeKey(key);
key = IntPtr.Zero;
}
}
public IntPtr GetHandle()
{
return wolfTPM2_GetHandleRefFromKey(key);
@ -311,10 +327,9 @@ namespace wolfTPM
}
return rc;
}
}
public class Template
public class Template : IDisposable
{
const string DLLNAME = "wolftpm";
@ -329,11 +344,23 @@ namespace wolfTPM
{
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 */
[DllImport(DLLNAME, EntryPoint = "wolfTPM2_GetKeyTemplate_RSA")]
@ -476,7 +503,7 @@ namespace wolfTPM
}
}
public class Session
public class Session : IDisposable
{
const string DLLNAME = "wolftpm";
@ -497,18 +524,25 @@ namespace wolfTPM
session = wolfTPM2_NewSession();
sessionIdx = 1; /* for most commands the index is 1 */
}
public Session(int index)
{
session = wolfTPM2_NewSession();
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) {
/* ignore return code on free */
/* ignore return code */
wolfTPM2_FreeSession(session);
session = IntPtr.Zero;
}
}
@ -556,7 +590,7 @@ namespace wolfTPM
}
}
public class Csr
public class Csr : IDisposable
{
const string DLLNAME = "wolftpm";
@ -572,15 +606,24 @@ namespace wolfTPM
{
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) {
/* ignore return code on free */
/* ignore return code */
wolfTPM2_FreeCSR(csr);
csr = IntPtr.Zero;
}
}
[DllImport(DLLNAME, EntryPoint = "wolfTPM2_CSR_SetCustomExt")]
private static extern int wolfTPM2_CSR_SetCustomExt(IntPtr dev,
IntPtr csr,
@ -679,7 +722,7 @@ namespace wolfTPM
}
}
public class Device
public class Device : IDisposable
{
/* ================================================================== */
/* Constants */
@ -696,12 +739,20 @@ namespace wolfTPM
{
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);
device = IntPtr.Zero;
}
}