121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen/*
221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen * Copyright (C) 2016 The Android Open Source Project
321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen *
4c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * Permission is hereby granted, free of charge, to any person
5c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * obtaining a copy of this software and associated documentation
6c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * files (the "Software"), to deal in the Software without
7c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * restriction, including without limitation the rights to use, copy,
8c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * modify, merge, publish, distribute, sublicense, and/or sell copies
9c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * of the Software, and to permit persons to whom the Software is
10c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * furnished to do so, subject to the following conditions:
1121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen *
12c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * The above copyright notice and this permission notice shall be
13c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * included in all copies or substantial portions of the Software.
1421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen *
15c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22c612e2e353444f6ad714e43702c2afd057516254David Zeuthen * SOFTWARE.
2321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen */
2421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
2521e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#if !defined(AVB_INSIDE_LIBAVB_H) && !defined(AVB_COMPILATION)
2621e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#error "Never include this file directly, include libavb.h instead."
2721e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#endif
2821e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
2921e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#ifndef AVB_FOOTER_H_
3021e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#define AVB_FOOTER_H_
3121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
3221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#include "avb_sysdeps.h"
3321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
3421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#ifdef __cplusplus
3521e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthenextern "C" {
3621e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#endif
3721e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
3821e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen/* Magic for the footer. */
3921e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#define AVB_FOOTER_MAGIC "AVBf"
4021e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#define AVB_FOOTER_MAGIC_LEN 4
4121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
4221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen/* Size of the footer. */
4321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#define AVB_FOOTER_SIZE 64
4421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
45e3cadcacd798effe83b1593dba1ee0e3d84cf6e4David Zeuthen/* The current footer version used - keep in sync with avbtool. */
46e3cadcacd798effe83b1593dba1ee0e3d84cf6e4David Zeuthen#define AVB_FOOTER_VERSION_MAJOR 1
47e3cadcacd798effe83b1593dba1ee0e3d84cf6e4David Zeuthen#define AVB_FOOTER_VERSION_MINOR 0
4821e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
4921e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen/* The struct used as a footer used on partitions, used to find the
5021e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen * AvbVBMetaImageHeader struct. This struct is always stored at the
5121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen * end of a partition.
5221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen */
5321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthentypedef struct AvbFooter {
5421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*   0: Four bytes equal to "AVBf" (AVB_FOOTER_MAGIC). */
5521e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint8_t magic[AVB_FOOTER_MAGIC_LEN];
5621e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*   4: The major version of the footer struct. */
5721e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint32_t version_major;
5821e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*   8: The minor version of the footer struct. */
5921e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint32_t version_minor;
6021e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
6121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*  12: The original size of the image on the partition. */
6221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint64_t original_image_size;
6321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
6421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*  20: The offset of the |AvbVBMetaImageHeader| struct. */
6521e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint64_t vbmeta_offset;
6621e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
6721e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*  28: The size of the vbmeta block (header + auth + aux blocks). */
6821e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint64_t vbmeta_size;
6921e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
7021e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  /*  36: Padding to ensure struct is size AVB_FOOTER_SIZE bytes. This
7121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen   * must be set to zeroes.
7221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen   */
7321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen  uint8_t reserved[28];
7421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen} AVB_ATTR_PACKED AvbFooter;
7521e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
7621e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen/* Copies |src| to |dest| and validates, byte-swapping fields in the
7721e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen * process if needed. Returns true if valid, false if invalid.
7821e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen */
7921e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthenbool avb_footer_validate_and_byteswap(const AvbFooter* src, AvbFooter* dest)
8021e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen    AVB_ATTR_WARN_UNUSED_RESULT;
8121e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
8221e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#ifdef __cplusplus
8321e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen}
8421e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#endif
8521e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen
8621e95266704e572ced1c633bbc4aea9f42afa0a5David Zeuthen#endif /* AVB_FOOTER_H_ */
87