Commit 2e2067b815b0fc96f357abc8cd54eedd8148c44d

Authored by Eugeniu Rosca
Committed by Tom Rini
1 parent ecc6f6bea6

common: avb_verify: Fix invalid 'for' loop condition

Fix below compiler [1] warning:

common/avb_verify.c: In function ‘avb_find_dm_args’:
common/avb_verify.c:179:30: warning: left-hand operand of comma expression has no effect [-Wunused-value]
  for (i = 0; i < AVB_MAX_ARGS, args[i]; ++i) {

[1] aarch64-linux-gnu-gcc (Linaro GCC 7.2-2017.11)

Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com>
Reviewed-by: Igor Opaniuk <igor.opaniuk@linaro.org>

Showing 1 changed file with 1 additions and 1 deletions Inline Diff

1 /* 1 /*
2 * (C) Copyright 2018, Linaro Limited 2 * (C) Copyright 2018, Linaro Limited
3 * 3 *
4 * SPDX-License-Identifier: GPL-2.0+ 4 * SPDX-License-Identifier: GPL-2.0+
5 */ 5 */
6 6
7 #include <avb_verify.h> 7 #include <avb_verify.h>
8 #include <blk.h> 8 #include <blk.h>
9 #include <fastboot.h> 9 #include <fastboot.h>
10 #include <image.h> 10 #include <image.h>
11 #include <malloc.h> 11 #include <malloc.h>
12 #include <part.h> 12 #include <part.h>
13 13
14 const unsigned char avb_root_pub[1032] = { 14 const unsigned char avb_root_pub[1032] = {
15 0x0, 0x0, 0x10, 0x0, 0x55, 0xd9, 0x4, 0xad, 0xd8, 0x4, 15 0x0, 0x0, 0x10, 0x0, 0x55, 0xd9, 0x4, 0xad, 0xd8, 0x4,
16 0xaf, 0xe3, 0xd3, 0x84, 0x6c, 0x7e, 0xd, 0x89, 0x3d, 0xc2, 16 0xaf, 0xe3, 0xd3, 0x84, 0x6c, 0x7e, 0xd, 0x89, 0x3d, 0xc2,
17 0x8c, 0xd3, 0x12, 0x55, 0xe9, 0x62, 0xc9, 0xf1, 0xf, 0x5e, 17 0x8c, 0xd3, 0x12, 0x55, 0xe9, 0x62, 0xc9, 0xf1, 0xf, 0x5e,
18 0xcc, 0x16, 0x72, 0xab, 0x44, 0x7c, 0x2c, 0x65, 0x4a, 0x94, 18 0xcc, 0x16, 0x72, 0xab, 0x44, 0x7c, 0x2c, 0x65, 0x4a, 0x94,
19 0xb5, 0x16, 0x2b, 0x0, 0xbb, 0x6, 0xef, 0x13, 0x7, 0x53, 19 0xb5, 0x16, 0x2b, 0x0, 0xbb, 0x6, 0xef, 0x13, 0x7, 0x53,
20 0x4c, 0xf9, 0x64, 0xb9, 0x28, 0x7a, 0x1b, 0x84, 0x98, 0x88, 20 0x4c, 0xf9, 0x64, 0xb9, 0x28, 0x7a, 0x1b, 0x84, 0x98, 0x88,
21 0xd8, 0x67, 0xa4, 0x23, 0xf9, 0xa7, 0x4b, 0xdc, 0x4a, 0xf, 21 0xd8, 0x67, 0xa4, 0x23, 0xf9, 0xa7, 0x4b, 0xdc, 0x4a, 0xf,
22 0xf7, 0x3a, 0x18, 0xae, 0x54, 0xa8, 0x15, 0xfe, 0xb0, 0xad, 22 0xf7, 0x3a, 0x18, 0xae, 0x54, 0xa8, 0x15, 0xfe, 0xb0, 0xad,
23 0xac, 0x35, 0xda, 0x3b, 0xad, 0x27, 0xbc, 0xaf, 0xe8, 0xd3, 23 0xac, 0x35, 0xda, 0x3b, 0xad, 0x27, 0xbc, 0xaf, 0xe8, 0xd3,
24 0x2f, 0x37, 0x34, 0xd6, 0x51, 0x2b, 0x6c, 0x5a, 0x27, 0xd7, 24 0x2f, 0x37, 0x34, 0xd6, 0x51, 0x2b, 0x6c, 0x5a, 0x27, 0xd7,
25 0x96, 0x6, 0xaf, 0x6b, 0xb8, 0x80, 0xca, 0xfa, 0x30, 0xb4, 25 0x96, 0x6, 0xaf, 0x6b, 0xb8, 0x80, 0xca, 0xfa, 0x30, 0xb4,
26 0xb1, 0x85, 0xb3, 0x4d, 0xaa, 0xaa, 0xc3, 0x16, 0x34, 0x1a, 26 0xb1, 0x85, 0xb3, 0x4d, 0xaa, 0xaa, 0xc3, 0x16, 0x34, 0x1a,
27 0xb8, 0xe7, 0xc7, 0xfa, 0xf9, 0x9, 0x77, 0xab, 0x97, 0x93, 27 0xb8, 0xe7, 0xc7, 0xfa, 0xf9, 0x9, 0x77, 0xab, 0x97, 0x93,
28 0xeb, 0x44, 0xae, 0xcf, 0x20, 0xbc, 0xf0, 0x80, 0x11, 0xdb, 28 0xeb, 0x44, 0xae, 0xcf, 0x20, 0xbc, 0xf0, 0x80, 0x11, 0xdb,
29 0x23, 0xc, 0x47, 0x71, 0xb9, 0x6d, 0xd6, 0x7b, 0x60, 0x47, 29 0x23, 0xc, 0x47, 0x71, 0xb9, 0x6d, 0xd6, 0x7b, 0x60, 0x47,
30 0x87, 0x16, 0x56, 0x93, 0xb7, 0xc2, 0x2a, 0x9a, 0xb0, 0x4c, 30 0x87, 0x16, 0x56, 0x93, 0xb7, 0xc2, 0x2a, 0x9a, 0xb0, 0x4c,
31 0x1, 0xc, 0x30, 0xd8, 0x93, 0x87, 0xf0, 0xed, 0x6e, 0x8b, 31 0x1, 0xc, 0x30, 0xd8, 0x93, 0x87, 0xf0, 0xed, 0x6e, 0x8b,
32 0xbe, 0x30, 0x5b, 0xf6, 0xa6, 0xaf, 0xdd, 0x80, 0x7c, 0x45, 32 0xbe, 0x30, 0x5b, 0xf6, 0xa6, 0xaf, 0xdd, 0x80, 0x7c, 0x45,
33 0x5e, 0x8f, 0x91, 0x93, 0x5e, 0x44, 0xfe, 0xb8, 0x82, 0x7, 33 0x5e, 0x8f, 0x91, 0x93, 0x5e, 0x44, 0xfe, 0xb8, 0x82, 0x7,
34 0xee, 0x79, 0xca, 0xbf, 0x31, 0x73, 0x62, 0x58, 0xe3, 0xcd, 34 0xee, 0x79, 0xca, 0xbf, 0x31, 0x73, 0x62, 0x58, 0xe3, 0xcd,
35 0xc4, 0xbc, 0xc2, 0x11, 0x1d, 0xa1, 0x4a, 0xbf, 0xfe, 0x27, 35 0xc4, 0xbc, 0xc2, 0x11, 0x1d, 0xa1, 0x4a, 0xbf, 0xfe, 0x27,
36 0x7d, 0xa1, 0xf6, 0x35, 0xa3, 0x5e, 0xca, 0xdc, 0x57, 0x2f, 36 0x7d, 0xa1, 0xf6, 0x35, 0xa3, 0x5e, 0xca, 0xdc, 0x57, 0x2f,
37 0x3e, 0xf0, 0xc9, 0x5d, 0x86, 0x6a, 0xf8, 0xaf, 0x66, 0xa7, 37 0x3e, 0xf0, 0xc9, 0x5d, 0x86, 0x6a, 0xf8, 0xaf, 0x66, 0xa7,
38 0xed, 0xcd, 0xb8, 0xed, 0xa1, 0x5f, 0xba, 0x9b, 0x85, 0x1a, 38 0xed, 0xcd, 0xb8, 0xed, 0xa1, 0x5f, 0xba, 0x9b, 0x85, 0x1a,
39 0xd5, 0x9, 0xae, 0x94, 0x4e, 0x3b, 0xcf, 0xcb, 0x5c, 0xc9, 39 0xd5, 0x9, 0xae, 0x94, 0x4e, 0x3b, 0xcf, 0xcb, 0x5c, 0xc9,
40 0x79, 0x80, 0xf7, 0xcc, 0xa6, 0x4a, 0xa8, 0x6a, 0xd8, 0xd3, 40 0x79, 0x80, 0xf7, 0xcc, 0xa6, 0x4a, 0xa8, 0x6a, 0xd8, 0xd3,
41 0x31, 0x11, 0xf9, 0xf6, 0x2, 0x63, 0x2a, 0x1a, 0x2d, 0xd1, 41 0x31, 0x11, 0xf9, 0xf6, 0x2, 0x63, 0x2a, 0x1a, 0x2d, 0xd1,
42 0x1a, 0x66, 0x1b, 0x16, 0x41, 0xbd, 0xbd, 0xf7, 0x4d, 0xc0, 42 0x1a, 0x66, 0x1b, 0x16, 0x41, 0xbd, 0xbd, 0xf7, 0x4d, 0xc0,
43 0x4a, 0xe5, 0x27, 0x49, 0x5f, 0x7f, 0x58, 0xe3, 0x27, 0x2d, 43 0x4a, 0xe5, 0x27, 0x49, 0x5f, 0x7f, 0x58, 0xe3, 0x27, 0x2d,
44 0xe5, 0xc9, 0x66, 0xe, 0x52, 0x38, 0x16, 0x38, 0xfb, 0x16, 44 0xe5, 0xc9, 0x66, 0xe, 0x52, 0x38, 0x16, 0x38, 0xfb, 0x16,
45 0xeb, 0x53, 0x3f, 0xe6, 0xfd, 0xe9, 0xa2, 0x5e, 0x25, 0x59, 45 0xeb, 0x53, 0x3f, 0xe6, 0xfd, 0xe9, 0xa2, 0x5e, 0x25, 0x59,
46 0xd8, 0x79, 0x45, 0xff, 0x3, 0x4c, 0x26, 0xa2, 0x0, 0x5a, 46 0xd8, 0x79, 0x45, 0xff, 0x3, 0x4c, 0x26, 0xa2, 0x0, 0x5a,
47 0x8e, 0xc2, 0x51, 0xa1, 0x15, 0xf9, 0x7b, 0xf4, 0x5c, 0x81, 47 0x8e, 0xc2, 0x51, 0xa1, 0x15, 0xf9, 0x7b, 0xf4, 0x5c, 0x81,
48 0x9b, 0x18, 0x47, 0x35, 0xd8, 0x2d, 0x5, 0xe9, 0xad, 0xf, 48 0x9b, 0x18, 0x47, 0x35, 0xd8, 0x2d, 0x5, 0xe9, 0xad, 0xf,
49 0x35, 0x74, 0x15, 0xa3, 0x8e, 0x8b, 0xcc, 0x27, 0xda, 0x7c, 49 0x35, 0x74, 0x15, 0xa3, 0x8e, 0x8b, 0xcc, 0x27, 0xda, 0x7c,
50 0x5d, 0xe4, 0xfa, 0x4, 0xd3, 0x5, 0xb, 0xba, 0x3a, 0xb2, 50 0x5d, 0xe4, 0xfa, 0x4, 0xd3, 0x5, 0xb, 0xba, 0x3a, 0xb2,
51 0x49, 0x45, 0x2f, 0x47, 0xc7, 0xd, 0x41, 0x3f, 0x97, 0x80, 51 0x49, 0x45, 0x2f, 0x47, 0xc7, 0xd, 0x41, 0x3f, 0x97, 0x80,
52 0x4d, 0x3f, 0xc1, 0xb5, 0xbb, 0x70, 0x5f, 0xa7, 0x37, 0xaf, 52 0x4d, 0x3f, 0xc1, 0xb5, 0xbb, 0x70, 0x5f, 0xa7, 0x37, 0xaf,
53 0x48, 0x22, 0x12, 0x45, 0x2e, 0xf5, 0xf, 0x87, 0x92, 0xe2, 53 0x48, 0x22, 0x12, 0x45, 0x2e, 0xf5, 0xf, 0x87, 0x92, 0xe2,
54 0x84, 0x1, 0xf9, 0x12, 0xf, 0x14, 0x15, 0x24, 0xce, 0x89, 54 0x84, 0x1, 0xf9, 0x12, 0xf, 0x14, 0x15, 0x24, 0xce, 0x89,
55 0x99, 0xee, 0xb9, 0xc4, 0x17, 0x70, 0x70, 0x15, 0xea, 0xbe, 55 0x99, 0xee, 0xb9, 0xc4, 0x17, 0x70, 0x70, 0x15, 0xea, 0xbe,
56 0xc6, 0x6c, 0x1f, 0x62, 0xb3, 0xf4, 0x2d, 0x16, 0x87, 0xfb, 56 0xc6, 0x6c, 0x1f, 0x62, 0xb3, 0xf4, 0x2d, 0x16, 0x87, 0xfb,
57 0x56, 0x1e, 0x45, 0xab, 0xae, 0x32, 0xe4, 0x5e, 0x91, 0xed, 57 0x56, 0x1e, 0x45, 0xab, 0xae, 0x32, 0xe4, 0x5e, 0x91, 0xed,
58 0x53, 0x66, 0x5e, 0xbd, 0xed, 0xad, 0xe6, 0x12, 0x39, 0xd, 58 0x53, 0x66, 0x5e, 0xbd, 0xed, 0xad, 0xe6, 0x12, 0x39, 0xd,
59 0x83, 0xc9, 0xe8, 0x6b, 0x6c, 0x2d, 0xa5, 0xee, 0xc4, 0x5a, 59 0x83, 0xc9, 0xe8, 0x6b, 0x6c, 0x2d, 0xa5, 0xee, 0xc4, 0x5a,
60 0x66, 0xae, 0x8c, 0x97, 0xd7, 0xd, 0x6c, 0x49, 0xc7, 0xf5, 60 0x66, 0xae, 0x8c, 0x97, 0xd7, 0xd, 0x6c, 0x49, 0xc7, 0xf5,
61 0xc4, 0x92, 0x31, 0x8b, 0x9, 0xee, 0x33, 0xda, 0xa9, 0x37, 61 0xc4, 0x92, 0x31, 0x8b, 0x9, 0xee, 0x33, 0xda, 0xa9, 0x37,
62 0xb6, 0x49, 0x18, 0xf8, 0xe, 0x60, 0x45, 0xc8, 0x33, 0x91, 62 0xb6, 0x49, 0x18, 0xf8, 0xe, 0x60, 0x45, 0xc8, 0x33, 0x91,
63 0xef, 0x20, 0x57, 0x10, 0xbe, 0x78, 0x2d, 0x83, 0x26, 0xd6, 63 0xef, 0x20, 0x57, 0x10, 0xbe, 0x78, 0x2d, 0x83, 0x26, 0xd6,
64 0xca, 0x61, 0xf9, 0x2f, 0xe0, 0xbf, 0x5, 0x30, 0x52, 0x5a, 64 0xca, 0x61, 0xf9, 0x2f, 0xe0, 0xbf, 0x5, 0x30, 0x52, 0x5a,
65 0x12, 0x1c, 0x0, 0xa7, 0x5d, 0xcc, 0x7c, 0x2e, 0xc5, 0x95, 65 0x12, 0x1c, 0x0, 0xa7, 0x5d, 0xcc, 0x7c, 0x2e, 0xc5, 0x95,
66 0x8b, 0xa3, 0x3b, 0xf0, 0x43, 0x2e, 0x5e, 0xdd, 0x0, 0xdb, 66 0x8b, 0xa3, 0x3b, 0xf0, 0x43, 0x2e, 0x5e, 0xdd, 0x0, 0xdb,
67 0xd, 0xb3, 0x37, 0x99, 0xa9, 0xcd, 0x9c, 0xb7, 0x43, 0xf7, 67 0xd, 0xb3, 0x37, 0x99, 0xa9, 0xcd, 0x9c, 0xb7, 0x43, 0xf7,
68 0x35, 0x44, 0x21, 0xc2, 0x82, 0x71, 0xab, 0x8d, 0xaa, 0xb4, 68 0x35, 0x44, 0x21, 0xc2, 0x82, 0x71, 0xab, 0x8d, 0xaa, 0xb4,
69 0x41, 0x11, 0xec, 0x1e, 0x8d, 0xfc, 0x14, 0x82, 0x92, 0x4e, 69 0x41, 0x11, 0xec, 0x1e, 0x8d, 0xfc, 0x14, 0x82, 0x92, 0x4e,
70 0x83, 0x6a, 0xa, 0x6b, 0x35, 0x5e, 0x5d, 0xe9, 0x5c, 0xcc, 70 0x83, 0x6a, 0xa, 0x6b, 0x35, 0x5e, 0x5d, 0xe9, 0x5c, 0xcc,
71 0x8c, 0xde, 0x39, 0xd1, 0x4a, 0x5b, 0x5f, 0x63, 0xa9, 0x64, 71 0x8c, 0xde, 0x39, 0xd1, 0x4a, 0x5b, 0x5f, 0x63, 0xa9, 0x64,
72 0xe0, 0xa, 0xcb, 0xb, 0xb8, 0x5a, 0x7c, 0xc3, 0xb, 0xe6, 72 0xe0, 0xa, 0xcb, 0xb, 0xb8, 0x5a, 0x7c, 0xc3, 0xb, 0xe6,
73 0xbe, 0xfe, 0x8b, 0xf, 0x7d, 0x34, 0x8e, 0x2, 0x66, 0x74, 73 0xbe, 0xfe, 0x8b, 0xf, 0x7d, 0x34, 0x8e, 0x2, 0x66, 0x74,
74 0x1, 0x6c, 0xca, 0x76, 0xac, 0x7c, 0x67, 0x8, 0x2f, 0x3f, 74 0x1, 0x6c, 0xca, 0x76, 0xac, 0x7c, 0x67, 0x8, 0x2f, 0x3f,
75 0x1a, 0xa6, 0x2c, 0x60, 0xb3, 0xff, 0xda, 0x8d, 0xb8, 0x12, 75 0x1a, 0xa6, 0x2c, 0x60, 0xb3, 0xff, 0xda, 0x8d, 0xb8, 0x12,
76 0xc, 0x0, 0x7f, 0xcc, 0x50, 0xa1, 0x5c, 0x64, 0xa1, 0xe2, 76 0xc, 0x0, 0x7f, 0xcc, 0x50, 0xa1, 0x5c, 0x64, 0xa1, 0xe2,
77 0x5f, 0x32, 0x65, 0xc9, 0x9c, 0xbe, 0xd6, 0xa, 0x13, 0x87, 77 0x5f, 0x32, 0x65, 0xc9, 0x9c, 0xbe, 0xd6, 0xa, 0x13, 0x87,
78 0x3c, 0x2a, 0x45, 0x47, 0xc, 0xca, 0x42, 0x82, 0xfa, 0x89, 78 0x3c, 0x2a, 0x45, 0x47, 0xc, 0xca, 0x42, 0x82, 0xfa, 0x89,
79 0x65, 0xe7, 0x89, 0xb4, 0x8f, 0xf7, 0x1e, 0xe6, 0x23, 0xa5, 79 0x65, 0xe7, 0x89, 0xb4, 0x8f, 0xf7, 0x1e, 0xe6, 0x23, 0xa5,
80 0xd0, 0x59, 0x37, 0x79, 0x92, 0xd7, 0xce, 0x3d, 0xfd, 0xe3, 80 0xd0, 0x59, 0x37, 0x79, 0x92, 0xd7, 0xce, 0x3d, 0xfd, 0xe3,
81 0xa1, 0xb, 0xcf, 0x6c, 0x85, 0xa0, 0x65, 0xf3, 0x5c, 0xc6, 81 0xa1, 0xb, 0xcf, 0x6c, 0x85, 0xa0, 0x65, 0xf3, 0x5c, 0xc6,
82 0x4a, 0x63, 0x5f, 0x6e, 0x3a, 0x3a, 0x2a, 0x8b, 0x6a, 0xb6, 82 0x4a, 0x63, 0x5f, 0x6e, 0x3a, 0x3a, 0x2a, 0x8b, 0x6a, 0xb6,
83 0x2f, 0xbb, 0xf8, 0xb2, 0x4b, 0x62, 0xbc, 0x1a, 0x91, 0x25, 83 0x2f, 0xbb, 0xf8, 0xb2, 0x4b, 0x62, 0xbc, 0x1a, 0x91, 0x25,
84 0x66, 0xe3, 0x69, 0xca, 0x60, 0x49, 0xb, 0xf6, 0x8a, 0xbe, 84 0x66, 0xe3, 0x69, 0xca, 0x60, 0x49, 0xb, 0xf6, 0x8a, 0xbe,
85 0x3e, 0x76, 0x53, 0xc2, 0x7a, 0xa8, 0x4, 0x17, 0x75, 0xf1, 85 0x3e, 0x76, 0x53, 0xc2, 0x7a, 0xa8, 0x4, 0x17, 0x75, 0xf1,
86 0xf3, 0x3, 0x62, 0x1b, 0x85, 0xb2, 0xb0, 0xef, 0x80, 0x15, 86 0xf3, 0x3, 0x62, 0x1b, 0x85, 0xb2, 0xb0, 0xef, 0x80, 0x15,
87 0xb6, 0xd4, 0x4e, 0xdf, 0x71, 0xac, 0xdb, 0x2a, 0x4, 0xd4, 87 0xb6, 0xd4, 0x4e, 0xdf, 0x71, 0xac, 0xdb, 0x2a, 0x4, 0xd4,
88 0xb4, 0x21, 0xba, 0x65, 0x56, 0x57, 0xe8, 0xfa, 0x84, 0xa2, 88 0xb4, 0x21, 0xba, 0x65, 0x56, 0x57, 0xe8, 0xfa, 0x84, 0xa2,
89 0x7d, 0x13, 0xe, 0xaf, 0xd7, 0x9a, 0x58, 0x2a, 0xa3, 0x81, 89 0x7d, 0x13, 0xe, 0xaf, 0xd7, 0x9a, 0x58, 0x2a, 0xa3, 0x81,
90 0x84, 0x8d, 0x9, 0xa0, 0x6a, 0xc1, 0xbb, 0xd9, 0xf5, 0x86, 90 0x84, 0x8d, 0x9, 0xa0, 0x6a, 0xc1, 0xbb, 0xd9, 0xf5, 0x86,
91 0xac, 0xbd, 0x75, 0x61, 0x9, 0xe6, 0x8c, 0x3d, 0x77, 0xb2, 91 0xac, 0xbd, 0x75, 0x61, 0x9, 0xe6, 0x8c, 0x3d, 0x77, 0xb2,
92 0xed, 0x30, 0x20, 0xe4, 0x0, 0x1d, 0x97, 0xe8, 0xbf, 0xc7, 92 0xed, 0x30, 0x20, 0xe4, 0x0, 0x1d, 0x97, 0xe8, 0xbf, 0xc7,
93 0x0, 0x1b, 0x21, 0xb1, 0x16, 0xe7, 0x41, 0x67, 0x2e, 0xec, 93 0x0, 0x1b, 0x21, 0xb1, 0x16, 0xe7, 0x41, 0x67, 0x2e, 0xec,
94 0x38, 0xbc, 0xe5, 0x1b, 0xb4, 0x6, 0x23, 0x31, 0x71, 0x1c, 94 0x38, 0xbc, 0xe5, 0x1b, 0xb4, 0x6, 0x23, 0x31, 0x71, 0x1c,
95 0x49, 0xcd, 0x76, 0x4a, 0x76, 0x36, 0x8d, 0xa3, 0x89, 0x8b, 95 0x49, 0xcd, 0x76, 0x4a, 0x76, 0x36, 0x8d, 0xa3, 0x89, 0x8b,
96 0x4a, 0x7a, 0xf4, 0x87, 0xc8, 0x15, 0xf, 0x37, 0x39, 0xf6, 96 0x4a, 0x7a, 0xf4, 0x87, 0xc8, 0x15, 0xf, 0x37, 0x39, 0xf6,
97 0x6d, 0x80, 0x19, 0xef, 0x5c, 0xa8, 0x66, 0xce, 0x1b, 0x16, 97 0x6d, 0x80, 0x19, 0xef, 0x5c, 0xa8, 0x66, 0xce, 0x1b, 0x16,
98 0x79, 0x21, 0xdf, 0xd7, 0x31, 0x30, 0xc4, 0x21, 0xdd, 0x34, 98 0x79, 0x21, 0xdf, 0xd7, 0x31, 0x30, 0xc4, 0x21, 0xdd, 0x34,
99 0x5b, 0xd2, 0x1a, 0x2b, 0x3e, 0x5d, 0xf7, 0xea, 0xca, 0x5, 99 0x5b, 0xd2, 0x1a, 0x2b, 0x3e, 0x5d, 0xf7, 0xea, 0xca, 0x5,
100 0x8e, 0xb7, 0xcb, 0x49, 0x2e, 0xa0, 0xe3, 0xf4, 0xa7, 0x48, 100 0x8e, 0xb7, 0xcb, 0x49, 0x2e, 0xa0, 0xe3, 0xf4, 0xa7, 0x48,
101 0x19, 0x10, 0x9c, 0x4, 0xa7, 0xf4, 0x28, 0x74, 0xc8, 0x6f, 101 0x19, 0x10, 0x9c, 0x4, 0xa7, 0xf4, 0x28, 0x74, 0xc8, 0x6f,
102 0x63, 0x20, 0x2b, 0x46, 0x24, 0x26, 0x19, 0x1d, 0xd1, 0x2c, 102 0x63, 0x20, 0x2b, 0x46, 0x24, 0x26, 0x19, 0x1d, 0xd1, 0x2c,
103 0x31, 0x6d, 0x5a, 0x29, 0xa2, 0x6, 0xa6, 0xb2, 0x41, 0xcc, 103 0x31, 0x6d, 0x5a, 0x29, 0xa2, 0x6, 0xa6, 0xb2, 0x41, 0xcc,
104 0xa, 0x27, 0x96, 0x9, 0x96, 0xac, 0x47, 0x65, 0x78, 0x68, 104 0xa, 0x27, 0x96, 0x9, 0x96, 0xac, 0x47, 0x65, 0x78, 0x68,
105 0x51, 0x98, 0xd6, 0xd8, 0xa6, 0x2d, 0xa0, 0xcf, 0xec, 0xe2, 105 0x51, 0x98, 0xd6, 0xd8, 0xa6, 0x2d, 0xa0, 0xcf, 0xec, 0xe2,
106 0x74, 0xf2, 0x82, 0xe3, 0x97, 0xd9, 0x7e, 0xd4, 0xf8, 0xb, 106 0x74, 0xf2, 0x82, 0xe3, 0x97, 0xd9, 0x7e, 0xd4, 0xf8, 0xb,
107 0x70, 0x43, 0x3d, 0xb1, 0x7b, 0x97, 0x80, 0xd6, 0xcb, 0xd7, 107 0x70, 0x43, 0x3d, 0xb1, 0x7b, 0x97, 0x80, 0xd6, 0xcb, 0xd7,
108 0x19, 0xbc, 0x63, 0xb, 0xfd, 0x4d, 0x88, 0xfe, 0x67, 0xac, 108 0x19, 0xbc, 0x63, 0xb, 0xfd, 0x4d, 0x88, 0xfe, 0x67, 0xac,
109 0xb8, 0xcc, 0x50, 0xb7, 0x68, 0xb3, 0x5b, 0xd6, 0x1e, 0x25, 109 0xb8, 0xcc, 0x50, 0xb7, 0x68, 0xb3, 0x5b, 0xd6, 0x1e, 0x25,
110 0xfc, 0x5f, 0x3c, 0x8d, 0xb1, 0x33, 0x7c, 0xb3, 0x49, 0x1, 110 0xfc, 0x5f, 0x3c, 0x8d, 0xb1, 0x33, 0x7c, 0xb3, 0x49, 0x1,
111 0x3f, 0x71, 0x55, 0xe, 0x51, 0xba, 0x61, 0x26, 0xfa, 0xea, 111 0x3f, 0x71, 0x55, 0xe, 0x51, 0xba, 0x61, 0x26, 0xfa, 0xea,
112 0xe5, 0xb5, 0xe8, 0xaa, 0xcf, 0xcd, 0x96, 0x9f, 0xd6, 0xc1, 112 0xe5, 0xb5, 0xe8, 0xaa, 0xcf, 0xcd, 0x96, 0x9f, 0xd6, 0xc1,
113 0x5f, 0x53, 0x91, 0xad, 0x5, 0xde, 0x20, 0xe7, 0x51, 0xda, 113 0x5f, 0x53, 0x91, 0xad, 0x5, 0xde, 0x20, 0xe7, 0x51, 0xda,
114 0x5b, 0x95, 0x67, 0xed, 0xf4, 0xee, 0x42, 0x65, 0x70, 0x13, 114 0x5b, 0x95, 0x67, 0xed, 0xf4, 0xee, 0x42, 0x65, 0x70, 0x13,
115 0xb, 0x70, 0x14, 0x1c, 0xc9, 0xe0, 0x19, 0xca, 0x5f, 0xf5, 115 0xb, 0x70, 0x14, 0x1c, 0xc9, 0xe0, 0x19, 0xca, 0x5f, 0xf5,
116 0x1d, 0x70, 0x4b, 0x6c, 0x6, 0x74, 0xec, 0xb5, 0x2e, 0x77, 116 0x1d, 0x70, 0x4b, 0x6c, 0x6, 0x74, 0xec, 0xb5, 0x2e, 0x77,
117 0xe1, 0x74, 0xa1, 0xa3, 0x99, 0xa0, 0x85, 0x9e, 0xf1, 0xac, 117 0xe1, 0x74, 0xa1, 0xa3, 0x99, 0xa0, 0x85, 0x9e, 0xf1, 0xac,
118 0xd8, 0x7e, 118 0xd8, 0x7e,
119 }; 119 };
120 120
121 /** 121 /**
122 * ============================================================================ 122 * ============================================================================
123 * Boot states support (GREEN, YELLOW, ORANGE, RED) and dm_verity 123 * Boot states support (GREEN, YELLOW, ORANGE, RED) and dm_verity
124 * ============================================================================ 124 * ============================================================================
125 */ 125 */
126 char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state) 126 char *avb_set_state(AvbOps *ops, enum avb_boot_state boot_state)
127 { 127 {
128 struct AvbOpsData *data; 128 struct AvbOpsData *data;
129 char *cmdline = NULL; 129 char *cmdline = NULL;
130 130
131 if (!ops) 131 if (!ops)
132 return NULL; 132 return NULL;
133 133
134 data = (struct AvbOpsData *)ops->user_data; 134 data = (struct AvbOpsData *)ops->user_data;
135 if (!data) 135 if (!data)
136 return NULL; 136 return NULL;
137 137
138 data->boot_state = boot_state; 138 data->boot_state = boot_state;
139 switch (boot_state) { 139 switch (boot_state) {
140 case AVB_GREEN: 140 case AVB_GREEN:
141 cmdline = "androidboot.verifiedbootstate=green"; 141 cmdline = "androidboot.verifiedbootstate=green";
142 break; 142 break;
143 case AVB_YELLOW: 143 case AVB_YELLOW:
144 cmdline = "androidboot.verifiedbootstate=yellow"; 144 cmdline = "androidboot.verifiedbootstate=yellow";
145 break; 145 break;
146 case AVB_ORANGE: 146 case AVB_ORANGE:
147 cmdline = "androidboot.verifiedbootstate=orange"; 147 cmdline = "androidboot.verifiedbootstate=orange";
148 case AVB_RED: 148 case AVB_RED:
149 break; 149 break;
150 } 150 }
151 151
152 return cmdline; 152 return cmdline;
153 } 153 }
154 154
155 char *append_cmd_line(char *cmdline_orig, char *cmdline_new) 155 char *append_cmd_line(char *cmdline_orig, char *cmdline_new)
156 { 156 {
157 char *cmd_line; 157 char *cmd_line;
158 158
159 if (!cmdline_new) 159 if (!cmdline_new)
160 return cmdline_orig; 160 return cmdline_orig;
161 161
162 if (cmdline_orig) 162 if (cmdline_orig)
163 cmd_line = cmdline_orig; 163 cmd_line = cmdline_orig;
164 else 164 else
165 cmd_line = " "; 165 cmd_line = " ";
166 166
167 cmd_line = avb_strdupv(cmd_line, " ", cmdline_new, NULL); 167 cmd_line = avb_strdupv(cmd_line, " ", cmdline_new, NULL);
168 168
169 return cmd_line; 169 return cmd_line;
170 } 170 }
171 171
172 static int avb_find_dm_args(char **args, char *str) 172 static int avb_find_dm_args(char **args, char *str)
173 { 173 {
174 int i; 174 int i;
175 175
176 if (!str) 176 if (!str)
177 return -1; 177 return -1;
178 178
179 for (i = 0; i < AVB_MAX_ARGS, args[i]; ++i) { 179 for (i = 0; i < AVB_MAX_ARGS && args[i]; ++i) {
180 if (strstr(args[i], str)) 180 if (strstr(args[i], str))
181 return i; 181 return i;
182 } 182 }
183 183
184 return -1; 184 return -1;
185 } 185 }
186 186
187 static char *avb_set_enforce_option(const char *cmdline, const char *option) 187 static char *avb_set_enforce_option(const char *cmdline, const char *option)
188 { 188 {
189 char *cmdarg[AVB_MAX_ARGS]; 189 char *cmdarg[AVB_MAX_ARGS];
190 char *newargs = NULL; 190 char *newargs = NULL;
191 int i = 0; 191 int i = 0;
192 int total_args; 192 int total_args;
193 193
194 memset(cmdarg, 0, sizeof(cmdarg)); 194 memset(cmdarg, 0, sizeof(cmdarg));
195 cmdarg[i++] = strtok((char *)cmdline, " "); 195 cmdarg[i++] = strtok((char *)cmdline, " ");
196 196
197 do { 197 do {
198 cmdarg[i] = strtok(NULL, " "); 198 cmdarg[i] = strtok(NULL, " ");
199 if (!cmdarg[i]) 199 if (!cmdarg[i])
200 break; 200 break;
201 201
202 if (++i >= AVB_MAX_ARGS) { 202 if (++i >= AVB_MAX_ARGS) {
203 printf("%s: Can't handle more then %d args\n", 203 printf("%s: Can't handle more then %d args\n",
204 __func__, i); 204 __func__, i);
205 return NULL; 205 return NULL;
206 } 206 }
207 } while (true); 207 } while (true);
208 208
209 total_args = i; 209 total_args = i;
210 i = avb_find_dm_args(&cmdarg[0], VERITY_TABLE_OPT_LOGGING); 210 i = avb_find_dm_args(&cmdarg[0], VERITY_TABLE_OPT_LOGGING);
211 if (i >= 0) { 211 if (i >= 0) {
212 cmdarg[i] = (char *)option; 212 cmdarg[i] = (char *)option;
213 } else { 213 } else {
214 i = avb_find_dm_args(&cmdarg[0], VERITY_TABLE_OPT_RESTART); 214 i = avb_find_dm_args(&cmdarg[0], VERITY_TABLE_OPT_RESTART);
215 if (i < 0) { 215 if (i < 0) {
216 printf("%s: No verity options found\n", __func__); 216 printf("%s: No verity options found\n", __func__);
217 return NULL; 217 return NULL;
218 } 218 }
219 219
220 cmdarg[i] = (char *)option; 220 cmdarg[i] = (char *)option;
221 } 221 }
222 222
223 for (i = 0; i <= total_args; i++) 223 for (i = 0; i <= total_args; i++)
224 newargs = append_cmd_line(newargs, cmdarg[i]); 224 newargs = append_cmd_line(newargs, cmdarg[i]);
225 225
226 return newargs; 226 return newargs;
227 } 227 }
228 228
229 char *avb_set_ignore_corruption(const char *cmdline) 229 char *avb_set_ignore_corruption(const char *cmdline)
230 { 230 {
231 char *newargs = NULL; 231 char *newargs = NULL;
232 232
233 newargs = avb_set_enforce_option(cmdline, VERITY_TABLE_OPT_LOGGING); 233 newargs = avb_set_enforce_option(cmdline, VERITY_TABLE_OPT_LOGGING);
234 if (newargs) 234 if (newargs)
235 newargs = append_cmd_line(newargs, 235 newargs = append_cmd_line(newargs,
236 "androidboot.veritymode=eio"); 236 "androidboot.veritymode=eio");
237 237
238 return newargs; 238 return newargs;
239 } 239 }
240 240
241 char *avb_set_enforce_verity(const char *cmdline) 241 char *avb_set_enforce_verity(const char *cmdline)
242 { 242 {
243 char *newargs; 243 char *newargs;
244 244
245 newargs = avb_set_enforce_option(cmdline, VERITY_TABLE_OPT_RESTART); 245 newargs = avb_set_enforce_option(cmdline, VERITY_TABLE_OPT_RESTART);
246 if (newargs) 246 if (newargs)
247 newargs = append_cmd_line(newargs, 247 newargs = append_cmd_line(newargs,
248 "androidboot.veritymode=enforcing"); 248 "androidboot.veritymode=enforcing");
249 return newargs; 249 return newargs;
250 } 250 }
251 251
252 /** 252 /**
253 * ============================================================================ 253 * ============================================================================
254 * IO(mmc) auxiliary functions 254 * IO(mmc) auxiliary functions
255 * ============================================================================ 255 * ============================================================================
256 */ 256 */
257 static unsigned long mmc_read_and_flush(struct mmc_part *part, 257 static unsigned long mmc_read_and_flush(struct mmc_part *part,
258 lbaint_t start, 258 lbaint_t start,
259 lbaint_t sectors, 259 lbaint_t sectors,
260 void *buffer) 260 void *buffer)
261 { 261 {
262 unsigned long blks; 262 unsigned long blks;
263 void *tmp_buf; 263 void *tmp_buf;
264 size_t buf_size; 264 size_t buf_size;
265 bool unaligned = is_buf_unaligned(buffer); 265 bool unaligned = is_buf_unaligned(buffer);
266 266
267 if (start < part->info.start) { 267 if (start < part->info.start) {
268 printf("%s: partition start out of bounds\n", __func__); 268 printf("%s: partition start out of bounds\n", __func__);
269 return 0; 269 return 0;
270 } 270 }
271 if ((start + sectors) > (part->info.start + part->info.size)) { 271 if ((start + sectors) > (part->info.start + part->info.size)) {
272 sectors = part->info.start + part->info.size - start; 272 sectors = part->info.start + part->info.size - start;
273 printf("%s: read sector aligned to partition bounds (%ld)\n", 273 printf("%s: read sector aligned to partition bounds (%ld)\n",
274 __func__, sectors); 274 __func__, sectors);
275 } 275 }
276 276
277 /* 277 /*
278 * Reading fails on unaligned buffers, so we have to 278 * Reading fails on unaligned buffers, so we have to
279 * use aligned temporary buffer and then copy to destination 279 * use aligned temporary buffer and then copy to destination
280 */ 280 */
281 281
282 if (unaligned) { 282 if (unaligned) {
283 printf("Handling unaligned read buffer..\n"); 283 printf("Handling unaligned read buffer..\n");
284 tmp_buf = get_sector_buf(); 284 tmp_buf = get_sector_buf();
285 buf_size = get_sector_buf_size(); 285 buf_size = get_sector_buf_size();
286 if (sectors > buf_size / part->info.blksz) 286 if (sectors > buf_size / part->info.blksz)
287 sectors = buf_size / part->info.blksz; 287 sectors = buf_size / part->info.blksz;
288 } else { 288 } else {
289 tmp_buf = buffer; 289 tmp_buf = buffer;
290 } 290 }
291 291
292 blks = blk_dread(part->mmc_blk, 292 blks = blk_dread(part->mmc_blk,
293 start, sectors, tmp_buf); 293 start, sectors, tmp_buf);
294 /* flush cache after read */ 294 /* flush cache after read */
295 flush_cache((ulong)tmp_buf, sectors * part->info.blksz); 295 flush_cache((ulong)tmp_buf, sectors * part->info.blksz);
296 296
297 if (unaligned) 297 if (unaligned)
298 memcpy(buffer, tmp_buf, sectors * part->info.blksz); 298 memcpy(buffer, tmp_buf, sectors * part->info.blksz);
299 299
300 return blks; 300 return blks;
301 } 301 }
302 302
303 static unsigned long mmc_write(struct mmc_part *part, lbaint_t start, 303 static unsigned long mmc_write(struct mmc_part *part, lbaint_t start,
304 lbaint_t sectors, void *buffer) 304 lbaint_t sectors, void *buffer)
305 { 305 {
306 void *tmp_buf; 306 void *tmp_buf;
307 size_t buf_size; 307 size_t buf_size;
308 bool unaligned = is_buf_unaligned(buffer); 308 bool unaligned = is_buf_unaligned(buffer);
309 309
310 if (start < part->info.start) { 310 if (start < part->info.start) {
311 printf("%s: partition start out of bounds\n", __func__); 311 printf("%s: partition start out of bounds\n", __func__);
312 return 0; 312 return 0;
313 } 313 }
314 if ((start + sectors) > (part->info.start + part->info.size)) { 314 if ((start + sectors) > (part->info.start + part->info.size)) {
315 sectors = part->info.start + part->info.size - start; 315 sectors = part->info.start + part->info.size - start;
316 printf("%s: sector aligned to partition bounds (%ld)\n", 316 printf("%s: sector aligned to partition bounds (%ld)\n",
317 __func__, sectors); 317 __func__, sectors);
318 } 318 }
319 if (unaligned) { 319 if (unaligned) {
320 tmp_buf = get_sector_buf(); 320 tmp_buf = get_sector_buf();
321 buf_size = get_sector_buf_size(); 321 buf_size = get_sector_buf_size();
322 printf("Handling unaligned wrire buffer..\n"); 322 printf("Handling unaligned wrire buffer..\n");
323 if (sectors > buf_size / part->info.blksz) 323 if (sectors > buf_size / part->info.blksz)
324 sectors = buf_size / part->info.blksz; 324 sectors = buf_size / part->info.blksz;
325 325
326 memcpy(tmp_buf, buffer, sectors * part->info.blksz); 326 memcpy(tmp_buf, buffer, sectors * part->info.blksz);
327 } else { 327 } else {
328 tmp_buf = buffer; 328 tmp_buf = buffer;
329 } 329 }
330 330
331 return blk_dwrite(part->mmc_blk, 331 return blk_dwrite(part->mmc_blk,
332 start, sectors, tmp_buf); 332 start, sectors, tmp_buf);
333 } 333 }
334 334
335 static struct mmc_part *get_partition(AvbOps *ops, const char *partition) 335 static struct mmc_part *get_partition(AvbOps *ops, const char *partition)
336 { 336 {
337 int ret; 337 int ret;
338 u8 dev_num; 338 u8 dev_num;
339 int part_num = 0; 339 int part_num = 0;
340 struct mmc_part *part; 340 struct mmc_part *part;
341 struct blk_desc *mmc_blk; 341 struct blk_desc *mmc_blk;
342 342
343 part = malloc(sizeof(struct mmc_part)); 343 part = malloc(sizeof(struct mmc_part));
344 if (!part) 344 if (!part)
345 return NULL; 345 return NULL;
346 346
347 dev_num = get_boot_device(ops); 347 dev_num = get_boot_device(ops);
348 part->mmc = find_mmc_device(dev_num); 348 part->mmc = find_mmc_device(dev_num);
349 if (!part->mmc) { 349 if (!part->mmc) {
350 printf("No MMC device at slot %x\n", dev_num); 350 printf("No MMC device at slot %x\n", dev_num);
351 return NULL; 351 return NULL;
352 } 352 }
353 353
354 if (mmc_init(part->mmc)) { 354 if (mmc_init(part->mmc)) {
355 printf("MMC initialization failed\n"); 355 printf("MMC initialization failed\n");
356 return NULL; 356 return NULL;
357 } 357 }
358 358
359 ret = mmc_switch_part(part->mmc, part_num); 359 ret = mmc_switch_part(part->mmc, part_num);
360 if (ret) 360 if (ret)
361 return NULL; 361 return NULL;
362 362
363 mmc_blk = mmc_get_blk_desc(part->mmc); 363 mmc_blk = mmc_get_blk_desc(part->mmc);
364 if (!mmc_blk) { 364 if (!mmc_blk) {
365 printf("Error - failed to obtain block descriptor\n"); 365 printf("Error - failed to obtain block descriptor\n");
366 return NULL; 366 return NULL;
367 } 367 }
368 368
369 ret = part_get_info_by_name(mmc_blk, partition, &part->info); 369 ret = part_get_info_by_name(mmc_blk, partition, &part->info);
370 if (!ret) { 370 if (!ret) {
371 printf("Can't find partition '%s'\n", partition); 371 printf("Can't find partition '%s'\n", partition);
372 return NULL; 372 return NULL;
373 } 373 }
374 374
375 part->dev_num = dev_num; 375 part->dev_num = dev_num;
376 part->mmc_blk = mmc_blk; 376 part->mmc_blk = mmc_blk;
377 377
378 return part; 378 return part;
379 } 379 }
380 380
381 static AvbIOResult mmc_byte_io(AvbOps *ops, 381 static AvbIOResult mmc_byte_io(AvbOps *ops,
382 const char *partition, 382 const char *partition,
383 s64 offset, 383 s64 offset,
384 size_t num_bytes, 384 size_t num_bytes,
385 void *buffer, 385 void *buffer,
386 size_t *out_num_read, 386 size_t *out_num_read,
387 enum mmc_io_type io_type) 387 enum mmc_io_type io_type)
388 { 388 {
389 ulong ret; 389 ulong ret;
390 struct mmc_part *part; 390 struct mmc_part *part;
391 u64 start_offset, start_sector, sectors, residue; 391 u64 start_offset, start_sector, sectors, residue;
392 u8 *tmp_buf; 392 u8 *tmp_buf;
393 size_t io_cnt = 0; 393 size_t io_cnt = 0;
394 394
395 if (!partition || !buffer || io_type > IO_WRITE) 395 if (!partition || !buffer || io_type > IO_WRITE)
396 return AVB_IO_RESULT_ERROR_IO; 396 return AVB_IO_RESULT_ERROR_IO;
397 397
398 part = get_partition(ops, partition); 398 part = get_partition(ops, partition);
399 if (!part) 399 if (!part)
400 return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; 400 return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
401 401
402 start_offset = calc_offset(part, offset); 402 start_offset = calc_offset(part, offset);
403 while (num_bytes) { 403 while (num_bytes) {
404 start_sector = start_offset / part->info.blksz; 404 start_sector = start_offset / part->info.blksz;
405 sectors = num_bytes / part->info.blksz; 405 sectors = num_bytes / part->info.blksz;
406 /* handle non block-aligned reads */ 406 /* handle non block-aligned reads */
407 if (start_offset % part->info.blksz || 407 if (start_offset % part->info.blksz ||
408 num_bytes < part->info.blksz) { 408 num_bytes < part->info.blksz) {
409 tmp_buf = get_sector_buf(); 409 tmp_buf = get_sector_buf();
410 if (start_offset % part->info.blksz) { 410 if (start_offset % part->info.blksz) {
411 residue = part->info.blksz - 411 residue = part->info.blksz -
412 (start_offset % part->info.blksz); 412 (start_offset % part->info.blksz);
413 if (residue > num_bytes) 413 if (residue > num_bytes)
414 residue = num_bytes; 414 residue = num_bytes;
415 } else { 415 } else {
416 residue = num_bytes; 416 residue = num_bytes;
417 } 417 }
418 418
419 if (io_type == IO_READ) { 419 if (io_type == IO_READ) {
420 ret = mmc_read_and_flush(part, 420 ret = mmc_read_and_flush(part,
421 part->info.start + 421 part->info.start +
422 start_sector, 422 start_sector,
423 1, tmp_buf); 423 1, tmp_buf);
424 424
425 if (ret != 1) { 425 if (ret != 1) {
426 printf("%s: read error (%ld, %lld)\n", 426 printf("%s: read error (%ld, %lld)\n",
427 __func__, ret, start_sector); 427 __func__, ret, start_sector);
428 return AVB_IO_RESULT_ERROR_IO; 428 return AVB_IO_RESULT_ERROR_IO;
429 } 429 }
430 /* 430 /*
431 * if this is not aligned at sector start, 431 * if this is not aligned at sector start,
432 * we have to adjust the tmp buffer 432 * we have to adjust the tmp buffer
433 */ 433 */
434 tmp_buf += (start_offset % part->info.blksz); 434 tmp_buf += (start_offset % part->info.blksz);
435 memcpy(buffer, (void *)tmp_buf, residue); 435 memcpy(buffer, (void *)tmp_buf, residue);
436 } else { 436 } else {
437 ret = mmc_read_and_flush(part, 437 ret = mmc_read_and_flush(part,
438 part->info.start + 438 part->info.start +
439 start_sector, 439 start_sector,
440 1, tmp_buf); 440 1, tmp_buf);
441 441
442 if (ret != 1) { 442 if (ret != 1) {
443 printf("%s: read error (%ld, %lld)\n", 443 printf("%s: read error (%ld, %lld)\n",
444 __func__, ret, start_sector); 444 __func__, ret, start_sector);
445 return AVB_IO_RESULT_ERROR_IO; 445 return AVB_IO_RESULT_ERROR_IO;
446 } 446 }
447 memcpy((void *)tmp_buf + 447 memcpy((void *)tmp_buf +
448 start_offset % part->info.blksz, 448 start_offset % part->info.blksz,
449 buffer, residue); 449 buffer, residue);
450 450
451 ret = mmc_write(part, part->info.start + 451 ret = mmc_write(part, part->info.start +
452 start_sector, 1, tmp_buf); 452 start_sector, 1, tmp_buf);
453 if (ret != 1) { 453 if (ret != 1) {
454 printf("%s: write error (%ld, %lld)\n", 454 printf("%s: write error (%ld, %lld)\n",
455 __func__, ret, start_sector); 455 __func__, ret, start_sector);
456 return AVB_IO_RESULT_ERROR_IO; 456 return AVB_IO_RESULT_ERROR_IO;
457 } 457 }
458 } 458 }
459 459
460 io_cnt += residue; 460 io_cnt += residue;
461 buffer += residue; 461 buffer += residue;
462 start_offset += residue; 462 start_offset += residue;
463 num_bytes -= residue; 463 num_bytes -= residue;
464 continue; 464 continue;
465 } 465 }
466 466
467 if (sectors) { 467 if (sectors) {
468 if (io_type == IO_READ) { 468 if (io_type == IO_READ) {
469 ret = mmc_read_and_flush(part, 469 ret = mmc_read_and_flush(part,
470 part->info.start + 470 part->info.start +
471 start_sector, 471 start_sector,
472 sectors, buffer); 472 sectors, buffer);
473 } else { 473 } else {
474 ret = mmc_write(part, 474 ret = mmc_write(part,
475 part->info.start + 475 part->info.start +
476 start_sector, 476 start_sector,
477 sectors, buffer); 477 sectors, buffer);
478 } 478 }
479 479
480 if (!ret) { 480 if (!ret) {
481 printf("%s: sector read error\n", __func__); 481 printf("%s: sector read error\n", __func__);
482 return AVB_IO_RESULT_ERROR_IO; 482 return AVB_IO_RESULT_ERROR_IO;
483 } 483 }
484 484
485 io_cnt += ret * part->info.blksz; 485 io_cnt += ret * part->info.blksz;
486 buffer += ret * part->info.blksz; 486 buffer += ret * part->info.blksz;
487 start_offset += ret * part->info.blksz; 487 start_offset += ret * part->info.blksz;
488 num_bytes -= ret * part->info.blksz; 488 num_bytes -= ret * part->info.blksz;
489 } 489 }
490 } 490 }
491 491
492 /* Set counter for read operation */ 492 /* Set counter for read operation */
493 if (io_type == IO_READ && out_num_read) 493 if (io_type == IO_READ && out_num_read)
494 *out_num_read = io_cnt; 494 *out_num_read = io_cnt;
495 495
496 return AVB_IO_RESULT_OK; 496 return AVB_IO_RESULT_OK;
497 } 497 }
498 498
499 /** 499 /**
500 * ============================================================================ 500 * ============================================================================
501 * AVB 2.0 operations 501 * AVB 2.0 operations
502 * ============================================================================ 502 * ============================================================================
503 */ 503 */
504 504
505 /** 505 /**
506 * read_from_partition() - reads @num_bytes from @offset from partition 506 * read_from_partition() - reads @num_bytes from @offset from partition
507 * identified by a string name 507 * identified by a string name
508 * 508 *
509 * @ops: contains AVB ops handlers 509 * @ops: contains AVB ops handlers
510 * @partition_name: partition name, NUL-terminated UTF-8 string 510 * @partition_name: partition name, NUL-terminated UTF-8 string
511 * @offset: offset from the beginning of partition 511 * @offset: offset from the beginning of partition
512 * @num_bytes: amount of bytes to read 512 * @num_bytes: amount of bytes to read
513 * @buffer: destination buffer to store data 513 * @buffer: destination buffer to store data
514 * @out_num_read: 514 * @out_num_read:
515 * 515 *
516 * @return: 516 * @return:
517 * AVB_IO_RESULT_OK, if partition was found and read operation succeed 517 * AVB_IO_RESULT_OK, if partition was found and read operation succeed
518 * AVB_IO_RESULT_ERROR_IO, if i/o error occurred from the underlying i/o 518 * AVB_IO_RESULT_ERROR_IO, if i/o error occurred from the underlying i/o
519 * subsystem 519 * subsystem
520 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if there is no partition with 520 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if there is no partition with
521 * the given name 521 * the given name
522 */ 522 */
523 static AvbIOResult read_from_partition(AvbOps *ops, 523 static AvbIOResult read_from_partition(AvbOps *ops,
524 const char *partition_name, 524 const char *partition_name,
525 s64 offset_from_partition, 525 s64 offset_from_partition,
526 size_t num_bytes, 526 size_t num_bytes,
527 void *buffer, 527 void *buffer,
528 size_t *out_num_read) 528 size_t *out_num_read)
529 { 529 {
530 return mmc_byte_io(ops, partition_name, offset_from_partition, 530 return mmc_byte_io(ops, partition_name, offset_from_partition,
531 num_bytes, buffer, out_num_read, IO_READ); 531 num_bytes, buffer, out_num_read, IO_READ);
532 } 532 }
533 533
534 /** 534 /**
535 * write_to_partition() - writes N bytes to a partition identified by a string 535 * write_to_partition() - writes N bytes to a partition identified by a string
536 * name 536 * name
537 * 537 *
538 * @ops: AvbOps, contains AVB ops handlers 538 * @ops: AvbOps, contains AVB ops handlers
539 * @partition_name: partition name 539 * @partition_name: partition name
540 * @offset_from_partition: offset from the beginning of partition 540 * @offset_from_partition: offset from the beginning of partition
541 * @num_bytes: amount of bytes to write 541 * @num_bytes: amount of bytes to write
542 * @buf: data to write 542 * @buf: data to write
543 * @out_num_read: 543 * @out_num_read:
544 * 544 *
545 * @return: 545 * @return:
546 * AVB_IO_RESULT_OK, if partition was found and read operation succeed 546 * AVB_IO_RESULT_OK, if partition was found and read operation succeed
547 * AVB_IO_RESULT_ERROR_IO, if input/output error occurred 547 * AVB_IO_RESULT_ERROR_IO, if input/output error occurred
548 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if partition, specified in 548 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if partition, specified in
549 * @partition_name was not found 549 * @partition_name was not found
550 */ 550 */
551 static AvbIOResult write_to_partition(AvbOps *ops, 551 static AvbIOResult write_to_partition(AvbOps *ops,
552 const char *partition_name, 552 const char *partition_name,
553 s64 offset_from_partition, 553 s64 offset_from_partition,
554 size_t num_bytes, 554 size_t num_bytes,
555 const void *buffer) 555 const void *buffer)
556 { 556 {
557 return mmc_byte_io(ops, partition_name, offset_from_partition, 557 return mmc_byte_io(ops, partition_name, offset_from_partition,
558 num_bytes, (void *)buffer, NULL, IO_WRITE); 558 num_bytes, (void *)buffer, NULL, IO_WRITE);
559 } 559 }
560 560
561 /** 561 /**
562 * validate_vmbeta_public_key() - checks if the given public key used to sign 562 * validate_vmbeta_public_key() - checks if the given public key used to sign
563 * the vbmeta partition is trusted 563 * the vbmeta partition is trusted
564 * 564 *
565 * @ops: AvbOps, contains AVB ops handlers 565 * @ops: AvbOps, contains AVB ops handlers
566 * @public_key_data: public key for verifying vbmeta partition signature 566 * @public_key_data: public key for verifying vbmeta partition signature
567 * @public_key_length: length of public key 567 * @public_key_length: length of public key
568 * @public_key_metadata: 568 * @public_key_metadata:
569 * @public_key_metadata_length: 569 * @public_key_metadata_length:
570 * @out_key_is_trusted: 570 * @out_key_is_trusted:
571 * 571 *
572 * @return: 572 * @return:
573 * AVB_IO_RESULT_OK, if partition was found and read operation succeed 573 * AVB_IO_RESULT_OK, if partition was found and read operation succeed
574 */ 574 */
575 static AvbIOResult validate_vbmeta_public_key(AvbOps *ops, 575 static AvbIOResult validate_vbmeta_public_key(AvbOps *ops,
576 const u8 *public_key_data, 576 const u8 *public_key_data,
577 size_t public_key_length, 577 size_t public_key_length,
578 const u8 578 const u8
579 *public_key_metadata, 579 *public_key_metadata,
580 size_t 580 size_t
581 public_key_metadata_length, 581 public_key_metadata_length,
582 bool *out_key_is_trusted) 582 bool *out_key_is_trusted)
583 { 583 {
584 if (!public_key_length || !public_key_data || !out_key_is_trusted) 584 if (!public_key_length || !public_key_data || !out_key_is_trusted)
585 return AVB_IO_RESULT_ERROR_IO; 585 return AVB_IO_RESULT_ERROR_IO;
586 586
587 *out_key_is_trusted = false; 587 *out_key_is_trusted = false;
588 if (public_key_length != sizeof(avb_root_pub)) 588 if (public_key_length != sizeof(avb_root_pub))
589 return AVB_IO_RESULT_ERROR_IO; 589 return AVB_IO_RESULT_ERROR_IO;
590 590
591 if (memcmp(avb_root_pub, public_key_data, public_key_length) == 0) 591 if (memcmp(avb_root_pub, public_key_data, public_key_length) == 0)
592 *out_key_is_trusted = true; 592 *out_key_is_trusted = true;
593 593
594 return AVB_IO_RESULT_OK; 594 return AVB_IO_RESULT_OK;
595 } 595 }
596 596
597 /** 597 /**
598 * read_rollback_index() - gets the rollback index corresponding to the 598 * read_rollback_index() - gets the rollback index corresponding to the
599 * location of given by @out_rollback_index. 599 * location of given by @out_rollback_index.
600 * 600 *
601 * @ops: contains AvbOps handlers 601 * @ops: contains AvbOps handlers
602 * @rollback_index_slot: 602 * @rollback_index_slot:
603 * @out_rollback_index: used to write a retrieved rollback index. 603 * @out_rollback_index: used to write a retrieved rollback index.
604 * 604 *
605 * @return 605 * @return
606 * AVB_IO_RESULT_OK, if the roolback index was retrieved 606 * AVB_IO_RESULT_OK, if the roolback index was retrieved
607 */ 607 */
608 static AvbIOResult read_rollback_index(AvbOps *ops, 608 static AvbIOResult read_rollback_index(AvbOps *ops,
609 size_t rollback_index_slot, 609 size_t rollback_index_slot,
610 u64 *out_rollback_index) 610 u64 *out_rollback_index)
611 { 611 {
612 /* For now we always return 0 as the stored rollback index. */ 612 /* For now we always return 0 as the stored rollback index. */
613 printf("%s not supported yet\n", __func__); 613 printf("%s not supported yet\n", __func__);
614 614
615 if (out_rollback_index) 615 if (out_rollback_index)
616 *out_rollback_index = 0; 616 *out_rollback_index = 0;
617 617
618 return AVB_IO_RESULT_OK; 618 return AVB_IO_RESULT_OK;
619 } 619 }
620 620
621 /** 621 /**
622 * write_rollback_index() - sets the rollback index corresponding to the 622 * write_rollback_index() - sets the rollback index corresponding to the
623 * location of given by @out_rollback_index. 623 * location of given by @out_rollback_index.
624 * 624 *
625 * @ops: contains AvbOps handlers 625 * @ops: contains AvbOps handlers
626 * @rollback_index_slot: 626 * @rollback_index_slot:
627 * @rollback_index: rollback index to write. 627 * @rollback_index: rollback index to write.
628 * 628 *
629 * @return 629 * @return
630 * AVB_IO_RESULT_OK, if the roolback index was retrieved 630 * AVB_IO_RESULT_OK, if the roolback index was retrieved
631 */ 631 */
632 static AvbIOResult write_rollback_index(AvbOps *ops, 632 static AvbIOResult write_rollback_index(AvbOps *ops,
633 size_t rollback_index_slot, 633 size_t rollback_index_slot,
634 u64 rollback_index) 634 u64 rollback_index)
635 { 635 {
636 /* For now this is a no-op. */ 636 /* For now this is a no-op. */
637 printf("%s not supported yet\n", __func__); 637 printf("%s not supported yet\n", __func__);
638 638
639 return AVB_IO_RESULT_OK; 639 return AVB_IO_RESULT_OK;
640 } 640 }
641 641
642 /** 642 /**
643 * read_is_device_unlocked() - gets whether the device is unlocked 643 * read_is_device_unlocked() - gets whether the device is unlocked
644 * 644 *
645 * @ops: contains AVB ops handlers 645 * @ops: contains AVB ops handlers
646 * @out_is_unlocked: device unlock state is stored here, true if unlocked, 646 * @out_is_unlocked: device unlock state is stored here, true if unlocked,
647 * false otherwise 647 * false otherwise
648 * 648 *
649 * @return: 649 * @return:
650 * AVB_IO_RESULT_OK: state is retrieved successfully 650 * AVB_IO_RESULT_OK: state is retrieved successfully
651 * AVB_IO_RESULT_ERROR_IO: an error occurred 651 * AVB_IO_RESULT_ERROR_IO: an error occurred
652 */ 652 */
653 static AvbIOResult read_is_device_unlocked(AvbOps *ops, bool *out_is_unlocked) 653 static AvbIOResult read_is_device_unlocked(AvbOps *ops, bool *out_is_unlocked)
654 { 654 {
655 /* For now we always return that the device is unlocked. */ 655 /* For now we always return that the device is unlocked. */
656 656
657 printf("%s not supported yet\n", __func__); 657 printf("%s not supported yet\n", __func__);
658 658
659 *out_is_unlocked = true; 659 *out_is_unlocked = true;
660 660
661 return AVB_IO_RESULT_OK; 661 return AVB_IO_RESULT_OK;
662 } 662 }
663 663
664 /** 664 /**
665 * get_unique_guid_for_partition() - gets the GUID for a partition identified 665 * get_unique_guid_for_partition() - gets the GUID for a partition identified
666 * by a string name 666 * by a string name
667 * 667 *
668 * @ops: contains AVB ops handlers 668 * @ops: contains AVB ops handlers
669 * @partition: partition name (NUL-terminated UTF-8 string) 669 * @partition: partition name (NUL-terminated UTF-8 string)
670 * @guid_buf: buf, used to copy in GUID string. Example of value: 670 * @guid_buf: buf, used to copy in GUID string. Example of value:
671 * 527c1c6d-6361-4593-8842-3c78fcd39219 671 * 527c1c6d-6361-4593-8842-3c78fcd39219
672 * @guid_buf_size: @guid_buf buffer size 672 * @guid_buf_size: @guid_buf buffer size
673 * 673 *
674 * @return: 674 * @return:
675 * AVB_IO_RESULT_OK, on success (GUID found) 675 * AVB_IO_RESULT_OK, on success (GUID found)
676 * AVB_IO_RESULT_ERROR_IO, if incorrect buffer size (@guid_buf_size) was 676 * AVB_IO_RESULT_ERROR_IO, if incorrect buffer size (@guid_buf_size) was
677 * provided 677 * provided
678 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if partition was not found 678 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if partition was not found
679 */ 679 */
680 static AvbIOResult get_unique_guid_for_partition(AvbOps *ops, 680 static AvbIOResult get_unique_guid_for_partition(AvbOps *ops,
681 const char *partition, 681 const char *partition,
682 char *guid_buf, 682 char *guid_buf,
683 size_t guid_buf_size) 683 size_t guid_buf_size)
684 { 684 {
685 struct mmc_part *part; 685 struct mmc_part *part;
686 size_t uuid_size; 686 size_t uuid_size;
687 687
688 part = get_partition(ops, partition); 688 part = get_partition(ops, partition);
689 if (!part) 689 if (!part)
690 return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; 690 return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
691 691
692 uuid_size = sizeof(part->info.uuid); 692 uuid_size = sizeof(part->info.uuid);
693 if (uuid_size > guid_buf_size) 693 if (uuid_size > guid_buf_size)
694 return AVB_IO_RESULT_ERROR_IO; 694 return AVB_IO_RESULT_ERROR_IO;
695 695
696 memcpy(guid_buf, part->info.uuid, uuid_size); 696 memcpy(guid_buf, part->info.uuid, uuid_size);
697 guid_buf[uuid_size - 1] = 0; 697 guid_buf[uuid_size - 1] = 0;
698 698
699 return AVB_IO_RESULT_OK; 699 return AVB_IO_RESULT_OK;
700 } 700 }
701 701
702 /** 702 /**
703 * get_size_of_partition() - gets the size of a partition identified 703 * get_size_of_partition() - gets the size of a partition identified
704 * by a string name 704 * by a string name
705 * 705 *
706 * @ops: contains AVB ops handlers 706 * @ops: contains AVB ops handlers
707 * @partition: partition name (NUL-terminated UTF-8 string) 707 * @partition: partition name (NUL-terminated UTF-8 string)
708 * @out_size_num_bytes: returns the value of a partition size 708 * @out_size_num_bytes: returns the value of a partition size
709 * 709 *
710 * @return: 710 * @return:
711 * AVB_IO_RESULT_OK, on success (GUID found) 711 * AVB_IO_RESULT_OK, on success (GUID found)
712 * AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE, out_size_num_bytes is NULL 712 * AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE, out_size_num_bytes is NULL
713 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if partition was not found 713 * AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION, if partition was not found
714 */ 714 */
715 static AvbIOResult get_size_of_partition(AvbOps *ops, 715 static AvbIOResult get_size_of_partition(AvbOps *ops,
716 const char *partition, 716 const char *partition,
717 u64 *out_size_num_bytes) 717 u64 *out_size_num_bytes)
718 { 718 {
719 struct mmc_part *part; 719 struct mmc_part *part;
720 720
721 if (!out_size_num_bytes) 721 if (!out_size_num_bytes)
722 return AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE; 722 return AVB_IO_RESULT_ERROR_INSUFFICIENT_SPACE;
723 723
724 part = get_partition(ops, partition); 724 part = get_partition(ops, partition);
725 if (!part) 725 if (!part)
726 return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION; 726 return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
727 727
728 *out_size_num_bytes = part->info.blksz * part->info.size; 728 *out_size_num_bytes = part->info.blksz * part->info.size;
729 729
730 return AVB_IO_RESULT_OK; 730 return AVB_IO_RESULT_OK;
731 } 731 }
732 732
733 /** 733 /**
734 * ============================================================================ 734 * ============================================================================
735 * AVB2.0 AvbOps alloc/initialisation/free 735 * AVB2.0 AvbOps alloc/initialisation/free
736 * ============================================================================ 736 * ============================================================================
737 */ 737 */
738 AvbOps *avb_ops_alloc(int boot_device) 738 AvbOps *avb_ops_alloc(int boot_device)
739 { 739 {
740 struct AvbOpsData *ops_data; 740 struct AvbOpsData *ops_data;
741 741
742 ops_data = avb_calloc(sizeof(struct AvbOpsData)); 742 ops_data = avb_calloc(sizeof(struct AvbOpsData));
743 if (!ops_data) 743 if (!ops_data)
744 return NULL; 744 return NULL;
745 745
746 ops_data->ops.user_data = ops_data; 746 ops_data->ops.user_data = ops_data;
747 747
748 ops_data->ops.read_from_partition = read_from_partition; 748 ops_data->ops.read_from_partition = read_from_partition;
749 ops_data->ops.write_to_partition = write_to_partition; 749 ops_data->ops.write_to_partition = write_to_partition;
750 ops_data->ops.validate_vbmeta_public_key = validate_vbmeta_public_key; 750 ops_data->ops.validate_vbmeta_public_key = validate_vbmeta_public_key;
751 ops_data->ops.read_rollback_index = read_rollback_index; 751 ops_data->ops.read_rollback_index = read_rollback_index;
752 ops_data->ops.write_rollback_index = write_rollback_index; 752 ops_data->ops.write_rollback_index = write_rollback_index;
753 ops_data->ops.read_is_device_unlocked = read_is_device_unlocked; 753 ops_data->ops.read_is_device_unlocked = read_is_device_unlocked;
754 ops_data->ops.get_unique_guid_for_partition = 754 ops_data->ops.get_unique_guid_for_partition =
755 get_unique_guid_for_partition; 755 get_unique_guid_for_partition;
756 ops_data->ops.get_size_of_partition = get_size_of_partition; 756 ops_data->ops.get_size_of_partition = get_size_of_partition;
757 ops_data->mmc_dev = boot_device; 757 ops_data->mmc_dev = boot_device;
758 758
759 return &ops_data->ops; 759 return &ops_data->ops;
760 } 760 }
761 761
762 void avb_ops_free(AvbOps *ops) 762 void avb_ops_free(AvbOps *ops)
763 { 763 {
764 struct AvbOpsData *ops_data; 764 struct AvbOpsData *ops_data;
765 765
766 if (ops) 766 if (ops)
767 return; 767 return;
768 768
769 ops_data = ops->user_data; 769 ops_data = ops->user_data;
770 770
771 if (ops_data) 771 if (ops_data)
772 avb_free(ops_data); 772 avb_free(ops_data);
773 } 773 }
774 774