summaryrefslogtreecommitdiff
path: root/include/extension.h
blob: 78b9d63f37c7a62c42ba7ba9bc8044e486a2843d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* Copyright 2015 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef __EC_INCLUDE_EXTENSION_H
#define __EC_INCLUDE_EXTENSION_H

#include <stddef.h>
#include <stdint.h>

#include "common.h"

/*
 * Type of function handling extension commands.
 *
 * @param buffer        As input points to the input data to be processed, as
 *                      output stores data, processing result.
 * @param command_size  Number of bytes of input data
 * @param response_size On input - max size of the buffer, on output - actual
 *                      number of data returned by the handler.
 */
typedef void (*extension_handler)(void *buffer,
				 size_t command_size,
				 size_t *response_size);
/*
 * Find handler for an extension command.
 *
 * @param command_code Code associated with a extension command handler.
 * @param buffer       Data to be processd by the handler, the same space
 *                     is used for data returned by the handler.
 * @command_size       Size of the input data.
 * @param size On input - max size of the buffer, on output - actual number of
 *                     data returned by the handler. A single byte return
 *                     usually indicates an error and contains the error code.
 */
void extension_route_command(uint16_t command_code,
			    void *buffer,
			    size_t command_size,
			    size_t *size);

struct extension_command {
	uint16_t command_code;
	extension_handler handler;
} __packed;

/* Values for different extension subcommands. */
enum {
	EXTENSION_AES = 0,
	EXTENSION_HASH = 1,
	EXTENSION_RSA = 2,
	EXTENSION_EC = 3,
};


/* Error codes reported by extension commands. */
enum {
	/* EXTENSION_HASH error codes */
	/* Attempt to start a session on an active handle. */
	EXC_HASH_DUPLICATED_HANDLE = 1,
	EXC_HASH_TOO_MANY_HANDLES = 2,  /* No room to allocate a new context. */
	/* Continuation/finish on unknown context. */
	EXC_HASH_UNKNOWN_CONTEXT = 3
};

#define DECLARE_EXTENSION_COMMAND(code, handler) \
	const struct extension_command __keep __extension_cmd_##code \
	__attribute__((section(".rodata.extensioncmds")))	   \
	= {code, handler}

#endif  /* __EC_INCLUDE_EXTENSION_H */