/*
 * Copyright 2025 Hans Leidekker for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
/* import "windows.security.cryptography.certificates.idl"; */
import "windows.storage.streams.idl";

namespace Windows.Security.Cryptography.Core {
    typedef enum CryptographicPublicKeyBlobType CryptographicPublicKeyBlobType;

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum CryptographicPublicKeyBlobType
    {
        X509SubjectPublicKeyInfo = 0,
        Pkcs1RsaPublicKey        = 1,
        BCryptPublicKey          = 2,
        Capi1PublicKey           = 3,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        BCryptEccFullPublicKey   = 4,
    };
}
