## @file
#  Package for cryptography modules.
#
#  This Package provides cryptographic-related libraries for UEFI security modules.
#  It also provides a test application to test libraries.
#
#  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#  This program and the accompanying materials
#  are licensed and made available under the terms and conditions of the BSD License
#  which accompanies this distribution.  The full text of the license may be found at
#  http://opensource.org/licenses/bsd-license.php
#
#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
##

[Defines]
  DEC_SPECIFICATION              = 0x00010005
  PACKAGE_NAME                   = CryptoPkg
  PACKAGE_UNI_FILE               = CryptoPkg.uni
  PACKAGE_GUID                   = 36470E80-36F2-4ba0-8CC8-937C7D9FF888
  PACKAGE_VERSION                = 0.98

[Includes]
  Include

[Includes.Common.Private]
  Library/Include
  Library/OpensslLib/openssl/include
  Library/OpensslLib/openssl/crypto/include

[LibraryClasses]
  ##  @libraryclass  Provides basic library functions for cryptographic primitives.
  ##
  BaseCryptLib|Include/Library/BaseCryptLib.h

  ##  @libraryclass  Provides TLS library functions for EFI TLS protocol.
  ##
  TlsLib|Include/Library/TlsLib.h

[Protocols]
  ## Include/Protocol/RuntimeCrypt.h
  gEfiRuntimeCryptProtocolGuid = { 0xe1475e0c, 0x1746, 0x4802, {0x86, 0x2e, 0x1, 0x1c, 0x2c, 0x2d, 0x9d, 0x86 }}

[UserExtensions.TianoCore."ExtraFiles"]
  CryptoPkgExtra.uni
