/** @file
  Defines the PCD_CRYPTO_SERVICE_FAMILY_ENABLE structure associated with
  gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.

  Copyright (c) 2019 - 2020, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __PCD_CRYPTO_SERVICE_FAMILY_ENABLE_H__
#define __PCD_CRYPTO_SERVICE_FAMILY_ENABLE_H__

///
/// Define used to enable all the crypto services in a family
///
#define PCD_CRYPTO_SERVICE_ENABLE_FAMILY  0xFFFFFFFF

///
/// PCD_CRYPTO_SERVICE_FAMILY_ENABLE structure.  Each field in this structure
/// is associated with a service in the EDK II Crypto Protocol/PPI.  This allows
/// each individual service to be enabled/disabled in a DSC file.  Services are
/// also grouped into families.  Unions are used to support enabling or
/// disabling an entire family in a single DSC statement.
///
typedef struct {
  union {
    struct {
      UINT8  New:1;
      UINT8  Free:1;
      UINT8  SetKey:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
    } Services;
    UINT32    Family;
  } HmacMd5;
  union {
    struct {
      UINT8  New:1;
      UINT8  Free:1;
      UINT8  SetKey:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
    } Services;
    UINT32    Family;
  } HmacSha1;
  union {
    struct {
      UINT8  New:1;
      UINT8  Free:1;
      UINT8  SetKey:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
    } Services;
    UINT32    Family;
  } HmacSha256;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Md4;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Md5;
  union {
    struct {
      UINT8  Pkcs1v2Encrypt:1;
      UINT8  Pkcs5HashPassword:1;
      UINT8  Pkcs7Verify:1;
      UINT8  VerifyEKUsInPkcs7Signature:1;
      UINT8  Pkcs7GetSigners:1;
      UINT8  Pkcs7FreeSigners:1;
      UINT8  Pkcs7Sign:1;
      UINT8  Pkcs7GetAttachedContent:1;
      UINT8  Pkcs7GetCertificatesList:1;
      UINT8  AuthenticodeVerify:1;
      UINT8  ImageTimestampVerify:1;
    } Services;
    UINT32    Family;
  } Pkcs;
  union {
    struct {
      UINT8  New:1;
      UINT8  Free:1;
      UINT8  GenerateParameter:1;
      UINT8  SetParameter:1;
      UINT8  GenerateKey:1;
      UINT8  ComputeKey:1;
    } Services;
    UINT32    Family;
  } Dh;
  union {
    struct {
      UINT8  Seed:1;
      UINT8  Bytes:1;
    } Services;
    UINT32    Family;
  } Random;
  union {
    struct {
      UINT8  VerifyPkcs1:1;
      UINT8  New:1;
      UINT8  Free:1;
      UINT8  SetKey:1;
      UINT8  GetKey:1;
      UINT8  GenerateKey:1;
      UINT8  CheckKey:1;
      UINT8  Pkcs1Sign:1;
      UINT8  Pkcs1Verify:1;
      UINT8  GetPrivateKeyFromPem:1;
      UINT8  GetPublicKeyFromX509:1;
    } Services;
    UINT32    Family;
  } Rsa;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Sha1;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Sha256;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Sha384;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Sha512;
  union {
    struct {
      UINT8  GetSubjectName:1;
      UINT8  GetCommonName:1;
      UINT8  GetOrganizationName:1;
      UINT8  VerifyCert:1;
      UINT8  ConstructCertificate:1;
      UINT8  ConstructCertificateStack:1;
      UINT8  ConstructCertificateStackV:1;
      UINT8  Free:1;
      UINT8  StackFree:1;
      UINT8  GetTBSCert:1;
    } Services;
    UINT32    Family;
  } X509;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  EcbEncrypt:1;
      UINT8  EcbDecrypt:1;
      UINT8  CbcEncrypt:1;
      UINT8  CbcDecrypt:1;
    } Services;
    UINT32    Family;
  } Tdes;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  EcbEncrypt:1;
      UINT8  EcbDecrypt:1;
      UINT8  CbcEncrypt:1;
      UINT8  CbcDecrypt:1;
    } Services;
    UINT32    Family;
  } Aes;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Encrypt:1;
      UINT8  Decrypt:1;
      UINT8  Reset:1;
    } Services;
    UINT32    Family;
  } Arc4;
  union {
    struct {
      UINT8  GetContextSize:1;
      UINT8  Init:1;
      UINT8  Duplicate:1;
      UINT8  Update:1;
      UINT8  Final:1;
      UINT8  HashAll:1;
    } Services;
    UINT32    Family;
  } Sm3;
  union {
    struct {
      UINT8  Sha256ExtractAndExpand;
    } Services;
    UINT32    Family;
  } Hkdf;
  union {
    struct {
      UINT8  Initialize:1;
      UINT8  CtxFree:1;
      UINT8  CtxNew:1;
      UINT8  Free:1;
      UINT8  New:1;
      UINT8  InHandshake:1;
      UINT8  DoHandshake:1;
      UINT8  HandleAlert:1;
      UINT8  CloseNotify:1;
      UINT8  CtrlTrafficOut:1;
      UINT8  CtrlTrafficIn:1;
      UINT8  Read:1;
      UINT8  Write:1;
    } Services;
    UINT32    Family;
  } Tls;
  union {
    struct {
      UINT8  Version:1;
      UINT8  ConnectionEnd:1;
      UINT8  CipherList:1;
      UINT8  CompressionMethod:1;
      UINT8  Verify:1;
      UINT8  VerifyHost:1;
      UINT8  SessionId:1;
      UINT8  CaCertificate:1;
      UINT8  HostPublicCert:1;
      UINT8  HostPrivateKey:1;
      UINT8  CertRevocationList:1;
    } Services;
    UINT32    Family;
  } TlsSet;
  union {
    struct {
      UINT8  Version:1;
      UINT8  ConnectionEnd:1;
      UINT8  CurrentCipher:1;
      UINT8  CurrentCompressionId:1;
      UINT8  Verify:1;
      UINT8  SessionId:1;
      UINT8  ClientRandom:1;
      UINT8  ServerRandom:1;
      UINT8  KeyMaterial:1;
      UINT8  CaCertificate:1;
      UINT8  HostPublicCert:1;
      UINT8  HostPrivateKey:1;
      UINT8  CertRevocationList:1;
    } Services;
    UINT32    Family;
  } TlsGet;
} PCD_CRYPTO_SERVICE_FAMILY_ENABLE;

#endif
