Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  Microsoft Windows Embedded Compact Cryptographic Primitives Library (bcrypt.dll) Security Policy Document Microsoft Windows Embedded Compact 7 Operating System FIPS 140‐2 Security Policy Document   This document specifies the security policy for  the Microsoft Windows Cryptographic Primitives Library  (BCRYPT.DLL) as  described in FIPS PUB 140‐2.   July 18,  2013  Document Version: 1.6  This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  The information contained in this document represents the current view of Microsoft Corporation on the issues discussed as of the date of publication. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information presented after the date of publication. This document is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, AS TO THE INFORMATION IN THIS DOCUMENT. Complying with all applicable copyright laws is the responsibility of the user. This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs License (which allows redistribution of the work). To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Microsoft may have patents, patent applications, trademarks, copyrights, or other intellectual property rights covering subject matter in this document. Except as expressly provided in any written license agreement from Microsoft, the furnishing of this document does not give you any license to these patents, trademarks, copyrights, or other intellectual property. The example companies, organizations, products, people and events depicted herein are fictitious. No association with any real company, organization, product, person or event is intended or should be inferred. © 2012 Microsoft Corporation. All rights reserved. Microsoft, Active Directory, Visual Basic, Visual Studio, Windows, the Windows logo, Windows NT, Windows Server, Windows Vista, and Windows Embedded Compact 7 are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners. This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  Contents 1 Cryptographic Module Specification ...........................................................................................................................    6 1.1  Cryptographic Boundary ..............................................................................................................................    6 2 Security  olicy .................................................................................................................................................................    P 6 3  Cryptographic Module  orts  and Interfaces ..............................................................................................................    P 8 3.1 P o r t s  and Interfaces ..................................................................................................................................    8 3.1.1 E x p o r t  Functions ....................................................................................................................................    8 3.1.2 Data Input and Output Interfaces ..........................................................................................................    8 3.1.3 Control Input Interface .............................................................................................................................    8 3.1.4 Status Output Interface ...........................................................................................................................    8 3.2 Cryptographic Bypass .....................................................................................................................................    8 4 Roles  nd Authentication ..............................................................................................................................................    a 9 4.1 Roles .....................................................................................................................................................................    9 4.2 Maintenance Roles .........................................................................................................................................    9 4.3 Operator Authentication ..............................................................................................................................    9 5  Services  ........................................................................................................................................................................    . 9 5.1 Algorithm Providers and Properties .........................................................................................................    9 5.1.1 BCryptOpenAlgorithmProvider .................................................................................................................    9 5.1.2 BCryptCloseAlgorithmProvider .................................................................................................................    9 5.1.3 BCryptSetProperty  .....................................................................................................................................    . 9 5.1.4 BCryptGetProperty ...................................................................................................................................  0  1 5.1.5 BCryptFreeBuffer ......................................................................................................................................  0  1 5.2 Random Number Generation ....................................................................................................................  0  1 5.2.1 BCryptGenRandom ....................................................................................................................................  0  1 5.3 Key and  Key‐Pair Generation ......................................................................................................................  0  1 5.3.1 BCryptGenerateSymmetricKey ..............................................................................................................  0  1 5.3.2 BCryptGenerateKeyPair ...........................................................................................................................  0  1 5.3.3 BCryptFinalizeKeyPair ...............................................................................................................................  0  1 5.3.4 BCryptDuplicateKey ...................................................................................................................................  1  1 5.3.5 BCryptDestroyKey ......................................................................................................................................  1  1 5.4 Key Entry and Output ....................................................................................................................................  1  1 5.4.1 BCryptImportKey........................................................................................................................................  1  1 5.4.2 BCryptImportKeyPair ................................................................................................................................  1  1 5.4.3 BCryptExportKey ........................................................................................................................................  2  1 5.5 Encryption and  Decryption .........................................................................................................................  2  1 5.5.1 BCryptEncrypt ............................................................................................................................................  2  1 5.5.2 BCryptDecrypt ............................................................................................................................................  3  1 This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  5.6 Hashing and HMAC ..........................................................................................................................................  4  1 5.6.1 BCryptCreateHash .....................................................................................................................................  4  1 5.6.2 BCryptHashData .........................................................................................................................................  4  1 5.6.3 BCryptDuplicateHash ................................................................................................................................  4  1 5.6.4 BCryptFinishHash .......................................................................................................................................  5  1 5.6.5 BCryptDestroyHash  ...................................................................................................................................  5  . 1 5.7 Signing and Verification ................................................................................................................................  5  1 5.7.1 BCryptSignHash ...........................................................................................................................................  5  1 5.7.2 BCryptVerifySignature ..............................................................................................................................  5  1 5.8 Secret Agreement and  Key Derivation ...................................................................................................  6  1 5.8.1 BCryptSecretAgreement .........................................................................................................................  6  1 5.8.2 BCryptDeriveKey  ........................................................................................................................................  6  . 1 5.8.3 BCryptDestroySecret ................................................................................................................................  6  1 5.9 Configuration ..................................................................................................................................................  7  1 These are not cryptographic functions. They are used to configure cryptographic providers on the system, and are  provided for informational purposes. Please see http://msdn.microsoft.com for details.  ..........................................  7  . 1 6 Operational Environment ...........................................................................................................................................  8  1 7 C r y p t o g r a p h i c   K e y   M a n a g e m e n t  .........................................................................  8  1 7.1 Cryptographic Keys, CSPs, and  SRDIs .......................................................................................................  8  1 7.2 Access Control Policy .....................................................................................................................................  9  1 7.3 Key Material ......................................................................................................................................................  0  2 7.4 Key Generation ................................................................................................................................................  0  2 7.5 Key Establishment ..........................................................................................................................................  0  2 7.6 Key Entry and Output ....................................................................................................................................  0  2 7.7 Key Storage .......................................................................................................................................................  0  2 7.8 Key Archival ........................................................................................................................................................  0  2 7.9 Key Zeroization  ................................................................................................................................................  0  . 2 8  Self‐Tests ....................................................................................................................................................................  0  2 9 Design Assurance .........................................................................................................................................................  1  2 10 Additional details .......................................................................................................................................................  1  2   This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  1 Cryptographic Module Specification The Microsoft Windows Cryptographic Primitives Library is a general purpose, software‐based, cryptographic module.  The primitive provider functionality is offered through one cryptographic module, BCRYPT.DLL (version 7.00.1687),  subject to  FIPS‐140‐2 validation. BCRYPT.DLL provides cryptographic services, through its documented  interfaces, to  Windows Embedded Compact 7 components and applications running on  Windows Embedded Compact  7.  The  cryptographic module, BCRYPT.DLL, encapsulates several different cryptographic algorithms in an easy‐ to‐use cryptographic module accessible via the Microsoft CNG (Cryptography,  Next  Generation) API. It  can  be  dynamically linked into applications by  software developers to  permit the use  of general‐ purpose FIPS 140‐ 2 Level 1  compliant cryptography.  1.1 Cryptographic Boundary The  Windows Embedded Compact 7 BCRYPT.DLL consists of a  dynamically‐linked library (DLL). The  cryptographic  boundary for  BCRYPT.DLL is defined as  the enclosure of the computer system, on  which BCRYPT.DLL is to  be  executed. The  physical configuration of BCRYPT.DLL, as  defined in FIPS‐140‐2, is multi‐chip standalone.  2 Security Policy BCRYPT.DLL operates under several rules that encapsulate its security policy.   BCRYPT.DLL is supported on  Windows Embedded Compact 7.   Windows Embedded Compact 7 is an  operating system s u p p o r t i n g  a  “single user”  mode where there i s   only one interactive user during a  logon session.  BCRYPT.DLL is only in its Approved mode of operation when Windows Embedded Compact 7 is booted n o r ma l l y , meaning Debug mode is disabled.  All users assume either the User or Cryptographic Officer roles.  BCRYPT.DLL provides no authentication of users. Roles are assumed implicitly. The authentication provided by the Windows Embedded Compact 7 operating system i s not in the scope of the validation.  All cryptographic services implemented within BCRYPT.DLL are available to the User and Cryptographic Officer roles.  BCRYPT.DLL implements the following FIPS‐140‐2 Approved algorithms:  o SHA‐1, SHA‐256, SHA‐384, SHA‐512  hash (Cert. #1773)  o SHA‐1, SHA‐256, SHA‐384, SHA‐512 H M A C  (Cert. #1364)  o Triple‐DES (2  key  and  3  key)  in ECB and CBC modes (Cert. # 1307). 2 key is restricted to legacy use  per SP 800‐131. Users of the BCrypt.dll should transition away from 2 key algorithms in favor of  encryption algorithms.  o AES‐128, AES‐192, AES‐256 in ECB and CBC modes (Cert. # 2023)  o RSA (RSASSA‐PKCS1‐v1_5)   d i g i t a l   s i g n a t u r e s   ( C e r t .   1 0 5 1 )   o FIPS 186‐2 DSA  (Cert. #645)  o ECDSA  with the following NIST curves: P‐256,  P‐384,  P‐521  (Cert.  #295).  o SP 800‐90 Deterministic Random Bit Generator (DRBG) with AES‐CTR  (Cert. #193)   BCRYPT.DLL supports the following non‐Approved algorithms allowed for  use  in FIPS mode:  o Diffie‐Hellman (DH) secret agreement (key  agreement; key  establishment methodology  provides between 80  and  150  bits of encryption strength; non‐compliant less than 80‐bits  of encryption strength)  o RSA Key wrapping (key agreement; key establishment methodology provides between 80 and 150  bits of encryption strength. Keys can be entered by using the recipient’s public key, per Section  7.6)  o ECDH with the following NIST curves: P‐256,  P‐384,  P‐521  (key  agreement; key  establishment methodology provides between 128  and  256  bits of encryption strength)  o FIPS SP800‐56A (Section 5.8), X9.63, and X9.42 key derivation  o FIPS IPsec IKE v1 key derivation as specified in FIPS 140‐2 Implementation Guidance D.8  This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  FIPS SSLv3.1 and TLS v1.0 key derivation as specified in FIPS 140‐2 Implementation Guidance D.8  o Non‐Approved RNG (NewGenRandom) – Used to seed the Approved random number generators  o Dual‐EC DRBG non‐Approved implementation  o    BCRYPT.DLL also supports the following non FIPS 140‐2 approved algorithms, though these algorithms may not be used when operating the module in a FIPS compliant manner: o RC2, RC4, MD2, MD4, MD51.  o DES in ECB, CBC, and  CFB  with 8‐bit feedback  The  following diagram illustrates the master  components of the BCRYPT.DLL module    BCRYPT.DLL was  tested using the following machine configurations:  ARMV5  Microsoft Windows Embedded Compact 7 – iMX27  ARMV6  Microsoft Windows Embedded Compact 7 – Samsung SMDK 6410 ARMV7  Microsoft Windows Embedded Compact 7 ‐ TI OMAP EVM3530 EVM2 ARM Cortex A8 Processor  x86  Microsoft Windows Embedded Compact 7 – i586 (MSTI PDX‐600)  MIPS  Microsoft Windows Embedded Compact 7 – Sigma Designs SMP8654 (MIPSII)   MIPS  Microsoft Windows Embedded Compact 7 – Sigma Designs SMP8654 (MIPSII_FP)   1  Applications may  not  use  any  of these non‐FIPS  algorithms if  they  need to  be  FIPS compliant. To operate the module in a  FIPS  compliant manner, applications must only use  FIPS‐approved  algorithms.    This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  3 Cryptographic Module Ports and Interfaces 3.1 P o r t s and Interfaces 3.1.1 E x p o r t Functions The  following list contains the functions exported by  BCRYPT.DLL to  its callers.  • BCryptCloseAlgorithmProvider • BCryptCreateHash • BCryptDecrypt • BCryptDeriveKey • BCryptDestroyHash • BCryptDestroyKey • BCryptDestroySecret • BCryptDuplicateHash • BCryptDuplicateKey • BCryptEncrypt • BCryptExportKey • BCryptFinalizeKeyPair • BCryptFinishHash • BCryptFreeBuffer • BCryptGenerateKeyPair • BCryptGenerateSymmetricKey • BCryptGenRandom • BCryptGetProperty • BCryptHashData • BCryptImportKey • BCryptImportKeyPair • BCryptOpenAlgorithmProvider • BCryptSecretAgreement • BCryptSetProperty • BCryptSignHash • BCryptVerifySignature Additionally, BCRYPT.DLL exports crypto  configuration functions. They  are  described in a  separate section  below for  informational purposes.  3.1.2 Data Input and Output Interfaces The  Data  Input Interface for  BCRYPT.DLL consists of the BCRYPT  export functions. Data  and  options are passed  to  the interface as  input parameters to  the BCRYPT  export functions. Data  Input is kept  separate from  Control Input by  passing Data  Input in separate parameters from  Control Input.  The  Data  Output Interface for  BCRYPT.DLL also consists of the BCRYPT  export functions.  3.1.3 Control Input Interface The  Control Input Interface for  BCRYPT.DLL also consists of the BCRYPT  export functions. Options for control  operations are  passed as  input parameters to  the BCRYPT  export functions.  3.1.4 Status Output Interface The  Status Output Interface for  BCRYPT.DLL also consists of the BCRYPT  export functions. For each function, the  status information is returned to  the caller as  the return value from  the function.  3.2 Cryptographic Bypass Cryptographic bypass is not  supported by  BCRYPT.DLL.  This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  4 Roles and Authentication 4.1 Roles BCRYPT.DLL provides User  and  Cryptographic Officer roles (as  defined in FIPS 140‐2). These roles share all the  services implemented in the cryptographic module.  When  an  application requests the crypto  module to  generate keys  for  a  user, the keys  are  generated, used,  and  deleted as  requested by  applications. There are  no  implicit keys  associated with a  user. Each user may  have numerous keys,  and  each user’s keys  are  separate from  other users’ keys.  4.2 Maintenance Roles Maintenance roles are  not  supported by  BCRYPT.DLL.  4.3 Operator Authentication The  module does not  provide authentication. Roles are  implicitly assumed based  on  the services that are  executed.  5 Services The  following list contains all services available to  an  operator. All  services are  accessible to  both  the User  and  Crypto  Officer roles.  5.1 Algorithm Providers and Properties 5.1.1 BCryptOpenAlgorithmProvider NTSTATUS WINAPI  BCryptOpenAlgorithmProvider( BCRYPT_ALG_HANDLE *phAlgorithm, LPCWSTR  pszAlgId,  LPCWSTR  pszImplementation, ULONG dwFlags);  The  BCryptOpenAlgorithmProvider() function has  four  parameters: algorithm handle output to  the opened  algorithm provider, desired algorithm ID input, an  optional specific provider name input, and  optional flags.  This function loads and  initializes a  CNG provider for  a  given algorithm, and  returns a  handle to  the opened  algorithm provider on  success. See  http://msdn.microsoft.com for  CNG  providers. Unless the calling  function specifies the name of the provider, the default provider is used. The  default provider is the first  provider listed for  a  given algorithm. The  calling function must pass the BCRYPT_ALG_HANDLE_HMAC_FLAG  flag in  order to  use  an  HMAC  function with a  hash algorithm.  5.1.2 BCryptCloseAlgorithmProvider NTSTATUS WINAPI  BCryptCloseAlgorithmProvider( BCRYPT_ALG_HANDLE hAlgorithm, ULONG dwFlags);  This function closes an  algorithm provider handle opened by  a  call to  BCryptOpenAlgorithmProvider()  function.  5.1.3 BCryptSetProperty NTSTATUS WINAPI  BCryptSetProperty( BCRYPT_HANDLE hObject, LPCWSTR  pszProperty, PUCHAR pbInput, ULONG  cbInput, ULONG dwFlags);  The  BCryptSetProperty() function sets the value of a  named  property for  a  CNG  object, e.g., a cryptographic  key.  The  CNG object is referenced by a  handle, the property name is a  NULL  terminated string, and  the value  of the property is a  length‐specified byte  string.  User can pass BCRYPT_INTERNAL_AESCTR_RNG_SELF_TEST to pass pbInput (as pbEntropy) to AesCtrRng_Instantiate. However, BCryptSetProperty does not support pbPersonalizationString. This Security Policy is non‐proprietary and may be reproduced only in its original entirety (without revision)  Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  5.1.4 BCryptGetProperty NTSTATUS WINAPI  BCryptGetProperty( BCRYPT_HANDLE hObject, LPCWSTR  pszProperty, PUCHAR pbOutput, ULONG  cbOutput, ULONG *pcbResult, ULONG dwFlags);  The  BCryptGetProperty() function retrieves the value of a  named  property for  a  CNG  object, e.g., a  cryptographic key.  The  CNG object is referenced by  a  handle, the property name is a  NULL  terminated string,  and  the value of the property is a  length‐specified byte  string.  5.1.5 BCryptFreeBuffer VOID WINAPI  BCryptFreeBuffer( PVOID pvBuffer);  Some  of the CNG  functions allocate memory on  caller’s behalf. The  BCryptFreeBuffer() function frees memory  that was  allocated by  such  a  CNG  function.  5.2 Random Number Generation 5.2.1 BCryptGenRandom NTSTATUS WINAPI  BCryptGenRandom( BCRYPT_ALG_HANDLE hAlgorithm, PUCHAR pbBuffer, ULONG cbBuffer, ULONG  dwFlags);  The  BCryptGenRandom()  function fills  a  buffer  with random bytes. There are  three  random  number generation  algorithms:   BCRYPT_RNG_ALGORITHM. The random‐number generator algorithm based on the AES counter mode  specified in the NIST SP 800‐90 standard.   BCRYPT_RNG_FIPS186_DSA_ALGORITHM. This is the random  number generator  algorithm suitable for DSA  (Digital Signature Algorithm) as  defined in FIPS 186‐2.   BCRYPT_RNG_DUAL_EC_ALGORITHM. This is the dual elliptic curve random‐number generator algorithm specified  in the NIST SP 800‐90 standard.  When  BCRYPT_RNG_USE_ENTROPY_IN_BUFFER  is specified in the dwFlags parameter, this function will use  the  number in the pbBuffer buffer  as  additional entropy for  the random  number. If this flag is not specified, this  function will  use  a  random  number for  the entropy.  5.3 Key and Key‐Pair Generation 5.3.1 BCryptGenerateSymmetricKey NTSTATUS WINAPI  BCryptGenerateSymmetricKey( BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE *phKey,  PUCHAR pbKeyObject, ULONG cbKeyObject, PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);  The  BCryptGenerateSymmetricKey() function generates a  symmetric key  object for  use  with a  symmetric  encryption algorithm from  a  supplied cbSecret  bytes long key  value provided in the  pbSecret  memory  location. The  calling application must specify a  handle to  the algorithm provider opened with the  BCryptOpenAlgorithmProvider() function. The  algorithm specified when the provider was  opened must  support symmetric key  encryption.  5.3.2 BCryptGenerateKeyPair NTSTATUS WINAPI  BCryptGenerateKeyPair( BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_KEY_HANDLE *phKey, ULONG  dwLength, ULONG dwFlags);  The  BCryptGenerateKeyPair() function creates a  public/private key  pair object without any  cryptographic keys  in it. After creating such  an  empty key  pair object using this function, call the BCryptSetProperty() function to  set its properties. The  key  pair can  be  used only after BCryptFinalizeKeyPair() function is called.  5.3.3 BCryptFinalizeKeyPair NTSTATUS WINAPI  BCryptFinalizeKeyPair( BCRYPT_KEY_HANDLE hKey, ULONG dwFlags);  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 10 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  The  BCryptFinalizeKeyPair() function completes a  public/private key  pair import or  generation. The  key pair  cannot be  used until this function has  been called. After this function has  been called, the BCryptSetProperty()  function can  no  longer be  used for  this key  pair.  5.3.4 BCryptDuplicateKey NTSTATUS WINAPI  BCryptDuplicateKey( BCRYPT_KEY_HANDLE hKey, BCRYPT_KEY_HANDLE *phNewKey, PUCHAR  pbKeyObject, ULONG cbKeyObject, ULONG dwFlags);  The  BCryptDuplicateKey() function creates a  duplicate of a  symmetric key  object.  5.3.5 BCryptDestroyKey NTSTATUS WINAPI  BCryptDestroyKey( BCRYPT_KEY_HANDLE hKey);  The  BCryptDestroyKey() function destroys a  key.  5.4 Key Entry and Output 5.4.1 BCryptImportKey NTSTATUS WINAPI  BCryptImportKey( BCRYPT_ALG_HANDLE  hAlgorithm, BCRYPT_KEY_HANDLE  hImportKey, LPCWSTR  pszBlobType, BCRYPT_KEY_HANDLE  *phKey, PUCHAR pbKeyObject, ULONG cbKeyObject, PUCHAR pbInput, ULONG  cbInput, ULONG dwFlags);  The  BCryptImportKey() function imports a  symmetric key  from  a  key  blob.  hAlgorithm [in] is the handle of the algorithm provider to  import the key.  This handle is obtained by calling the  BCryptOpenAlgorithmProvider function.  hImportKey [in, out] is not  currently used and  should be  NULL.  pszBlobType [in] is a  null‐terminated Unicode string that contains an  identifier that specifies the type  of BLOB  that is contained in the pbInput  buffer. pszBlobType can  be  one  of BCRYPT_KEY_DATA_BLOB and  BCRYPT_OPAQUE_KEY_BLOB.  phKey [out] is a  pointer to  a  BCRYPT_KEY_HANDLE  that receives the handle of the imported key  that is used in  subsequent functions that require a  key,  such  as  BCryptEncrypt.  This handle must be  released when it is no longer needed by passing it to the BCryptDestroyKey function. pbKeyObject [out] is a pointer to a buffer that receives the imported key object. The cbKeyObject parameter contains the size of this buffer. The required size of this buffer can be obtained by calling the BCryptGetProperty function to get the BCRYPT_OBJECT_LENGTH property. This will provide the size of the key object for the specified algorithm. This memory can only be freed after the phKey key handle is destroyed. cbKeyObject [in] is the size, in bytes, of the pbKeyObject buffer. pbInput [in] is the address of a buffer that contains the key BLOB to import. The cbInput parameter contains the size of this buffer. The pszBlobType parameter specifies the type of key BLOB this buffer contains. cbInput [in] is the size, in bytes, of the pbInput buffer. dwFlags [in] is a set of flags that modify the behavior of this function. No flags are currently defined, so this parameter should be zero. 5.4.2 BCryptImportKeyPair NTSTATUS WINAPI  BCryptImportKeyPair( BCRYPT_ALG_HANDLE  hAlgorithm, BCRYPT_KEY_HANDLE  hImportKey, LPCWSTR  pszBlobType, BCRYPT_KEY_HANDLE  *phKey, PUCHAR pbInput, ULONG cbInput, ULONG dwFlags);  The  BCryptImportKeyPair() function is used to  import a  public/private key  pair from  a  key  blob.  hAlgorithm [in] is the handle of the algorithm provider to  import the key.  This handle is obtained by calling the  BCryptOpenAlgorithmProvider function.  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 11 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  hImportKey [in, out] is not  currently used and  should be  NULL.  pszBlobType [in] is a  null‐terminated Unicode string that contains an  identifier that specifies the type  of BLOB  that is contained in the pbInput buffer. This can  be  one  of the following values: BCRYPT_DH_PRIVATE_BLOB,  BCRYPT_DH_PUBLIC_BLOB, BCRYPT_DSA_PRIVATE_BLOB, BCRYPT_DSA_PUBLIC_BLOB, BCRYPT_PUBLIC_KEY_BLOB,  BCRYPT_PRIVATE_KEY_BLOB, BCRYPT_RSAPRIVATE_BLOB, BCRYPT_RSAPUBLIC_BLOB, LEGACY_DH_PUBLIC_BLOB,  LEGACY_DH_PRIVATE_BLOB, LEGACY_DSA_PRIVATE_BLOB, LEGACY_DSA_PUBLIC_BLOB, LEGACY_DSA_V2_PRIVATE_BLOB,  LEGACY_RSAPRIVATE_BLOB, LEGACY_RSAPUBLIC_BLOB.  phKey [out] is a  pointer to  a  BCRYPT_KEY_HANDLE  that receives the handle of the imported key.  This  handle is used in subsequent functions that require a  key,  such  as  BCryptSignHash. This handle must be  released when it is no  longer needed by  passing it to  the BCryptDestroyKey function.  pbInput  [in] is the address of a  buffer  that contains the key  BLOB  to  import. The  cbInput parameter contains  the size of this buffer. The  pszBlobType parameter specifies the type  of key  BLOB  this buffer contains.  cbInput  [in] contains the size, in bytes, of the pbInput buffer.  dwFlags [in] is a  set of flags that modify the behavior of this function. This can  be  zero  or  the following value:  BCRYPT_NO_KEY_VALIDATION.  5.4.3 BCryptExportKey NTSTATUS WINAPI  BCryptExportKey( BCRYPT_KEY_HANDLE hKey, BCRYPT_KEY_HANDLE hExportKey, LPCWSTR  pszBlobType, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);  The  BCryptExportKey() function exports a  key  to  a  memory blob that can  be  persisted for  later use.  hKey [in] is the handle of the key  to  export.  hExportKey [in, out] is not  currently used and  should be  set  to  NULL.  pszBlobType [in] is a  null‐terminated Unicode string that contains an  identifier that specifies the type  of BLOB  to  export. This can  be  one  of the following values: BCRYPT_DH_PRIVATE_BLOB, BCRYPT_DH_PUBLIC_BLOB,  BCRYPT_DSA_PRIVATE_BLOB, BCRYPT_DSA_PUBLIC_BLOB, BCRYPT_ECCPRIVATE_BLOB, BCRYPT_ECCPUBLIC_BLOB,  BCRYPT_KEY_DATA_BLOB, BCRYPT_OPAQUE_KEY_BLOB, BCRYPT_PUBLIC_KEY_BLOB, BCRYPT_PRIVATE_KEY_BLOB,  BCRYPT_RSAPRIVATE_BLOB, BCRYPT_RSAPUBLIC_BLOB, LEGACY_DH_PRIVATE_BLOB, LEGACY_DH_PUBLIC_BLOB,  LEGACY_DSA_PRIVATE_BLOB, LEGACY_DSA_PUBLIC_BLOB, LEGACY_DSA_V2_PRIVATE_BLOB, LEGACY_RSAPRIVATE_BLOB,  LEGACY_RSAPUBLIC_BLOB.  pbOutput is the address of a buffer that receives the key BLOB. The cbOutput parameter contains the size of this buffer. If this parameter is NULL, this function will place the required size, in bytes, in the ULONG pointed to by the pcbResult parameter. cbOutput [in] contains the size, in bytes, of the pbOutput buffer. pcbResult [out] is a pointer to a ULONG that receives the number of bytes that were copied to the pbOutput buffer. If the pbOutput parameter is NULL, this function will place the required size, in bytes, in the ULONG pointed to by this parameter. dwFlags [in] is a set of flags that modify the behavior of this function. No flags are defined for this function. 5.5 Encryption and Decryption 5.5.1 BCryptEncrypt NTSTATUS WINAPI  BCryptEncrypt( BCRYPT_KEY_HANDLE  hKey, PUCHAR pbInput, ULONG cbInput, VOID *pPaddingInfo,  PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);  The  BCryptEncrypt()  function encrypts a  block of data of given length.  hKey [in, out] is the handle of the key  to  use  to  encrypt the data. This handle is obtained from  one  of the key  creation functions, such  as  BCryptGenerateSymmetricKey, BCryptGenerateKeyPair, or BCryptImportKey.  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 12 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  pbInput  [in] is the address of a  buffer  that contains the plaintext to  be  encrypted. The  cbInput parameter  contains the size of the plaintext to  encrypt. For more information, see Remarks.  cbInput  [in] is the number of bytes in the pbInput buffer  to  encrypt.  pPaddingInfo [in, optional] is a  pointer to  a  structure that contains padding information. The  actual type of  structure this parameter points to  depends on  the value of the dwFlags parameter. This parameter is only  used with asymmetric keys  and  must be  NULL  otherwise.  pbIV [in, out, optional] is the address of a  buffer  that contains the initialization vector (IV) to  use  during  encryption. The  cbIV parameter contains the size of this buffer. This function will  modify the contents of this  buffer. If you  need to  reuse the IV later, make sure you  make a  copy  of this buffer  before calling this function.  This parameter is optional and  can  be  NULL if  no  IV is used. The  required size of the IV  can  be obtained by  calling the BCryptGetProperty function to  get  the BCRYPT_BLOCK_LENGTH  property. This will provide the size of a  block for  the algorithm, which is also the size of the IV.  cbIV [in] contains the size, in bytes, of the pbIV buffer.  pbOutput  [out, optional] is the address of a  buffer  that will receive the ciphertext produced by this function.  The  cbOutput parameter contains the size of this buffer. For more information, see Remarks. If this parameter  is NULL, this function will  calculate the size needed for  the ciphertext and  return the size in the location  pointed to  by  the pcbResult parameter.  cbOutput  [in] contains the size, in bytes, of the pbOutput buffer. This parameter is ignored if the  pbOutput parameter  is NULL.  pcbResult [out] is a  pointer to  a  ULONG  variable that receives the number of bytes copied to  the pbOutput  buffer. If pbOutput is NULL, this receives the size, in bytes, required for  the ciphertext. dwFlags [in] is a  set of  flags that modify the behavior of this function. The  allowed set of flags depends on  the type of key  specified by  the hKey parameter. If the key  is a  symmetric key,  this can  be  zero  or  the following value:  BCRYPT_BLOCK_PADDING. If the key  is an  asymmetric key,  this can  be  one  of the following values:  BCRYPT_PAD_NONE, BCRYPT_PAD_OAEP, BCRYPT_PAD_PKCS1.  5.5.2 BCryptDecrypt NTSTATUS WINAPI  BCryptDecrypt( BCRYPT_KEY_HANDLE hKey, PUCHAR pbInput, ULONG cbInput, VOID *pPaddingInfo,  PUCHAR pbIV, ULONG cbIV, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);  The  BCryptDecrypt() function decrypts a  block of data of given length.  hKey [in, out] is the handle of the key  to  use  to  decrypt the data. This handle is obtained from  one  of the key  creation functions, such  as  BCryptGenerateSymmetricKey, BCryptGenerateKeyPair, or BCryptImportKey.  pbInput  [in] is the address of a  buffer  that contains the ciphertext to  be  decrypted. The  cbInput parameter  contains the size of the ciphertext to  decrypt. For more information, see Remarks. cbInput  [in] is the number  of bytes in the pbInput buffer  to  decrypt.  pPaddingInfo [in, optional] is a  pointer to  a  structure that contains padding information. The  actual type of  structure this parameter points to  depends on  the value of the dwFlags parameter. This parameter is only  used with asymmetric keys  and  must be  NULL  otherwise.  pbIV [in, out, optional] is the address of a  buffer  that contains the initialization vector (IV) to  use  during  decryption. The  cbIV parameter contains the size of this buffer. This function will  modify the contents of this  buffer. If you  need to  reuse the IV later, make sure you  make a  copy  of this buffer  before calling this function.  This parameter is optional and  can  be  NULL if  no  IV is used. The  required size of the IV  can  be obtained by  calling the BCryptGetProperty function to  get  the BCRYPT_BLOCK_LENGTH  property. This will provide the size of a  block for  the algorithm, which is also the size of the IV.  cbIV [in] contains the size, in bytes, of the pbIV buffer.  pbOutput  [out, optional] is the address of a  buffer  to  receive the plaintext produced by  this function. The  cbOutput parameter contains the size of this buffer. For more information, see Remarks.  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 13 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  If this parameter is NULL, this function will  calculate the size required for  the plaintext and  return the size in  the location pointed to  by  the pcbResult parameter.  cbOutput  [in] is the size, in bytes, of the pbOutput buffer. This parameter is ignored if the pbOutput  parameter is NULL.  pcbResult [out] is a  pointer to  a  ULONG  variable to  receive the number of bytes copied to  the pbOutput buffer.  If pbOutput is NULL, this receives the size, in bytes, required for  the plaintext.  dwFlags [in] is a  set of flags that modify the behavior of this function. The  allowed set of flags depends on  the  type of key  specified by the hKey parameter. If the key  is a  symmetric key,  this can  be  zero  or  the following  value: BCRYPT_BLOCK_PADDING. If the key  is an  asymmetric key,  this can  be  one  of the following values:  BCRYPT_PAD_NONE, BCRYPT_PAD_OAEP, BCRYPT_PAD_PKCS1.  5.6 Hashing and HMAC 5.6.1 BCryptCreateHash NTSTATUS WINAPI  BCryptCreateHash( BCRYPT_ALG_HANDLE hAlgorithm, BCRYPT_HASH_HANDLE *phHash, PUCHAR  pbHashObject, ULONG cbHashObject, PUCHAR pbSecret, ULONG cbSecret, ULONG dwFlags);  The  BCryptCreateHash()  function creates a  hash object with an  optional key.  The  optional key  is used for HMAC  type  keyed‐hash functions.  hAlgorithm [in, out] is the handle of an  algorithm provider created by  using the BCryptOpenAlgorithmProvider  function. The  algorithm that was  specified when the provider was  created must support the hash interface.  phHash  [out] is a  pointer to  a  BCRYPT_HASH_HANDLE  value that receives a  handle that represents the hash  object. This handle is used in subsequent hashing functions, such  as  the BCryptHashData function. When  you  have finished using this handle, release it by  passing it to  the BCryptDestroyHash function. pbHashObject  [out]  is a  pointer to  a  buffer  that receives the hash object. The  cbHashObject parameter contains the size of this  buffer. The  required size of this buffer  can  be  obtained by  calling the BCryptGetProperty function to  get  the  BCRYPT_OBJECT_LENGTH  property. This will provide the size of the hash object for  the specified algorithm. This  memory can  only be  freed after the hash handle is destroyed.  cbHashObject  [in] contains the size, in bytes, of the pbHashObject buffer.  pbSecret  [in, optional] is a  pointer to  a  buffer  that contains the key  to  use for  the hash. The  cbSecret  parameter contains the size of this buffer. If no  key  should be  used with the hash, set this parameter to NULL.  This key  only applies to  keyed hash algorithms, like Hash‐Based Message Authentication Code (HMAC).  cbSecret  [in, optional] contains the size, in bytes, of the  pbSecret buffer. If no  key  should be  used with the  hash, set this parameter to  zero.  dwFlags [in] is not  currently used and  must be  zero.  5.6.2 BCryptHashData NTSTATUS WINAPI  BCryptHashData( BCRYPT_HASH_HANDLE hHash, PUCHAR pbInput, ULONG cbInput, ULONG  dwFlags);  The  BCryptHashData() function performs a  one  way  hash on  a  data buffer. Call the BCryptFinishHash() function to  finalize the hashing operation to  get  the hash result.  5.6.3 BCryptDuplicateHash NTSTATUS WINAPI  BCryptDuplicateHash( BCRYPT_HASH_HANDLE hHash, BCRYPT_HASH_HANDLE *phNewHash, PUCHAR  pbHashObject, ULONG cbHashObject, ULONG dwFlags);  The  BCryptDuplicateHash()function duplicates an  existing hash object. The  duplicate hash object contains all  state and  data that was  hashed to  the point of duplication.  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 14 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  5.6.4 BCryptFinishHash NTSTATUS WINAPI  BCryptFinishHash( BCRYPT_HASH_HANDLE  hHash, PUCHAR pbOutput, ULONG cbOutput, ULONG  dwFlags);  The  BCryptFinishHash() function retrieves the hash value for  the data accumulated from  prior calls to  BCryptHashData() function.  5.6.5 BCryptDestroyHash NTSTATUS WINAPI  BCryptDestroyHash( BCRYPT_HASH_HANDLE hHash);  The  BCryptDestroyHash() function destroys a  hash object.  5.7 Signing and Verification 5.7.1 BCryptSignHash NTSTATUS WINAPI  BCryptSignHash( BCRYPT_KEY_HANDLE hKey, VOID *pPaddingInfo, PUCHAR pbInput, ULONG  cbInput, PUCHAR pbOutput, ULONG cbOutput, ULONG *pcbResult, ULONG dwFlags);  The  BCryptSignHash() function creates a  signature of a  hash value.  hKey [in] is the handle of the key  to  use  to  sign the hash.  pPaddingInfo [in, optional] is a  pointer to  a  structure that contains padding information. The  actual type of  structure this parameter points to  depends on  the value of the dwFlags parameter. This parameter is only  used with asymmetric keys  and  must be  NULL  otherwise.  pbInput  [in] is a  pointer to  a  buffer  that contains the hash value to  sign. The  cbInput parameter contains the  size of this buffer.  cbInput  [in] is the number of bytes in the pbInput buffer  to  sign.  pbOutput  [out] is the address of a  buffer  to  receive the signature produced by  this function. The cbOutput  parameter  contains the size of this buffer. If this parameter is NULL, this function will calculate the size  required for  the signature and  return the size in the location pointed to  by  the pcbResult parameter.  cbOutput  [in] is the size, in bytes, of the pbOutput buffer. This parameter is ignored if the pbOutput  parameter is NULL.  pcbResult [out] is a  pointer to  a  ULONG  variable that receives the number of bytes copied to  the pbOutput  buffer. If pbOutput is NULL, this receives the size, in bytes, required for  the signature. dwFlags [in] is a  set of  flags that modify the behavior of this function. The  allowed set of flags depends on  the type of key  specified by  the hKey parameter. If the key  is a  symmetric key,  this parameter is not used and  should be  set to  zero.  If the  key  is an  asymmetric key,  this can  be  one  of the following values: BCRYPT_PAD_PKCS1, BCRYPT_PAD_PSS.  Note: According to SP 800‐131, SHA‐1 hash signing should no longer be used, and is disallowed as of  12/2013. This is for legacy use only for signature verification.  5.7.2 BCryptVerifySignature NTSTATUS WINAPI  BCryptVerifySignature( BCRYPT_KEY_HANDLE hKey, VOID *pPaddingInfo, PUCHAR pbHash, ULONG  cbHash, PUCHAR pbSignature, ULONG cbSignature, ULONG dwFlags);  The  BCryptVerifySignature() function verifies that the specified signature matches the specified hash.  hKey [in] is the handle of the key  to  use  to  decrypt the signature. This must be  an  identical key  or  the public  key  portion of the key  pair used to  sign the  data with the BCryptSignHash function.  pPaddingInfo [in, optional] is a  pointer to  a  structure that contains padding information. The  actual type of  structure this parameter points to  depends on  the value of the dwFlags parameter. This parameter is only  used with asymmetric keys  and  must be  NULL  otherwise.  pbHash  [in] is the address of a  buffer  that contains the hash of the data. The  cbHash  parameter contains the  size of this buffer.  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 15 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  cbHash [in] is the size, in bytes, of the pbHash buffer.  pbSignature [in] is the address of a  buffer  that contains the signed hash of the data. The  BCryptSignHash  function is used to  create the signature. The  cbSignature parameter contains the size of this buffer.  cbSignature [in] is the size, in bytes, of the pbSignature buffer. The  BCryptSignHash function is used to create  the signature.  Note: According to SP 800‐131, SHA‐1 hash signing should no longer be used, and is disallowed as of  12/2013. This is for legacy use only for signature verification.  5.8 Secret Agreement and Key Derivation 5.8.1 BCryptSecretAgreement NTSTATUS WINAPI  BCryptSecretAgreement( BCRYPT_KEY_HANDLE hPrivKey, BCRYPT_KEY_HANDLE hPubKey,  BCRYPT_SECRET_HANDLE *phAgreedSecret, ULONG dwFlags);  The  BCryptSecretAgreement() function creates a  secret agreement value from  a  private and  a  public key.  This function is used with Diffie‐Hellman (DH) and  Elliptic Curve  Diffie‐Hellman (ECDH) algorithms. hPrivKey [in]  The  handle of the private key  to  use  to  create the secret agreement value.  hPubKey [in] The  handle of the public key  to  use  to  create the secret agreement value.  phSecret  [out] A  pointer to  a  BCRYPT_SECRET_HANDLE  that receives a  handle that represents the secret  agreement value. This handle must be  released by  passing it to  the BCryptDestroySecret  function when it is  no  longer needed.  dwFlags [in] A  set of flags that modify the behavior of this function. This can  be  zero  or  the following value:  KDF_USE_SECRET_AS_HMAC_KEY_FLAG.  5.8.2 BCryptDeriveKey NTSTATUS WINAPI  BCryptDeriveKey( BCRYPT_SECRET_HANDLE  hSharedSecret, LPCWSTR pwszKDF, BCryptBufferDesc  *pParameterList, PUCHAR  pbDerivedKey, ULONG cbDerivedKey, ULONG *pcbResult, ULONG dwFlags);  The  BCryptDeriveKey() function derives a  key  from  a  secret agreement value.  hSharedSecret [in, optional] is the secret agreement handle to  create the key  from.  This handle is obtained  from  the BCryptSecretAgreement function.  pwszKDF [in] is a  pointer to  a  null‐terminated Unicode string that contains an  object identifier (OID)  that  identifies the key  derivation function (KDF)  to  use  to  derive the key.  This can  be  one  of the following strings:  BCRYPT_KDF_HASH  (parameters in pParameterList: KDF_HASH_ALGORITHM, KDF_SECRET_PREPEND,  KDF_SECRET_APPEND), BCRYPT_KDF_HMAC  (parameters in pParameterList: KDF_HASH_ALGORITHM, KDF_HMAC_KEY,  KDF_SECRET_PREPEND, KDF_SECRET_APPEND), BCRYPT_KDF_TLS_PRF  (parameters in pParameterList:  KDF_TLS_PRF_LABEL, KDF_TLS_PRF_SEED). pParameterList [in, optional] is the address of a  BCryptBufferDesc  structure that contains the KDF parameters. This parameter is optional and  can  be  NULL if  it is not  needed.  pbDerivedKey [out, optional] is the address of a  buffer  that receives the key.  The  cbDerivedKey parameter  contains the size of this buffer. If this parameter is NULL, this function will place the required size, in bytes, in  the ULONG pointed to  by  the pcbResult parameter.  cbDerivedKey [in] contains the size, in bytes, of the pbDerivedKey buffer.  pcbResult [out] is a  pointer to  a  ULONG that receives the number of bytes that were copied to  the  pbDerivedKey buffer. If the pbDerivedKey parameter is NULL, this function will place the required size, in bytes,  in the ULONG pointed to  by  this parameter.  dwFlags [in] is a  set of flags that modify the behavior of this function. This can  be  zero  or  the following value.  5.8.3 BCryptDestroySecret NTSTATUS WINAPI  BCryptDestroySecret( BCRYPT_SECRET_HANDLE hSecret);  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 16 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  The  BCryptDestroySecret() function destroys a  secret agreement handle that was  created by  using the  BCryptSecretAgreement() function.  5.9 Configuration These are not cryptographic functions. They are used to configure cryptographic providers on the system, and are  provided for informational purposes. Please see http://msdn.microsoft.com for details.    Function Name Description BCryptAddContextFunction Adds a function (algorithm or cipher-suite) to a context function list. BCryptAddContextFunctionProvider Adds a provider to a context function provider list. BCryptConfigureContext Configures a context. BCryptConfigureContextFunction Configures a context function . Creates a new configuration context. BCryptCreateContext Deletes a configuration context. BCryptDeleteContext Enumerates the algorithms for a given set of operations. BCryptEnumAlgorithms Enumerates the providers in a context function provider list. BCryptEnumContextFunctionProviders Enumerates the functions (algorithms or  suites) in a  context  BCryptEnumContextFunctions function list. Enumerates the configuration contexts in the specified table. BCryptEnumContexts Returns a list of providers for a given algorithm.  BCryptEnumProviders Enumerates the providers currently registered on  the local  BCryptEnumRegisteredProviders machine. Queries the current configuration of a context.  BCryptQueryContextConfiguration Queries the current configuration of a context function. BCryptQueryContextFunctionConfiguration Queries the current value of a context function property. BCryptQueryContextFunctionProperty Retrieves registration information for a  provider.  BCryptQueryProviderRegistration This API differs slightly between User‐Mode  and  Kernel‐ Mode. BCryptRegisterConfigChangeNotify Registers a provider for usage on the local machine.  BCryptRegisterProvider Removes a function (algorithm or cipher‐suite) from  a context BCryptRemoveContextFunction function list. Removes a provider from a context function provider list. BCryptRemoveContextFunctionProvider This is the main API in Crypto configuration. It  resolves queries BCryptResolveProviders against the set of providers currently registered on the local  system and  the configuration information specified in the  machine and  domain configuration tables, returning an  ordered list of references to  one  or  more providers matching  the specified criteria. Creates, modifies, or deletes a context function property. BCryptSetContextFunctionProperty Unregisters Config Change notification request.  BCryptUnregisterConfigChangeNotify Removes provider registration information from  the local  BCryptUnregisterProvider machine. Retrieve whether the FIPS algorithm mode is enabled or not. BCryptGetFipsAlgorithmMode         This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 17 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document        6 Operational Environment BCRYPT.DLL is intended to  run  on  Windows Embedded Compact 7 in Single User  mode, on the hardware as  defined in  Section 2, and is tested on the below operational environments.  When  run in these configurations, multiple  concurrent operators are  not  supported.   Windows Embedded Compact 7 running on a Sigma Designs Vantage 8654 Development Kit with a  Sigma Designs SMP8654 (MIPSII_FP) CPU   Windows Embedded Compact 7 running on a Sigma Designs Vantage 8654 Development Kit with a  Sigma Designs SMP8654 (MIPSII) CPU   Windows Embedded Compact 7 running on a TI OMAP TMDSEVM3530 with Texas Instruments  EVM3530 CPU   Windows Embedded Compact 7 running on a Samsung SMDK6410 Development Kit with Samsung  SMDK6410 CPU   Windows Embedded Compact 7 running on a Freescale i.MX27 Development Kit with Freescale i.MX27  CPU   Windows Embedded Compact 7 running on an eBox‐330‐A with MSTI PDX‐600 CPU  BCRYPT.DLL is also compliant on platforms that are not listed above. Please see FIPS PUB 140‐2  Implementation Guidance G.5 for more details on portability rules and requirements.   Because BCRYPT.DLL module is a  DLL, each process requesting access is provided its own  instance of the  module. As such, each process has  full access to  all information and  keys  within the module. Note  that no keys  or  other information are  maintained upon  detachment from  the DLL, thus an  instantiation of the module will  only contain keys  or  information that the process has  placed in the module.  7 C r y p t o g r a p h i c K e y M a n a g e m e n t BCRYPT.DLL crypto  module manages keys  in the following manner.  7.1 Cryptographic Keys, CSPs, and SRDIs The BCRYPT.DLL crypto module contains the following security relevant data items:  Item SRDI Description Security Relevant Data Symmetric encryption/decryption  Keys used for AES or TDES encryption/decryption.  keys  HMAC keys  Keys used for HMAC‐SHA1, HMAC‐SHA256, HMAC‐ SHA384, and HMAC‐SHA512 DSA Public Keys  Keys used for the verification of DSA digital signatures  DSA Private Keys  Keys used for the calculation of DSA digital signatures  ECDSA Public Keys  Keys used for the verification of ECDSA digital signatures  ECDSA Private Keys  Keys used for the calculation of ECDSA digital signatures  RSA Public Keys  Keys used for the verification of RSA digital signatures  RSA Private Keys  Keys used for the calculation of RSA digital signatures  DH Public and Private values  Public and private values used for Diffie‐Hellman key establishment. This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 18 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  ECDH Public and Private values  Public and private values used for EC Diffie‐Hellman key  establishment. DRBG Parameters  DRBG Seed, Entropy, Key and State value ‘V’ *The module generates cryptographic keys whose strengths are modified by available entropy.  7.2 Access Control Policy The BCRYPT.DLL  crypto  module  allows controlled  access to  the SRDIs contained  within  it. The following table defines the  access that a service has to each.  The permissions are categorized as a set of four separate permissions: read (r), write  (w),  execute  (x), delete  (d).  If no permission is listed, the service has no access to the SRDI.  ECDH Public and Private values DH Public and Private values BCRYPT.DLL crypto module Security Relevant Data Item SRDI/Service Access Policy ECDSA Private keys ECDSA public keys DRBG Parameters DSA Private Keys RSA Private Keys DSA Public Keys RSA Public Keys Symmetric Keys HMAC keys Service Categories Cryptographic Module Power Up and Power r/x Down Key Formatting w Random Number Generation (DRBG) x r,w,x  Data Encryption and Decryption x Hashing x/w Acquiring a Table of Pointers to BCryptXXX Functions Algorithm Providers and Properties Key and Key-Pair Generation w/d w/d w/d w/d w/d w/d w/d w/d w/d w/d Key Entry and Output r/w r/w r/w r/w r/w r/w r/w r/w r/w r/w Signing and Verification x x x x X x Secret Agreement and Key Derivation x x This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 19 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  7.3 Key Material Each  time an  application links with BCRYPT.DLL, the  DLL  is instantiated and  no  keys  exist within it. The user  application is responsible for  importing keys  into BCRYPT.DLL or  using BCRYPT.DLL’s functions to generate keys.  7.4 Key Generation BCRYPT.DLL can  create and  use  keys  for  the following algorithms: RSA, DSA, DH, ECDH, ECDSA, RC2, RC4, DES,  Triple‐DES, AES, and  HMAC (RC2, RC4 and DES may not be used in FIPS mode).  Random keys  can  be  generated by  calling the BCryptGenerateSymmetricKey() and BCryptGenerateKeyPair()  functions. Random data generated by the BCryptGenRandom()  function is provided to  BCryptGenerateSymmetricKey() function to  generate symmetric keys.  DES, Triple‐DES, AES, ECDSA, DSA, DH, and  ECDH keys  and  key‐pairs are  generated following the techniques given in FIPS PUB 186‐2, Appendix 3,  Random  Number Generation.  RSA key‐pairs are generated per ANSIX9.31.  The BCRYPT module generates cryptographic keys whose strengths are modified by available entropy.  7.5 Key Establishment BCRYPT.DLL can  use  FIPS approved Diffie‐Hellman key  agreement (DH), Elliptic Curve  Diffie‐Hellman key  agreement (ECDH), and  manual methods to  establish keys.  BCRYPT.DLL can  use  the following FIPS non‐approved but allowed key  derivation functions (KDF)  from  the  common secret that is established during the execution of DH and  ECDH  key  agreement algorithms:  • BCRYPT_KDF_HASH. This KDF supports FIPS SP800‐56A (Section 5.8), X9.63, and X9.42 key  derivation.  • BCRYPT_KDF_HMAC. This KDF  supports FIPS IPsec  IKE  v1 key  derivation as  specified in FIPS 140‐2  Implementation Guidance.   • BCRYPT_KDF_TLS_PRF. This KDF supports FIPS SSLv3.1 and TLS  v1.0  key  derivation as  specified in FIPS 140‐ 2  Implementation Guidance.  7.6 Key Entry and Output Keys can  be  both  exported and  imported out  of and  into BCRYPT.DLL via BCryptExportKey(), BCryptImportKey(),  and  BCryptImportKeyPair() functions.  Symmetric key  entry and  output can  also be  done by  exchanging keys  using the recipient’s asymmetric public  key  via BCryptSecretAgreement() and  BCryptDeriveKey() functions.  Exporting the RSA private key  by  supplying a  blob type of BCRYPT_PRIVATE_KEY_BLOB,  BCRYPT_RSAFULLPRIVATE_BLOB, or  BCRYPT_RSAPRIVATE_BLOB  to  BCryptExportKey() is not  allowed in FIPS mode.  7.7 Key Storage BCRYPT.DLL does not  provide persistent storage of keys.  7.8 Key Archival BCRYPT.DLL does not  directly archive cryptographic keys.  The  Authenticated User  may  choose to  export a  cryptographic key  (cf.  “Key Entry  and  Output”  above), but  management of the secure archival of that key  is  the responsibility of the user.  7.9 Key Zeroization All  keys  are  destroyed and  their memory location zeroized when the User  calls BCryptDestroyKey() or  BCryptDestroySecret() on  that key  handle.  8 Self‐Tests BCRYPT.DLL performs the following power‐on (start  up)  self‐tests when DllMain is called by the operating system.  • SHA‐1  hash Known Answer Test  • HMAC‐SHA‐1, HMAC‐SHA‐256, HMAC‐SHA‐384, and  HMAC‐SHA‐512  Known Answer Test  • Triple‐DES encrypt/decrypt ECB  Known Answer Test  This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 20 Microsoft Windows Cryptographic Primitives Library (bcrypt.dll) Security Policy Document  • Triple‐DES encrypt/decrypt CBC  Known Answer Test  • AES‐128, AES‐192, AES‐256 encrypt/decrypt ECB  Known Answer Test  • AES‐128, AES‐192, AES‐256 encrypt/decrypt CBC  Known Answer Test  • DSA  sign/verify test  • RSA sign and  verify Known Answer Test  • DH secret agreement Known Answer Test  • ECDSA  sign/verify test  • ECDH secret agreement Known Answer Test  • SP 800‐90 DRBG Known Answer Test and Health Checks  • Powerup Integrity Test (RSA Signature Verification)  BCRYPT.DLL performs pair‐wise consistency checks upon  each invocation of RSA, ECDH, DSA, and  ECDSA key‐pair  generation and  import as  defined in FIPS 140‐2. BCRYPT.DLL also performs a  continuous RNG test on  each of the  implemented RNGs as  defined in FIPS 140‐2.  In  all cases for  any  failure of a  power‐on (start  up)  self‐test, BCRYPT.DLL DllMain  fails to  return the  STATUS_SUCCESS  status to  the operating system. The  only way  to  recover from  the failure of a  power‐ on  (start  up)  self‐test is to  attempt to  reload the BCRYPT.DLL, which will rerun the self‐tests, and  will only succeed if the  self‐tests passes.  9 Design Assurance The  BCRYPT.DLL crypto  module is part of the overall Windows Embedded Compact 7 operating system, which is a  product family that has  gone through and  is continuously going through the Common  Criteria Certification or  equivalent under US NIAP  CCEVS since Windows NT 3.5. The  certification provides the necessary design  assurance.  The  BCRYPT.DLL is installed and  started as  part of the Windows Embedded Compact 7 operating system.  10 Additional details For the latest information on Windows Embedded Compact 7, check out the Microsoft web site at http://www.microsoft.com. CHANGE HISTORY AUTHOR DATE VERSION COMMENT Tolga Acar 6/7/2007 1.0 Windows Vista FIPS Approval Submission Version Kevin Michelizzi 2/17/2012 1.1 Windows Embedded Compact 7 Version Kevin Michelizzi 3/22/2012 1.2 Windows Embedded Compact 7 FIPS Approval Review Kevin Michelizzi 7/18/2012 1.3 Windows Embedded Compact 7 HMAC and algorithm corrections Kevin Michelizzi 10/30/2012 1.4 Update with final comments from review Kevin Michelizzi 07/03/2013 1.5 Update with comments from CMVP Kevin Michelizzi 07/18/2013 1.6 Add entropy caveat on key generation   This Security Policy is non-proprietary and may be reproduced only in its original entirety (without revision) 21