/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "windows.storage.streams.idl";

namespace Windows {
  namespace Storage {
    namespace Streams {
      interface IBuffer;
    }
  }
}

namespace Windows {
  namespace Security {
    namespace Cryptography {
      interface ICryptographicBufferStatics;
      typedef enum BinaryStringEncoding BinaryStringEncoding;
    }
  }
}

namespace Windows {
  namespace Security {
    namespace Cryptography {
      enum BinaryStringEncoding {
        Utf8,
        Utf16LE,
        Utf16BE
      };

      [uuid(320B7E22-3CB0-4CDF-8663-1D28910065EB)]
      interface ICryptographicBufferStatics : IInspectable {
        HRESULT Compare(Windows.Storage.Streams.IBuffer* object1, IBuffer* object2, boolean* isEqual);
        HRESULT GenerateRandom(UINT32 length, IBuffer** buffer);
        HRESULT GenerateRandomNumber(UINT32* value);
        HRESULT CreateFromByteArray(UINT32 __valueSize, BYTE* value,IBuffer** buffer);
        HRESULT CopyToByteArray(IBuffer* buffer, UINT32* __valueSize, BYTE** value);
        HRESULT DecodeFromHexString(HSTRING value, IBuffer** buffer);
        HRESULT EncodeToHexString(IBuffer* buffer, HSTRING* value);
        HRESULT DecodeFromBase64String(HSTRING value, IBuffer** buffer);
        HRESULT EncodeToBase64String(IBuffer* buffer, HSTRING* value);
        HRESULT ConvertStringToBinary(HSTRING value, BinaryStringEncoding encoding, IBuffer** buffer);
        HRESULT ConvertBinaryToString(BinaryStringEncoding encoding, IBuffer* buffer, HSTRING* value);
      }
    }
  }
}
