1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <openssl/crypto.h> /* for CRYPTO_memcmp */
18 #include <string.h>
19
20 #include "block_device.h"
21 #include "block_mac.h"
22 #include "transaction.h"
23
block_mac_block_size(const struct fs * fs)24 static size_t block_mac_block_size(const struct fs* fs) {
25 size_t size = fs->block_num_size;
26 assert(size);
27 assert(size <= sizeof(data_block_t));
28 return size;
29 }
30
block_mac_mac_size(const struct fs * fs)31 static size_t block_mac_mac_size(const struct fs* fs) {
32 size_t size = fs->mac_size;
33 assert(size);
34 assert(size <= sizeof(struct mac));
35 return size;
36 }
37
block_mac_clear(const struct transaction * tr,struct block_mac * dest)38 void block_mac_clear(const struct transaction* tr, struct block_mac* dest) {
39 memset(dest, 0, block_mac_block_size(tr->fs) + block_mac_mac_size(tr->fs));
40 }
41
block_mac_to_block_fs(const struct fs * fs,const struct block_mac * block_mac)42 data_block_t block_mac_to_block_fs(const struct fs* fs,
43 const struct block_mac* block_mac) {
44 data_block_t block = 0;
45
46 memcpy(&block, block_mac->data, block_mac_block_size(fs));
47
48 return block;
49 }
50
block_mac_to_block(const struct transaction * tr,const struct block_mac * block_mac)51 data_block_t block_mac_to_block(const struct transaction* tr,
52 const struct block_mac* block_mac) {
53 assert(tr);
54 return block_mac_to_block_fs(tr->fs, block_mac);
55 }
56
block_mac_to_mac_fs(const struct fs * fs,const struct block_mac * block_mac)57 const void* block_mac_to_mac_fs(const struct fs* fs,
58 const struct block_mac* block_mac) {
59 return block_mac->data + block_mac_block_size(fs);
60 }
61
block_mac_to_mac(const struct transaction * tr,const struct block_mac * block_mac)62 const void* block_mac_to_mac(const struct transaction* tr,
63 const struct block_mac* block_mac) {
64 return block_mac_to_mac_fs(tr->fs, block_mac);
65 }
66
block_mac_set_block_fs(const struct fs * fs,struct block_mac * block_mac,data_block_t block)67 void block_mac_set_block_fs(const struct fs* fs,
68 struct block_mac* block_mac,
69 data_block_t block) {
70 memcpy(block_mac->data, &block, block_mac_block_size(fs));
71 }
72
block_mac_set_block(const struct transaction * tr,struct block_mac * block_mac,data_block_t block)73 void block_mac_set_block(const struct transaction* tr,
74 struct block_mac* block_mac,
75 data_block_t block) {
76 block_mac_set_block_fs(tr->fs, block_mac, block);
77 }
78
block_mac_set_mac_fs(const struct fs * fs,struct block_mac * block_mac,const struct mac * mac)79 void block_mac_set_mac_fs(const struct fs* fs,
80 struct block_mac* block_mac,
81 const struct mac* mac) {
82 memcpy(block_mac->data + block_mac_block_size(fs), mac,
83 block_mac_mac_size(fs));
84 }
85
block_mac_set_mac(const struct transaction * tr,struct block_mac * block_mac,const struct mac * mac)86 void block_mac_set_mac(const struct transaction* tr,
87 struct block_mac* block_mac,
88 const struct mac* mac) {
89 block_mac_set_mac_fs(tr->fs, block_mac, mac);
90 }
91
block_mac_eq(const struct transaction * tr,const struct block_mac * a,const struct block_mac * b)92 bool block_mac_eq(const struct transaction* tr,
93 const struct block_mac* a,
94 const struct block_mac* b) {
95 return !CRYPTO_memcmp(
96 a, b, block_mac_block_size(tr->fs) + block_mac_mac_size(tr->fs));
97 }
98
block_mac_copy(const struct transaction * tr,struct block_mac * dest,const struct block_mac * src)99 void block_mac_copy(const struct transaction* tr,
100 struct block_mac* dest,
101 const struct block_mac* src) {
102 memcpy(dest, src,
103 block_mac_block_size(tr->fs) + block_mac_mac_size(tr->fs));
104 }
105