• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 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 #ifndef __FEC_PRIVATE_H__
18 #define __FEC_PRIVATE_H__
19 
20 #include <errno.h>
21 #include <fcntl.h>
22 #include <memory>
23 #include <new>
24 #include <pthread.h>
25 #include <stdio.h>
26 #include <string>
27 #include <string.h>
28 #include <sys/syscall.h>
29 #include <unistd.h>
30 #include <vector>
31 
32 #include <utils/Compat.h>
33 #include <mincrypt/rsa.h>
34 #include <openssl/sha.h>
35 #include <fec/io.h>
36 #include <fec/ecc.h>
37 
38 /* processing parameters */
39 #define WORK_MIN_THREADS 1
40 #define WORK_MAX_THREADS 64
41 
42 /* verity parameters */
43 #define VERITY_CACHE_BLOCKS 4096
44 #define VERITY_NO_CACHE UINT64_MAX
45 
46 /* verity definitions */
47 #define VERITY_METADATA_SIZE (8 * FEC_BLOCKSIZE)
48 #define VERITY_TABLE_ARGS 10 /* mandatory arguments */
49 #define VERITY_MIN_TABLE_SIZE (VERITY_TABLE_ARGS * 2) /* for a sanity check */
50 #define VERITY_MAX_TABLE_SIZE (VERITY_METADATA_SIZE - sizeof(verity_header))
51 
52 /* verity header and metadata */
53 #define VERITY_MAGIC 0xB001B001
54 #define VERITY_MAGIC_DISABLE 0x46464F56
55 #define VERITY_VERSION 0
56 #define VERITY_TABLE_FIELDS 10
57 #define VERITY_TABLE_VERSION 1
58 
59 struct verity_header {
60     uint32_t magic;
61     uint32_t version;
62     uint8_t signature[RSANUMBYTES];
63     uint32_t length;
64 };
65 
66 /* file handle */
67 struct ecc_info {
68     bool valid;
69     int roots;
70     int rsn;
71     uint32_t size;
72     uint64_t blocks;
73     uint64_t rounds;
74     uint64_t start; /* offset in file */
75 };
76 
77 struct verity_info {
78     bool disabled;
79     char *table;
80     uint32_t hash_data_blocks;
81     uint32_t hash_size;
82     uint64_t hash_data_offset;
83     uint64_t hash_start;
84     uint8_t *hash;
85     uint32_t salt_size;
86     uint8_t *salt;
87     uint64_t data_blocks;
88     uint64_t metadata_start; /* offset in file */
89     uint8_t zero_hash[SHA256_DIGEST_LENGTH];
90     verity_header header;
91     verity_header ecc_header;
92 };
93 
94 struct verity_block_info {
95     uint64_t index;
96     bool valid;
97 };
98 
99 struct fec_handle {
100     ecc_info ecc;
101     int fd;
102     int flags; /* additional flags passed to fec_open */
103     int mode; /* mode for open(2) */
104     pthread_mutex_t mutex;
105     uint64_t errors;
106     uint64_t data_size;
107     uint64_t pos;
108     uint64_t size;
109     verity_info verity;
110 };
111 
112 /* I/O helpers */
113 extern bool raw_pread(fec_handle *f, void *buf, size_t count,
114         uint64_t offset);
115 extern bool raw_pwrite(fec_handle *f, const void *buf, size_t count,
116         uint64_t offset);
117 
118 /* processing functions */
119 typedef ssize_t (*read_func)(fec_handle *f, uint8_t *dest, size_t count,
120         uint64_t offset, size_t *errors);
121 
122 extern ssize_t process(fec_handle *f, uint8_t *buf, size_t count,
123         uint64_t offset, read_func func);
124 
125 /* verity functions */
126 extern uint64_t verity_get_size(uint64_t file_size, uint32_t *verity_levels,
127         uint32_t *level_hashes);
128 
129 extern int verity_parse_header(fec_handle *f, uint64_t offset);
130 
131 extern bool verity_check_block(fec_handle *f, const uint8_t *expected,
132         const uint8_t *block);
133 
134 /* helper macros */
135 #ifndef unlikely
136     #define unlikely(x) __builtin_expect(!!(x), 0)
137     #define likely(x)   __builtin_expect(!!(x), 1)
138 #endif
139 
140 #ifndef stringify
141     #define __stringify(x) #x
142     #define stringify(x) __stringify(x)
143 #endif
144 
145 /*  warnings, errors, debug output */
146 #ifdef FEC_NO_KLOG
147     #define __log(func, type, format, args...) \
148         fprintf(stderr, "fec: <%d> " type ": %s: " format "\n", \
149             (int)syscall(SYS_gettid), __FUNCTION__,  ##args)
150 #else
151     #include <cutils/klog.h>
152 
153     #define __log(func, type, format, args...) \
154         KLOG_##func("fec", "<%d> " type ": %s: " format "\n", \
155             (int)syscall(SYS_gettid), __FUNCTION__, ##args)
156 #endif
157 
158 #ifdef NDEBUG
159     #define debug(format, args...)
160 #else
161     #define debug(format, args...) __log(DEBUG, "debug", format, ##args)
162 #endif
163 
164 #define warn(format, args...) __log(WARNING, "warning", format, ##args)
165 #define error(format, args...) __log(ERROR, "error", format, ##args)
166 
167 #define check(p) \
168     if (unlikely(!(p))) { \
169         error("`%s' failed", #p); \
170         errno = EFAULT; \
171         return -1; \
172     }
173 
174 #endif /* __FEC_PRIVATE_H__ */
175