예제 #1
0
        internal static byte[] Decode(string input, Crypt32.CrypBinaryFlags flags,
                                      int inputSize)
        {
            int outputSize = 0;
            int pdwSkip;
            int pdwFlags;

            if (!Crypt32.CryptStringToBinary(input, inputSize, flags, IntPtr.Zero,
                                             ref outputSize, out pdwSkip, out pdwFlags))
            {
                int nativeError = Marshal.GetLastWin32Error();
                throw new InteropException(nativeError);
            }
            IntPtr nativeBuffer = IntPtr.Zero;

            try {
                nativeBuffer = Marshal.AllocCoTaskMem(outputSize);
                if (!Crypt32.CryptStringToBinary(input, inputSize, flags, nativeBuffer,
                                                 ref outputSize, out pdwSkip, out pdwFlags))
                {
                    int nativeError = Marshal.GetLastWin32Error();
                    throw new InteropException(nativeError);
                }
                byte[] result = new byte[outputSize];
                Marshal.Copy(nativeBuffer, result, 0, outputSize);
                return(result);
            }
            finally { if (IntPtr.Zero != nativeBuffer)
                      {
                          Marshal.FreeCoTaskMem(nativeBuffer);
                      }
            }
        }
예제 #2
0
        internal static string Encode(byte[] input, Crypt32.CrypBinaryFlags flags,
                                      Encoding encoding)
        {
            int output_size = 0;

            byte[] result = null;
            _Encode(input, input.Length, ref result, ref output_size, flags, true, false);
            result = new byte[output_size];
            _Encode(input, input.Length, ref result, ref output_size, flags, false, false);
            return(encoding.GetString(result));
        }
예제 #3
0
 private static void _Encode(byte[] input, int input_size, ref byte[] output,
                             ref int output_size, Crypt32.CrypBinaryFlags flags, bool get_only_size,
                             bool alloc_buffer)
 {
     if (get_only_size)
     {
         output_size = 0;
         output      = null;
     }
     else
     {
         if (alloc_buffer)
         {
             output = new byte[output_size];
         }
     }
     if (!Crypt32.CryptBinaryToString(input, input_size, flags, output, ref output_size))
     {
         throw new InteropException();
     }
 }