CertificateProvisioningProtocol.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*
  2. * Copyright (C) 2011-2017 Intel Corporation. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. *
  8. * * Redistributions of source code must retain the above copyright
  9. * notice, this list of conditions and the following disclaimer.
  10. * * Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in
  12. * the documentation and/or other materials provided with the
  13. * distribution.
  14. * * Neither the name of Intel Corporation nor the names of its
  15. * contributors may be used to endorse or promote products derived
  16. * from this software without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. *
  30. */
  31. #ifndef _CERTIFICATE_PROVISIONING_INTERFACE_H_
  32. #define _CERTIFICATE_PROVISIONING_INTERFACE_H_
  33. #include <stdint.h>
  34. #include <list>
  35. #include <string>
  36. #include "Buffer.h"
  37. #include "aeerror.h"
  38. #include "epid/common/types.h"
  39. #include "tlv_common.h"
  40. #include "platform_info_blob.h"
  41. struct _cpRSA_public_key;
  42. struct _provision_request_header_t;
  43. struct _provision_response_header_t;
  44. class TLVsMsg;
  45. typedef struct _public_key
  46. {
  47. uint8_t n[256];
  48. uint32_t e;
  49. } public_key_t;
  50. class CertificateProvisioningProtocol
  51. {
  52. public:
  53. CertificateProvisioningProtocol(void);
  54. ~CertificateProvisioningProtocol(void);
  55. ae_error_t init(const char* szURL, const signed_pek_t& pek);
  56. ae_error_t SendM1_ReceiveM2
  57. ( /*in */ uint32_t gid,
  58. /*out*/ upse::Buffer& nonce,
  59. /*out*/ upse::Buffer& sigRLBuffer
  60. );
  61. ae_error_t SendM3_ReceiveM4
  62. ( /*in */ const upse::Buffer& csrBuffer,
  63. /*in */ const upse::Buffer& quoteBuffer,
  64. /*out*/ std::list< upse::Buffer >& certificateChainList,
  65. /*out*/ platform_info_blob_wrapper_t& piBlobWrapper
  66. );
  67. general_response_status_t GetGeneralResponseStatus() { return generalResponseStatus; }
  68. pse_protocol_response_status_t GetProtocolResponseStatus() { return protocolResponseStatus; }
  69. private:
  70. typedef enum
  71. {
  72. msg_next_state_init = 0,
  73. msg_next_state_M1 = 1,
  74. msg_next_state_M2 = 2,
  75. msg_next_state_M3 = 3,
  76. msg_next_state_M4 = 4
  77. } msg_state_t;
  78. bool m_is_initialized;
  79. std::string m_url;
  80. msg_state_t m_nextState;
  81. public_key_t m_publicKey;
  82. general_response_status_t generalResponseStatus;
  83. pse_protocol_response_status_t protocolResponseStatus;
  84. upse::Buffer M1SK;
  85. upse::Buffer M1IV;
  86. upse::Buffer M3IV;
  87. upse::Buffer TransactionID;
  88. upse::Buffer EK2;
  89. upse::Buffer Nonce;
  90. const public_key_t& get_intel_pek();
  91. int get_intel_pek_cipher_text_size();
  92. void free_intel_ipp_rsa_pub_key(_cpRSA_public_key* rsa_pub_key);
  93. ae_error_t get_random_value(uint32_t size, upse::Buffer& randomValue);
  94. ae_error_t check_response_header(const _provision_response_header_t& header, uint8_t msg_type, uint32_t msg_size);
  95. ae_error_t check_response_status(const _provision_response_header_t& msg2_header);
  96. ae_error_t sendReceive(const upse::Buffer& sendSerialized, upse::Buffer& recvSerialized);
  97. ae_error_t msg1_generate(const GroupId gid, upse::Buffer& serializedMsg1);
  98. ae_error_t msg1_create_header(uint32_t cipherTextSize, uint32_t epidGidSize, const upse::Buffer& transactionID, _provision_request_header_t& header);
  99. ae_error_t msg1_create_seq2_0(const TLVsMsg& seq2_1_tlv_block_cipher_info, TLVsMsg& seq2_0_tlv_cipher_text);
  100. ae_error_t msg1_create_seq2_1(TLVsMsg& seq2_1_tlv_block_cipher_info);
  101. ae_error_t msg1_create_seq3_0(const TLVsMsg& seq3_1_tlv_epid_gid, const _provision_request_header_t& serializedHeader,
  102. const upse::Buffer& ek1, TLVsMsg& seq3_0_tlv_block_cipher_text, upse::Buffer& mac);
  103. ae_error_t msg2_process(const upse::Buffer& serializedMsg2, upse::Buffer& nonce, upse::Buffer& sigRLBuffer);
  104. ae_error_t msg2_check_integrity(const TLVsMsg& tlvs);
  105. ae_error_t msg2_derive_ek2_and_retrieve_nonce(const TLVsMsg& tlvs, upse::Buffer& ek2, upse::Buffer& nonce);
  106. ae_error_t msg2_verify_mac_and_retrieve_sigrl(const provision_response_header_t& header, const TLVsMsg& tlvs, const upse::Buffer& ek2, upse::Buffer& sigRL);
  107. ae_error_t msg3_generate(const upse::Buffer& csrBuffer, const upse::Buffer& quoteBuffer, upse::Buffer& serializedMsg3);
  108. ae_error_t msg3_create_header(const upse::Buffer& transactionID, uint32_t nonceSize, uint32_t quoteSize, uint32_t epidSigSize, uint32_t csrSize, _provision_request_header_t& header);
  109. ae_error_t msg3_seq3_0_create_block_cipher_text_tlv(const TLVsMsg& quote, const TLVsMsg& epidSigTLV, const TLVsMsg& csrTLV, const TLVsMsg& nonceTLV,
  110. const _provision_request_header_t& requestHeader, const upse::Buffer& ek2,
  111. TLVsMsg& blockCipherTextTLV, upse::Buffer& mac);
  112. ae_error_t msg3_seq3_1_create_quote_tlv(const upse::Buffer& quoteBuffer, TLVsMsg& quoteTLV);
  113. ae_error_t msg3_seq3_2_create_quote_signature_tlv(const upse::Buffer& quote, TLVsMsg& seq3_2_tlv_quote_signature);
  114. ae_error_t msg4_process(const upse::Buffer& serializedMsg4, std::list< upse::Buffer >& certificateChainList, platform_info_blob_wrapper_t& piBlobWrapper);
  115. ae_error_t msg4_validate_tlvs(const TLVsMsg& tlvs);
  116. ae_error_t msg4_verify_mac(const _provision_response_header_t& header, const TLVsMsg& tlvs);
  117. ae_error_t msg4_get_certificates(const TLVsMsg& tlvs, std::list< upse::Buffer >& certificateChainList, platform_info_blob_wrapper_t& piBlobWrapper);
  118. ae_error_t aesGCMEncrypt(const upse::Buffer& iv, const upse::Buffer& keyReader, const upse::Buffer& plainText,
  119. const upse::Buffer& aad, upse::Buffer& encryptedText, upse::Buffer& mac);
  120. ae_error_t aesGCMDecrypt(const upse::Buffer& iv, const upse::Buffer& key, const upse::Buffer& cipherText,
  121. const upse::Buffer& aad, const upse::Buffer& mac, upse::Buffer& plainText);
  122. ae_error_t aesCMAC(const upse::Buffer& key, const upse::Buffer& message, upse::Buffer& cmac);
  123. ae_error_t encryptRSA_OAEP_SHA256(const public_key_t& publicKey, upse::BufferReader& plainTextReader, upse::Buffer& encryptedText);
  124. private:
  125. // Disable class operations (default constructor, copy constructor, assignment operator, and address-of operator)
  126. //CertificateProvisioningProtocol(); // default constructor
  127. CertificateProvisioningProtocol(const CertificateProvisioningProtocol& rhs); // copy constructor
  128. CertificateProvisioningProtocol& operator=(const CertificateProvisioningProtocol& rhs); // address-of operator
  129. const CertificateProvisioningProtocol* operator&() const; // address-of operator
  130. };
  131. #endif