menuconfig ASYMMETRIC_KEY_TYPE
	bool "Asymmetric (public-key cryptographic) key Support"
	depends on FIT_SIGNATURE || RSA_VERIFY_WITH_PKEY
	help
	  This option provides support for a key type that holds the data for
	  the asymmetric keys used for public key cryptographic operations such
	  as encryption, decryption, signature generation and signature
	  verification.

if ASYMMETRIC_KEY_TYPE

config SPL_ASYMMETRIC_KEY_TYPE
	bool "Asymmetric (public-key cryptographic) key Support within SPL"
	depends on SPL
	help
	  This option provides support for a key type that holds the data for
	  the asymmetric keys used for public key cryptographic operations such
	  as encryption, decryption, signature generation and signature
	  verification in the SPL.

config ASYMMETRIC_PUBLIC_KEY_SUBTYPE
	bool "Asymmetric public-key crypto algorithm subtype"
	help
	  This option provides support for asymmetric public key type handling.
	  If signature generation and/or verification are to be used,
	  appropriate hash algorithms (such as SHA-1) must be available.
	  ENOPKG will be reported if the requisite algorithm is unavailable.

config SPL_ASYMMETRIC_PUBLIC_KEY_SUBTYPE
	bool "Asymmetric public-key crypto algorithm subtype within SPL"
	depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE && SPL
	help
	  This option provides support for asymmetric public key type handling in the SPL.
	  If signature generation and/or verification are to be used,
	  appropriate hash algorithms (such as SHA-1) must be available.
	  ENOPKG will be reported if the requisite algorithm is unavailable.

config RSA_PUBLIC_KEY_PARSER
	bool "RSA public key parser"
	depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE
	select ASN1_DECODER
	select ASN1_COMPILER
	select OID_REGISTRY
	help
	  This option provides support for parsing a blob containing RSA
	  public key data and provides the ability to instantiate a public
	  key.

config SPL_RSA_PUBLIC_KEY_PARSER
	bool "RSA public key parser within SPL"
	depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE && SPL
	select SPL_ASN1_DECODER
	select ASN1_COMPILER
	select SPL_OID_REGISTRY
	help
	  This option provides support for parsing a blob containing RSA
	  public key data and provides the ability to instantiate a public
	  key in the SPL.

config X509_CERTIFICATE_PARSER
	bool "X.509 certificate parser"
	depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE
	select ASN1_DECODER
	select ASN1_COMPILER
	select OID_REGISTRY
	select LIB_DATE
	help
	  This option provides support for parsing X.509 format blobs for key
	  data and provides the ability to instantiate a crypto key from a
	  public key packet found inside the certificate.

config PKCS7_MESSAGE_PARSER
	bool "PKCS#7 message parser"
	depends on X509_CERTIFICATE_PARSER
	select ASN1_DECODER
	select ASN1_COMPILER
	select OID_REGISTRY
	help
	  This option provides support for parsing PKCS#7 format messages for
	  signature data and provides the ability to verify the signature.

config PKCS7_VERIFY
	bool

config MSCODE_PARSER
	bool "MS authenticode parser"
	select ASN1_DECODER
	select ASN1_COMPILER
	select OID_REGISTRY
	help
	  This option provides support for parsing MicroSoft's Authenticode
	  in pkcs7 message.

endif # ASYMMETRIC_KEY_TYPE
