228 lines
7.9 KiB
C
228 lines
7.9 KiB
C
/*
|
|
* Copyright (C) 2016 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef _NANOHUB_NANOHUB_H_
|
|
#define _NANOHUB_NANOHUB_H_
|
|
|
|
#include <inttypes.h>
|
|
#include <nanohub/aes.h>
|
|
|
|
/* this file is collection of nanohub-related definitions shared between multiple parties,
|
|
* including but not limited to: HAL, Kernel, utilities, nanohub FW
|
|
* it provides minimum details on nanohub implementation, necessary to reliably identify it, and
|
|
* generate/parse compatible images
|
|
*/
|
|
|
|
#define NANOHUB_OS_PATCH_LEVEL 0x0000
|
|
|
|
#define NANOHUB_VENDOR_GOOGLE UINT64_C(0x476F6F676C) // "Googl"
|
|
#define NANOHUB_VENDOR_STMICRO UINT64_C(0x53544d6963) // "STMic"
|
|
#define NANOHUB_VENDOR_INVENSENSE UINT64_C(0x496E76656E) // "Inven"
|
|
|
|
#define NANOAPP_SIGNED_FLAG 0x1 // contents is signed with one or more signature block(s)
|
|
#define NANOAPP_ENCRYPTED_FLAG 0x2 // contents is encrypted with exactly one encryption key
|
|
|
|
#define NANOAPP_AOSP_MAGIC (((uint32_t)'N' << 0) | ((uint32_t)'A' << 8) | ((uint32_t)'N' << 16) | ((uint32_t)'O' << 24))
|
|
#define NANOAPP_FW_MAGIC (((uint32_t)'N' << 0) | ((uint32_t)'B' << 8) | ((uint32_t)'I' << 16) | ((uint32_t)'N' << 24))
|
|
#define GOOGLE_LAYOUT_MAGIC (((uint32_t)'G' << 0) | ((uint32_t)'o' << 8) | ((uint32_t)'o' << 16) | ((uint32_t)'g' << 24))
|
|
|
|
#define APP_ID_ANY UINT64_C(0xFFFFFFFFFFFFFFFF)
|
|
#define APP_VENDOR_ANY UINT64_C(0xFFFFFFFFFF)
|
|
#define APP_VENDOR_SHF (24)
|
|
#define APP_SEQ_ID_ANY UINT32_C(0xFFFFFF)
|
|
#define APP_ID_GET_VENDOR(appid) ((appid) >> APP_VENDOR_SHF)
|
|
#define APP_ID_GET_SEQ_ID(appid) ((appid) & APP_SEQ_ID_ANY)
|
|
#define APP_ID_MAKE(vendor, app) ((((uint64_t)(vendor)) << APP_VENDOR_SHF) | ((app) & APP_SEQ_ID_ANY))
|
|
|
|
#ifndef CONTEXT_HUB_H
|
|
// The binary format below is in little endian format; borrowed from CONTEXT_HUB_H
|
|
struct nano_app_binary_t {
|
|
uint32_t header_version; // 0x1 for this version
|
|
uint32_t magic; // "NANO"
|
|
uint64_t app_id; // App Id contains vendor id
|
|
uint32_t app_version; // Version of the app
|
|
uint32_t flags; // Signed, encrypted
|
|
uint64_t hw_hub_type; // which hub type is this compiled for
|
|
uint8_t chre_api_major; // Which CHRE API version this is compiled for
|
|
uint8_t chre_api_minor;
|
|
uint8_t reserved[6]; // Should be all zeroes
|
|
uint8_t custom_binary[0]; // start of custom binary data
|
|
};
|
|
|
|
#endif
|
|
|
|
struct HostMsgHdr {
|
|
uint32_t eventId;
|
|
uint64_t appId;
|
|
uint8_t len;
|
|
} __attribute__((packed));
|
|
|
|
struct HostMsgHdrChreV10 {
|
|
uint32_t eventId;
|
|
uint64_t appId;
|
|
uint8_t len;
|
|
uint32_t appEventId;
|
|
} __attribute__((packed));
|
|
|
|
struct HostMsgHdrChre {
|
|
uint32_t eventId;
|
|
uint64_t appId;
|
|
uint8_t len;
|
|
uint32_t appEventId;
|
|
uint16_t endpoint;
|
|
} __attribute__((packed));
|
|
|
|
// we translate AOSP header into FW header: this header is in LE format
|
|
// please maintain natural alignment for every field (matters to Intel; otherwise is has to be declared as packed)
|
|
struct FwCommonHdr {
|
|
uint32_t magic; // external & internal: NANOAPP_FW_MAGIC
|
|
uint16_t fwVer; // external & internal: set to 1; header version
|
|
uint16_t fwFlags; // external & internal: class : EXTERNAL/INTERNAL, EXEC/NOEXEC, APP/KERNEL/EEDATA/...
|
|
uint64_t appId; // external: copy from AOSP header; internal: defined locally
|
|
uint32_t appVer; // external: copy from AOSP header; internal: defined locally
|
|
uint8_t payInfoType; // external: copy ImageLayout::payload; internal: LAYOUT_APP
|
|
uint8_t payInfoSize; // sizeof(PayloadInfo) for this payload type
|
|
uint8_t chreApiMajor; // Chre Api Major Version (or 0xFF for non-chre nanoapps)
|
|
uint8_t chreApiMinor; // Chre Api Minor Version (or 0xFF for non-chre nanoapps)
|
|
};
|
|
|
|
struct SectInfo {
|
|
uint32_t data_start;
|
|
uint32_t data_end;
|
|
uint32_t data_data;
|
|
|
|
uint32_t bss_start;
|
|
uint32_t bss_end;
|
|
|
|
uint32_t got_start;
|
|
uint32_t got_end;
|
|
uint32_t rel_start;
|
|
uint32_t rel_end;
|
|
};
|
|
|
|
// this is platform-invariant version of struct TaskFuncs (from seos.h)
|
|
struct AppVectors {
|
|
uint32_t init;
|
|
uint32_t end;
|
|
uint32_t handle;
|
|
};
|
|
|
|
#define FLASH_RELOC_OFFSET offsetof(struct AppHdr, sect) // used by appSupport.c at run time
|
|
#define BINARY_RELOC_OFFSET offsetof(struct BinHdr, sect) // used by postprocess at build time
|
|
|
|
struct BinCommonHdr {
|
|
uint32_t magic;
|
|
uint32_t appVer;
|
|
};
|
|
|
|
// binary nanoapp image (.bin) produced by objcopy starts with this binary header (LE)
|
|
struct BinHdr {
|
|
struct BinCommonHdr hdr;
|
|
struct SectInfo sect;
|
|
struct AppVectors vec;
|
|
};
|
|
|
|
// FW nanoapp image starts with this binary header (LE) in flash
|
|
struct AppHdr {
|
|
struct FwCommonHdr hdr;
|
|
struct SectInfo sect;
|
|
struct AppVectors vec;
|
|
};
|
|
|
|
struct AppSecSignHdr {
|
|
uint32_t appDataLen;
|
|
};
|
|
|
|
struct AppSecEncrHdr {
|
|
uint64_t keyID;
|
|
uint32_t dataLen;
|
|
uint32_t IV[AES_BLOCK_WORDS];
|
|
};
|
|
|
|
#define LAYOUT_APP 1
|
|
#define LAYOUT_KEY 2
|
|
#define LAYOUT_OS 3
|
|
#define LAYOUT_DATA 4
|
|
|
|
struct ImageLayout {
|
|
uint32_t magic; // Layout ID: (GOOGLE_LAYOUT_MAGIC for this implementation)
|
|
uint8_t version; // layout version
|
|
uint8_t payload; // type of payload: APP, SECRET KEY, OS IMAGE, USER DATA, ...
|
|
uint16_t flags; // layout flags: extra options for certain payload types; payload-specific
|
|
};
|
|
|
|
// .napp image starts with this binary header (LE)
|
|
// it is optionally followed by AppSecSignHdr and/or AppSecEncrHdr
|
|
// all of the above are included in signing hash, but never encrypted
|
|
// encryption (if enabled) starts immediately after those
|
|
struct ImageHeader {
|
|
struct nano_app_binary_t aosp;
|
|
struct ImageLayout layout;
|
|
};
|
|
|
|
#define CKK_RSA 0x00
|
|
#define CKK_AES 0x1F
|
|
|
|
#define CKO_PUBLIC_KEY 0x02
|
|
#define CKO_PRIVATE_KEY 0x03
|
|
#define CKO_SECRET_KEY 0x04
|
|
|
|
// flags
|
|
#define FL_KI_ENFORCE_ID 0x0001 // if set, size, key_type, obj_type must be valid
|
|
|
|
// payload header format: LAYOUT_KEY
|
|
struct KeyInfo {
|
|
union {
|
|
struct {
|
|
uint16_t id; // arbitrary number, != 0, equivalent of PKCS#11 name
|
|
uint16_t flags; // key flags (additional PKCS#11 attrs, unused for now; must be 0)
|
|
uint16_t size; // key size in bits
|
|
uint8_t key_type; // 8 LSB of PKCS-11 CKK_<KEY TYPE>
|
|
uint8_t obj_type; // 8 LSB of PKCS-11 CKO_<OBJ TYPE>
|
|
};
|
|
uint64_t data; // complete 64-bit key-id, unique within this APP namespace (complete id is <APP_ID | KEY_INFO> 128 bits)
|
|
};
|
|
};
|
|
|
|
#define AES_KEY_ID(_id) (((struct KeyInfo){ .key_type = CKK_AES, .obj_type = CKO_SECRET_KEY, .size = 256, .id = (_id) }).data)
|
|
|
|
// payload header format: LAYOUT_APP
|
|
struct AppInfo {
|
|
struct SectInfo sect;
|
|
struct AppVectors vec;
|
|
};
|
|
|
|
#define OS_UPDT_MARKER_INPROGRESS 0xFF
|
|
#define OS_UPDT_MARKER_DOWNLOADED 0xFE
|
|
#define OS_UPDT_MARKER_VERIFIED 0xF0
|
|
#define OS_UPDT_MARKER_INVALID 0x00
|
|
#define OS_UPDT_MAGIC "Nanohub OS" //11 bytes incl terminator
|
|
|
|
// payload header format: LAYOUT_OS
|
|
struct OsUpdateHdr {
|
|
char magic[11];
|
|
uint8_t marker; //OS_UPDT_MARKER_INPROGRESS -> OS_UPDT_MARKER_DOWNLOADED -> OS_UPDT_MARKER_VERIFIED / OS_UPDT_INVALID
|
|
uint32_t size; //does not include the mandatory signature (using device key) that follows
|
|
};
|
|
|
|
// payload header format: LAYOUT_DATA
|
|
struct DataInfo {
|
|
uint32_t id;
|
|
uint32_t size;
|
|
};
|
|
|
|
#endif // _NANOHUB_NANOHUB_H_
|