/// <summary> /// Initializes a new instance of the CkAesCbcEncryptDataParams class. /// </summary> /// <param name='aesKeyBits'>Length of the temporary AES key in bits</param> /// <param name='oaepParams'>Parameters of the temporary AES key wrapping</param> public CkRsaAesKeyWrapParams(uint aesKeyBits, CkRsaPkcsOaepParams oaepParams) { _lowLevelStruct.AESKeyBits = 0; _lowLevelStruct.OAEPParams = IntPtr.Zero; if (oaepParams == null) { throw new ArgumentNullException("oaepParams"); } // Keep the reference to OAEP params so GC will not free it while this object exists _oaepParams = oaepParams; _lowLevelStruct.AESKeyBits = aesKeyBits; _lowLevelStruct.OAEPParams = UnmanagedMemory.Allocate(UnmanagedMemory.SizeOf(typeof(CK_RSA_PKCS_OAEP_PARAMS))); UnmanagedMemory.Write(_lowLevelStruct.OAEPParams, oaepParams.ToMarshalableStructure()); }
/// <summary> /// Disposes object /// </summary> /// <param name="disposing">Flag indicating whether managed resources should be disposed</param> protected virtual void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { // Dispose managed objects // Release the reference to OAEP params so GC knows this object doesn't need it anymore _oaepParams = null; } // Dispose unmanaged objects _lowLevelStruct.AESKeyBits = 0; UnmanagedMemory.Free(ref _lowLevelStruct.OAEPParams); _disposed = true; } }
public void _03_EncryptAndDecryptSinglePartOaepTest() { if (Platform.UnmanagedLongSize != 4 || Platform.StructPackingSize != 0) Assert.Inconclusive("Test cannot be executed on this platform"); using (Pkcs11 pkcs11 = new Pkcs11(Settings.Pkcs11LibraryPath, Settings.UseOsLocking)) { // Find first slot with token present Slot slot = Helpers.GetUsableSlot(pkcs11); // Open RW session using (Session session = slot.OpenSession(false)) { // Login as normal user session.Login(CKU.CKU_USER, Settings.NormalUserPin); // Generate key pair ObjectHandle publicKey = null; ObjectHandle privateKey = null; Helpers.GenerateKeyPair(session, out publicKey, out privateKey); // Specify mechanism parameters CkRsaPkcsOaepParams mechanismParams = new CkRsaPkcsOaepParams((uint)CKM.CKM_SHA_1, (uint)CKG.CKG_MGF1_SHA1, (uint)CKZ.CKZ_DATA_SPECIFIED, null); // Specify encryption mechanism with parameters Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS_OAEP, mechanismParams); byte[] sourceData = ConvertUtils.Utf8StringToBytes("Hello world"); // Encrypt data byte[] encryptedData = session.Encrypt(mechanism, publicKey, sourceData); // Do something interesting with encrypted data // Decrypt data byte[] decryptedData = session.Decrypt(mechanism, privateKey, encryptedData); // Do something interesting with decrypted data Assert.IsTrue(Convert.ToBase64String(sourceData) == Convert.ToBase64String(decryptedData)); session.DestroyObject(privateKey); session.DestroyObject(publicKey); session.Logout(); } } }