diff --git a/Data/SecureMem.hs b/Data/SecureMem.hs
--- a/Data/SecureMem.hs
+++ b/Data/SecureMem.hs
@@ -11,6 +11,7 @@
 module Data.SecureMem
     ( SecureMem
     , secureMemGetSize
+    , secureMemCopy
     , ToSecureMem(..)
     -- * Allocation and early termination
     , allocateSecureMem
@@ -20,6 +21,7 @@
     -- * Pointers manipulation
     , withSecureMemPtr
     , withSecureMemPtrSz
+    , withSecureMemCopy
     -- * convertion
     , secureMemFromByteString
     ) where
@@ -84,6 +86,18 @@
                     B.memcpy dst sp sz
                     return (dst `plusPtr` sz)
           where sz = secureMemGetSize s
+
+secureMemCopy :: SecureMem -> IO SecureMem
+secureMemCopy src =
+    createSecureMem sz $ \dst ->
+    withSecureMemPtr src $ \s -> B.memcpy dst s sz
+  where sz = secureMemGetSize src
+
+withSecureMemCopy :: SecureMem -> (Ptr Word8 -> IO ()) -> IO SecureMem
+withSecureMemCopy sm f = do
+    sm2 <- secureMemCopy sm
+    withSecureMemPtr sm2 f
+    return sm2
 
 instance Show SecureMem where
     show _ = "<secure-mem>"
diff --git a/securemem.cabal b/securemem.cabal
--- a/securemem.cabal
+++ b/securemem.cabal
@@ -1,5 +1,5 @@
 Name:                securemem
-Version:             0.1.1
+Version:             0.1.2
 Synopsis:            abstraction to an auto scrubbing and const time eq, memory chunk.
 Description:
     SecureMem is similar to ByteString, except that it provides a memory chunk that
