aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Yang <yang.huang@intel.com>2019-10-09 10:36:51 +0800
committerMichael S. Tsirkin <mst@redhat.com>2019-11-27 07:58:56 -0500
commit8c6acac22a99453139e14ddec55c2f9cb6fe470b (patch)
tree0e6521e4c16ae4389bfc17267bb4cc53b5535cfb
parent3d0b9916221de83efb00ddbbb5baf6e29f2a515b (diff)
downloadvirtio-text-8c6acac22a99453139e14ddec55c2f9cb6fe470b.tar.gz
Add virtio rpmb device specification
Add virtio RPMB (Replay Protected Memory Block) device documentation to spec. Signed-off-by: Yang Huang <yang.huang@intel.com> Reviewed-by: Bing Zhu <bing.zhu@intel.com> Reviewed-by: Tomas Winkler <tomas.winkler@intel.com> Fixes: https://github.com/oasis-tcs/virtio-spec/issues/53 Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r--conformance.tex24
-rw-r--r--content.tex1
-rw-r--r--introduction.tex3
-rw-r--r--virtio-rpmb.tex288
4 files changed, 315 insertions, 1 deletions
diff --git a/conformance.tex b/conformance.tex
index 0ac58aa..50969e5 100644
--- a/conformance.tex
+++ b/conformance.tex
@@ -22,7 +22,7 @@ Conformance targets:
\begin{itemize}
\item Clause \ref{sec:Conformance / Device Conformance}.
\item One of clauses \ref{sec:Conformance / Device Conformance / PCI Device Conformance}, \ref{sec:Conformance / Device Conformance / MMIO Device Conformance} or \ref{sec:Conformance / Device Conformance / Channel I/O Device Conformance}.
- \item One of clauses \ref{sec:Conformance / Device Conformance / Network Device Conformance}, \ref{sec:Conformance / Device Conformance / Block Device Conformance}, \ref{sec:Conformance / Device Conformance / Console Device Conformance}, \ref{sec:Conformance / Device Conformance / Entropy Device Conformance}, \ref{sec:Conformance / Device Conformance / Traditional Memory Balloon Device Conformance}, \ref{sec:Conformance / Device Conformance / SCSI Host Device Conformance}, \ref{sec:Conformance / Device Conformance / Input Device Conformance}, \ref{sec:Conformance / Device Conformance / Crypto Device Conformance} or \ref{sec:Conformance / Device Conformance / Socket Device Conformance}.
+ \item One of clauses \ref{sec:Conformance / Device Conformance / Network Device Conformance}, \ref{sec:Conformance / Device Conformance / Block Device Conformance}, \ref{sec:Conformance / Device Conformance / Console Device Conformance}, \ref{sec:Conformance / Device Conformance / Entropy Device Conformance}, \ref{sec:Conformance / Device Conformance / Traditional Memory Balloon Device Conformance}, \ref{sec:Conformance / Device Conformance / SCSI Host Device Conformance}, \ref{sec:Conformance / Device Conformance / Input Device Conformance}, \ref{sec:Conformance / Device Conformance / Crypto Device Conformance}, \ref{sec:Conformance / Device Conformance / Socket Device Conformance} or \ref{sec:Conformance / Device Conformance / RPMB Device Conformance}.
\item Clause \ref{sec:Conformance / Legacy Interface: Transitional Device and Transitional Driver Conformance}.
\end{itemize}
\end{description}
@@ -183,6 +183,14 @@ A socket driver MUST conform to the following normative statements:
\item \ref{drivernormative:Device Types / Socket Device / Device Operation / Device Events}
\end{itemize}
+\conformance{\subsection}{RPMB Driver Conformance}\label{sec:Conformance / Driver Conformance / RPMB Driver Conformance}
+
+A RPMB driver MUST conform to the following normative statements:
+
+\begin{itemize}
+\item \ref{drivernormative:Device Types / RPMB Device / Device Operation}
+\end{itemize}
+
\conformance{\section}{Device Conformance}\label{sec:Conformance / Device Conformance}
A device MUST conform to the following normative statements:
@@ -338,6 +346,20 @@ A socket device MUST conform to the following normative statements:
\item \ref{devicenormative:Device Types / Socket Device / Device Operation / Receive and Transmit}
\end{itemize}
+\conformance{\subsection}{RPMB Device Conformance}\label{sec:Conformance / Device Conformance / RPMB Device Conformance}
+
+An RPMB device MUST conform to the following normative statements:
+
+\begin{itemize}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Initialization}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Operation / Device Operation: Program Key}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Operation / Device Operation: Get Write Counter}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Operation / Device Operation: Data Write}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Operation / Device Operation: Data Read}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Operation / Device Operation: Result Read}
+\item \ref{devicenormative:Device Types / RPMB Device / Device Operation}
+\end{itemize}
+
\conformance{\section}{Legacy Interface: Transitional Device and Transitional Driver Conformance}\label{sec:Conformance / Legacy Interface: Transitional Device and Transitional Driver Conformance}
A conformant implementation MUST be either transitional or
non-transitional, see \ref{intro:Legacy
diff --git a/content.tex b/content.tex
index 06bb4ca..cd321a1 100644
--- a/content.tex
+++ b/content.tex
@@ -5812,6 +5812,7 @@ descriptor for the \field{sense_len}, \field{residual},
\input{virtio-crypto.tex}
\input{virtio-vsock.tex}
\input{virtio-fs.tex}
+\input{virtio-rpmb.tex}
\chapter{Reserved Feature Bits}\label{sec:Reserved Feature Bits}
diff --git a/introduction.tex b/introduction.tex
index 40f16f8..33da3ec 100644
--- a/introduction.tex
+++ b/introduction.tex
@@ -63,6 +63,9 @@ Levels'', BCP 14, RFC 2119, March 1997. \newline\url{http://www.ietf.org/rfc/rfc
\phantomsection\label{intro:FUSE}\textbf{[FUSE]} &
Linux FUSE interface,
\newline\url{https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/fuse.h}\\
+ \phantomsection\label{intro:eMMC}\textbf{[eMMC]} &
+ eMMC Electrical Standard (5.1), JESD84-B51,
+ \newline\url{http://www.jedec.org/sites/default/files/docs/JESD84-B51.pdf}\\
\end{longtable}
diff --git a/virtio-rpmb.tex b/virtio-rpmb.tex
new file mode 100644
index 0000000..dfecc3c
--- /dev/null
+++ b/virtio-rpmb.tex
@@ -0,0 +1,288 @@
+\section{RPMB Device}\label{sec:Device Types / RPMB Device}
+
+virtio-rpmb is a virtio based RPMB (Replay Protected Memory Block)
+device. It is used as a tamper-resistant and anti-replay storage.
+The device is driven via requests including read, write, get write
+counter and program key, which are submitted via a request queue.
+This section relies on definitions from paragraph 6.6.22 of
+\hyperref[intro:eMMC]{eMMC}.
+\subsection{Device ID}\label{sec:Device Types / RPMB Device / Device ID}
+
+28
+
+\subsection{Virtqueues}\label{sec:Device Types / RPMB Device / Virtqueues}
+
+\begin{description}
+\item[0] requestq
+\end{description}
+
+\subsection{Feature bits}\label{sec:Device Types / RPMB Device / Feature bits}
+
+None.
+
+\subsection{Device configuration layout}\label{sec:Device Types / RPMB Device / Device configuration layout}
+
+All fields of this configuration are always available and read-only for the driver.
+
+\begin{lstlisting}
+struct virtio_rpmb_config {
+ u8 capacity;
+ u8 max_wr_cnt;
+ u8 max_rd_cnt;
+}
+\end{lstlisting}
+
+\begin{description}
+\item[\field{capacity}] is the capacity of the device (expressed in 128KB units).
+ The values MUST range between 0x00 and 0x80 inclusive.
+\item[\field{max_wr_cnt and max_rd_cnt}] are the maximum numbers of RPMB
+ block count (256B) that can be performed to device in one request. 0 implies
+ no limitation.
+\end{description}
+
+\devicenormative{\subsection}{Device Initialization}{Device Types / RPMB Device / Device Initialization}
+
+\begin{enumerate}
+\item The virtqueue is initialized.
+\item The device capacity MUST be initialized to a multiple of 128Kbytes and up to
+ 16Mbytes.
+\end{enumerate}
+
+\subsection{Device Operation}\label{sec:Device Types / RPMB Device / Device Operation}
+
+The operation of a virtio RPMB device is driven by the requests placed on the virtqueue.
+ The type of request can be program key (VIRTIO_RPMB_REQ_PROGRAM_KEY),
+ get write counter (VIRTIO_RPMB_REQ_GET_WRITE_COUNTER),
+ write (VIRTIO_RPMB_REQ_DATA_WRITE), and read (VIRTIO_RPMB_REQ_DATA_READ).
+ A program key or write request can also combine with a
+ result read (VIRTIO_RPMB_REQ_RESULT_READ) for a returned result.
+
+\begin{lstlisting}
+/* RPMB Request Types */
+#define VIRTIO_RPMB_REQ_PROGRAM_KEY 0x0001
+#define VIRTIO_RPMB_REQ_GET_WRITE_COUNTER 0x0002
+#define VIRTIO_RPMB_REQ_DATA_WRITE 0x0003
+#define VIRTIO_RPMB_REQ_DATA_READ 0x0004
+#define VIRTIO_RPMB_REQ_RESULT_READ 0x0005
+
+/* RPMB Response Types */
+#define VIRTIO_RPMB_RESP_PROGRAM_KEY 0x0100
+#define VIRTIO_RPMB_RESP_GET_COUNTER 0x0200
+#define VIRTIO_RPMB_RESP_DATA_WRITE 0x0300
+#define VIRTIO_RPMB_RESP_DATA_READ 0x0400
+\end{lstlisting}
+
+\begin{description}
+\item[\field{VIRTIO_RPMB_REQ_PROGRAM_KEY}] requests for authentication key programming.
+ If VIRTIO_RPMB_REQ_RESULT_READ is requested, the device returns the RPMB frame with
+ the response (VIRTIO_RPMB_RESP_PROGRAM_KEY), the calculated MAC and the result.
+
+\item[\field{VIRTIO_RPMB_REQ_GET_WRITE_COUNTER}] requests for reading the write counter.
+ The device returns the RPMB frame with the response (VIRTIO_RPMB_RESP_GET_COUNTER),
+ the writer counter, a copy of the nonce received in the request, the calculated
+ MAC and the result.
+
+\item[\field{VIRTIO_RPMB_REQ_DATA_WRITE}] requests for authenticated data write.
+ If VIRTIO_RPMB_REQ_RESULT_READ is requested, the device returns the RPMB data
+ frame with the response (VIRTIO_RPMB_RESP_DATA_WRITE), the incremented counter value,
+ the data address, the calculated MAC and the result.
+
+\item[\field{VIRTIO_RPMB_REQ_DATA_READ}] requests for authenticated data read.
+ The device returns the RPMB frame with the response (VIRTIO_RPMB_RESP_DATA_READ),
+ the block count, a copy of the nonce received in the request, the address,
+ the data, the calculated MAC and the result.
+
+\item[\field{VIRTIO_RPMB_REQ_RESULT_READ}] requests for a returned result.
+ It is used following with VIRTIO_RPMB_REQ_PROGRAM_KEY or VIRTIO_RPMB_REQ_DATA_WRITE
+ request types for a returned result in one or multiple RPMB frames. If it's not
+ requested, the device will not return result frame to the driver.
+\end{description}
+
+
+\subsubsection{Device Operation: Request Queue}\label{sec:Device Types / RPMB Device / Device Operation / Device Operation: Request Queue}
+
+The request information is delivered in RPMB frame.
+The frame is in size of 512B.
+
+\begin{lstlisting}
+struct virtio_rpmb_frame {
+ u8 stuff[196];
+ u8 key_mac[32];
+ u8 data[256];
+ u8 nonce[16];
+ be32 write_counter;
+ be16 address;
+ be16 block_count;
+ be16 result;
+ be16 req_resp;
+};
+
+/* RPMB Operation Results */
+#define VIRTIO_RPMB_RES_OK 0x0000
+#define VIRTIO_RPMB_RES_GENERAL_FAILURE 0x0001
+#define VIRTIO_RPMB_RES_AUTH_FAILURE 0x0002
+#define VIRTIO_RPMB_RES_COUNT_FAILURE 0x0003
+#define VIRTIO_RPMB_RES_ADDR_FAILURE 0x0004
+#define VIRTIO_RPMB_RES_WRITE_FAILURE 0x0005
+#define VIRTIO_RPMB_RES_READ_FAILURE 0x0006
+#define VIRTIO_RPMB_RES_NO_AUTH_KEY 0x0007
+#define VIRTIO_RPMB_RES_WRITE_COUNTER_EXPIRED 0x0080
+\end{lstlisting}
+
+\begin{description}
+\item[\field{stuff}] Padding for the frame.
+
+\item[\field{key_mac}] is the authentication key or the message
+ authentication code (MAC) depending on the request/response type.
+ If the request is VIRTIO_RPMB_REQ_PROGRAM_KEY, it's used as an
+ authentication key. Otherwise, it's used as MAC. The MAC is calculated
+ using HMAC SHA-256. It takes as input a key and a message. The key
+ used for the MAC calculation is always the 256-bit RPMB authentication
+ key. The message used as input to the MAC calculation is the
+ concatenation of the fields in the RPMB frames excluding stuff bytes
+ and the MAC itself.
+
+\item[\field{data}] is used to be written or read via authenticated
+ read/write access. It's fixed 256B.
+
+\item[\field{nonce}] is a random number generated by the user for the read
+ or get write counter requests and copied to the response by the device.
+ It's used for anti-replay protection.
+
+\item[\field{writer_counter}] is the counter value for the total amount of
+ the successful authenticated data write requests.
+
+\item[\field{address}] is the address of the data to be written to or read
+ from the RPMB virtio device. It is the number of the accessed
+ half sector (256B).
+
+\item[\field{block_count}] is the number of blocks (256B) requested to be
+ read/written. It's limited by \field{max_wr_cnt} or \field{max_rd_cnt}.
+ For RPMB read request, one virtio buffer including request command and
+ the subsequent [\field{block_count}] virtio buffers for response data
+ are placed in the queue.
+ For RPMB write request, [\field{block_count}] virtio buffers including
+ request command and data are placed in the queue.
+
+\item[\field{result}] includes information about the status of access made
+ to the device. It is written by the device.
+
+\item[\field{req_resp}] is the type of request or response, to/from the device.
+\end{description}
+
+\devicenormative{\paragraph}{Device Operation: Program Key}{Device Types / RPMB Device / Device Operation / Device Operation: Program Key}
+
+If VIRTIO_RPMB_REQ_RESULT_READ is requested, the device SHOULD return the
+RPMB frame with the response, the calculated MAC and the result:
+
+\begin{enumerate}
+\item If the \field{block_count} is not set to 1 then
+ VIRTIO_RPMB_RES_GENERAL_FAILURE SHOULD be responded as \field{result}.
+
+\item If the programming of authentication key fails,
+ then VIRTIO_RPMB_RES_WRITE_FAILURE SHOULD be responded as \field{result}.
+
+\item If some other error occurs then returned result
+ VIRTIO_RPMB_RES_GENERAL_FAILURE SHOULD be responded as \field{result}.
+
+\item The \field{req_resp} value VIRTIO_RPMB_RESP_PROGRAM_KEY SHOULD be responded.
+\end{enumerate}
+
+\devicenormative{\paragraph}{Device Operation: Get Write Counter}{Device Types / RPMB Device / Device Operation / Device Operation: Get Write Counter}
+
+If the authentication key is not yet programmed then VIRTIO_RPMB_RES_NO_AUTH_KEY
+SHOULD be returned in \field{result}.
+
+If block count has not been set to 1 then VIRTIO_RPMB_RES_GENERAL_FAILURE
+SHOULD be responded as \field{result}.
+
+The \field{req_resp} value VIRTIO_RPMB_RESP_GET_COUNTER SHOULD be responded.
+
+\devicenormative{\paragraph}{Device Operation: Data Write}{Device Types / RPMB Device / Device Operation / Device Operation: Data Write}
+
+If VIRTIO_RPMB_REQ_RESULT_READ is requested, the device SHOULD return the RPMB data
+frame with the response VIRTIO_RPMB_RESP_DATA_WRITE, the incremented counter value,
+the data address, the calculated MAC and the result:
+
+\begin{enumerate}
+\item If the authentication key is not yet programmed,
+ then VIRTIO_RPMB_RES_NO_AUTH_KEY SHOULD be returned in \field{result}.
+
+\item If block count is zero or greater than \field{max_wr_cnt} then
+ VIRTIO_RPMB_RES_GENERAL_FAILURE SHOULD be responded.
+
+\item The device MUST check whether the write counter has expired.
+ If the write counter is expired then the \field{result} SHOULD be set to
+ VIRTIO_RPMB_RES_WRITE_COUNTER_EXPIRED.
+
+\item If there is an error in the address (out of range) then the \field{result}
+ SHOULD be set to VIRTIO_RPMB_RES_ADDR_FAILURE.
+
+\item The device MUST calculate the MAC taking authentication key and frame as input,
+ and compare this with the MAC in the request. If the two MAC’s are different
+ then VIRTIO_RPMB_RES_AUTH_FAILURE SHOULD be returned in \field{result}.
+
+\item If the writer counter in the request is different from the one maintained
+ by the device then VIRTIO_RPMB_RES_COUNT_FAILURE SHOULD be returned in \field{result}.
+
+\item If the MAC and write counter comparisons are matched then the write request
+ is considered to be authenticated. The data from the request SHOULD be written to the
+ address indicated in the request and the write counter SHOULD be incremented by 1.
+
+\item If the write fails then the \field{result} SHOULD be VIRTIO_RPMB_RES_WRITE_FAILURE.
+
+\item If some other error occurs during the writing procedure then the \field{result}
+ SHOULD be VIRTIO_RPMB_RES_GENERAL_FAILURE.
+
+\item The \field{req_resp} value VIRTIO_RPMB_RESP_DATA_WRITE SHOULD be responded.
+\end{enumerate}
+
+\devicenormative{\paragraph}{Device Operation: Data Read}{Device Types / RPMB Device / Device Operation / Device Operation: Data Read}
+
+If the authentication key is not yet programmed then VIRTIO_RPMB_RES_NO_AUTH_KEY
+SHOULD be returned in \field{result}.
+
+If block count has not been set to 1 then VIRTIO_RPMB_RES_GENERAL_FAILURE SHOULD be
+responded as \field{result}.
+
+If there is an error in the address (out of range) then the \field{result} SHOULD
+be set to VIRTIO_RPMB_RES_ADDR_FAILURE.
+
+If data fetch from addressed location inside the device fails then the \field{result}
+SHOULD be VIRTIO_RPMB_RES_READ_FAILURE.
+
+If some other error occurs during the read procedure then the \field{result}
+SHOULD be VIRTIO_RPMB_RES_GENERAL_FAILURE.
+
+The \field{req_resp} value VIRTIO_RPMB_RESP_DATA_READ SHOULD be responded.
+
+\devicenormative{\paragraph}{Device Operation: Result Read}{Device Types / RPMB Device / Device Operation / Device Operation: Result Read}
+
+If the \field{block_count} has not been set to 1 of VIRTIO_RPMB_REQ_RESULT_READ
+request then VIRTIO_RPMB_RES_GENERAL_FAILURE SHOULD be responded as \field{result}.
+
+\drivernormative{\subsubsection}{Device Operation}{Device Types / RPMB Device / Device Operation}
+
+The RPMB frames MUST not be packed by the driver.
+The driver MUST configure, initialize and format virtqueue for the RPMB requests received from its caller then send it to the device.
+
+\devicenormative{\subsubsection}{Device Operation}{Device Types / RPMB Device / Device Operation}
+
+The virtio-rpmb device could be backed in a number of ways. It SHOULD
+ keep consistent behaviors with hardware as described in paragraph
+ 6.6.22 of \hyperref[intro:eMMC]{eMMC}.
+ Some elements are maintained by the device:
+\begin{enumerate}
+\item The device MUST maintain a one-time programmable authentication key.
+ It cannot be overwritten, erased or read. The key is used to
+ authenticate the accesses when MAC is calculated. This key MUST be
+ kept regardless of device reset or reboot.
+\item The device MUST maintain a read-only monotonic write counter. It
+ MUST be initialized to zero and added by one automatically along with
+ successful write operation. The value cannot be reset. After
+ the counter has reached its maximum value 0xFFFF FFFF, it will
+ not be incremented anymore. This counter MUST be kept regardless
+ of device reset or reboot.
+\item The device MUST maintain the data for read/write via authenticated
+ access.
+\end{enumerate}