aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2022-04-01 18:40:23 +0100
committerAlex Bennée <alex.bennee@linaro.org>2022-04-01 18:40:23 +0100
commitd6b4852f8df4adc60e2008ea1232a850f81c7c40 (patch)
tree429bf324b4ccd1d6d90935dd18439b51b9cd2e6a
parentaa6cf2315825249b27e7b4d6484038757719ae8e (diff)
-rw-r--r--tools/rpmb/rpmb.c15
-rwxr-xr-xtools/rpmb/test.sh2
2 files changed, 13 insertions, 4 deletions
diff --git a/tools/rpmb/rpmb.c b/tools/rpmb/rpmb.c
index 284ac4330fbe..7bcc0b8820f0 100644
--- a/tools/rpmb/rpmb.c
+++ b/tools/rpmb/rpmb.c
@@ -580,10 +580,13 @@ static int vrpmb_write_blocks(int dev_fd, void *key, void *data, int addr, int l
static int vrpmb_read_blocks(int dev_fd, void *key, int addr, int count, void *data, int len)
{
struct rpmb_ioc_rblocks_cmd cmd;
- int frame_length = (len / RPMB_BLOCK_SIZE) * sizeof(struct virtio_rpmb_frame);
+ int frame_length = count * sizeof(struct virtio_rpmb_frame);
struct virtio_rpmb_frame *frames = malloc(frame_length);
int i, ret = -1;
+ rpmb_dbg("%s: reading %d blocks into %d bytes (%d bytes of frames)\n",
+ __func__, count, len, frame_length);
+
if (!frames) {
rpmb_err("unable to allocate memory for frames");
return -1;
@@ -604,6 +607,8 @@ static int vrpmb_read_blocks(int dev_fd, void *key, int addr, int count, void *d
for (i = 0; i < count; i++) {
struct virtio_rpmb_frame *f = &frames[i];
+ vrpmb_dump_frame("block data", f);
+
if (key) {
ret = vrpmb_check_mac(key, f, 1);
if (ret) {
@@ -738,7 +743,7 @@ static int op_rpmb_read_blocks(int nargs, char **argv)
void *key = NULL;
ret = -EINVAL;
- if (nargs != 4)
+ if (nargs < 4 || nargs > 5)
return ret;
fd = open_dev_file(argv[0], &cap);
@@ -776,7 +781,7 @@ static int op_rpmb_read_blocks(int nargs, char **argv)
goto out;
argv++;
- if (nargs == 5) {
+ if (argv[0]) {
key = read_key(argv[0]);
if (!key) {
rpmb_err("failed to read key data");
@@ -786,7 +791,7 @@ static int op_rpmb_read_blocks(int nargs, char **argv)
while (blocks_cnt > 0) {
int to_copy = min(blocks_cnt, cap.rd_cnt_max);
- int length = to_copy * 256;
+ int length = to_copy * RPMB_BLOCK_SIZE;
void *data = malloc(length);
if (!data) {
ret = ENOMEM;
@@ -799,6 +804,8 @@ static int op_rpmb_read_blocks(int nargs, char **argv)
if (ret < 0) {
perror("writing data");
goto out;
+ } else {
+ rpmb_dbg("wrote %d bytes/%d blocks to file\n", length, to_copy);
}
free(data);
diff --git a/tools/rpmb/test.sh b/tools/rpmb/test.sh
index c1cd5de8fda0..0a09819029d1 100755
--- a/tools/rpmb/test.sh
+++ b/tools/rpmb/test.sh
@@ -10,8 +10,10 @@ dd if=/dev/urandom of=data.in count=4 bs=256
echo "write data"
./rpmb -v write-blocks /dev/rpmb0 0 4 data.in key
echo "read data back"
+rm -f data.out
./rpmb -v read-blocks /dev/rpmb0 0 4 data.out
cmp data.in data.out
echo "read data back with key check"
+truncate -s 0 data.out
./rpmb -v read-blocks /dev/rpmb0 0 4 data.out key
cmp data.in data.out