void *certs_data;
        struct snp_guest_crypto *crypto;
+       /* request and response are in unencrypted memory */
        struct snp_guest_msg *request, *response;
+
+       /*
+        * Avoid information leakage by double-buffering shared messages
+        * in fields that are in regular encrypted memory.
+        */
+       struct snp_guest_msg secret_request, secret_response;
+
        struct snp_secrets_page_layout *layout;
        struct snp_req_data input;
        u32 *os_area_msg_seqno;
 static int verify_and_dec_payload(struct snp_guest_dev *snp_dev, void *payload, u32 sz)
 {
        struct snp_guest_crypto *crypto = snp_dev->crypto;
-       struct snp_guest_msg *resp = snp_dev->response;
-       struct snp_guest_msg *req = snp_dev->request;
+       struct snp_guest_msg *resp = &snp_dev->secret_response;
+       struct snp_guest_msg *req = &snp_dev->secret_request;
        struct snp_guest_msg_hdr *req_hdr = &req->hdr;
        struct snp_guest_msg_hdr *resp_hdr = &resp->hdr;
 
        dev_dbg(snp_dev->dev, "response [seqno %lld type %d version %d sz %d]\n",
                resp_hdr->msg_seqno, resp_hdr->msg_type, resp_hdr->msg_version, resp_hdr->msg_sz);
 
+       /* Copy response from shared memory to encrypted memory. */
+       memcpy(resp, snp_dev->response, sizeof(*resp));
+
        /* Verify that the sequence counter is incremented by 1 */
        if (unlikely(resp_hdr->msg_seqno != (req_hdr->msg_seqno + 1)))
                return -EBADMSG;
 static int enc_payload(struct snp_guest_dev *snp_dev, u64 seqno, int version, u8 type,
                        void *payload, size_t sz)
 {
-       struct snp_guest_msg *req = snp_dev->request;
+       struct snp_guest_msg *req = &snp_dev->secret_request;
        struct snp_guest_msg_hdr *hdr = &req->hdr;
 
        memset(req, 0, sizeof(*req));
        if (!seqno)
                return -EIO;
 
+       /* Clear shared memory's response for the host to populate. */
        memset(snp_dev->response, 0, sizeof(struct snp_guest_msg));
 
-       /* Encrypt the userspace provided payload */
+       /* Encrypt the userspace provided payload in snp_dev->secret_request. */
        rc = enc_payload(snp_dev, seqno, msg_ver, type, req_buf, req_sz);
        if (rc)
                return rc;
 
+       /*
+        * Write the fully encrypted request to the shared unencrypted
+        * request page.
+        */
+       memcpy(snp_dev->request, &snp_dev->secret_request,
+              sizeof(snp_dev->secret_request));
+
        rc = __handle_guest_request(snp_dev, exit_code, fw_err);
        if (rc) {
                if (rc == -EIO && *fw_err == SNP_GUEST_REQ_INVALID_LEN)