uboot/include/hash.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2012 The Chromium OS Authors.
   3 * SPDX-License-Identifier:     GPL-2.0+
   4 */
   5
   6#ifndef _HASH_H
   7#define _HASH_H
   8
   9/*
  10 * Maximum digest size for all algorithms we support. Having this value
  11 * avoids a malloc() or C99 local declaration in common/cmd_hash.c.
  12 */
  13#define HASH_MAX_DIGEST_SIZE    32
  14
  15enum {
  16        HASH_FLAG_VERIFY        = 1 << 0,       /* Enable verify mode */
  17        HASH_FLAG_ENV           = 1 << 1,       /* Allow env vars */
  18};
  19
  20struct hash_algo {
  21        const char *name;                       /* Name of algorithm */
  22        int digest_size;                        /* Length of digest */
  23        /**
  24         * hash_func_ws: Generic hashing function
  25         *
  26         * This is the generic prototype for a hashing function. We only
  27         * have the watchdog version at present.
  28         *
  29         * @input:      Input buffer
  30         * @ilen:       Input buffer length
  31         * @output:     Checksum result (length depends on algorithm)
  32         * @chunk_sz:   Trigger watchdog after processing this many bytes
  33         */
  34        void (*hash_func_ws)(const unsigned char *input, unsigned int ilen,
  35                unsigned char *output, unsigned int chunk_sz);
  36        int chunk_size;                         /* Watchdog chunk size */
  37        /*
  38         * hash_init: Create the context for progressive hashing
  39         *
  40         * @algo: Pointer to the hash_algo struct
  41         * @ctxp: Pointer to the pointer of the context for hashing
  42         * @return 0 if ok, -1 on error
  43         */
  44        int (*hash_init)(struct hash_algo *algo, void **ctxp);
  45        /*
  46         * hash_update: Perform hashing on the given buffer
  47         *
  48         * The context is freed by this function if an error occurs.
  49         *
  50         * @algo: Pointer to the hash_algo struct
  51         * @ctx: Pointer to the context for hashing
  52         * @buf: Pointer to the buffer being hashed
  53         * @size: Size of the buffer being hashed
  54         * @is_last: 1 if this is the last update; 0 otherwise
  55         * @return 0 if ok, -1 on error
  56         */
  57        int (*hash_update)(struct hash_algo *algo, void *ctx, const void *buf,
  58                           unsigned int size, int is_last);
  59        /*
  60         * hash_finish: Write the hash result to the given buffer
  61         *
  62         * The context is freed by this function.
  63         *
  64         * @algo: Pointer to the hash_algo struct
  65         * @ctx: Pointer to the context for hashing
  66         * @dest_buf: Pointer to the buffer for the result
  67         * @size: Size of the buffer for the result
  68         * @return 0 if ok, -ENOSPC if size of the result buffer is too small
  69         *   or -1 on other errors
  70         */
  71        int (*hash_finish)(struct hash_algo *algo, void *ctx, void *dest_buf,
  72                           int size);
  73};
  74
  75#ifndef USE_HOSTCC
  76/**
  77 * hash_command: Process a hash command for a particular algorithm
  78 *
  79 * This common function is used to implement specific hash commands.
  80 *
  81 * @algo_name:          Hash algorithm being used (lower case!)
  82 * @flags:              Flags value (HASH_FLAG_...)
  83 * @cmdtp:              Pointer to command table entry
  84 * @flag:               Some flags normally 0 (see CMD_FLAG_.. above)
  85 * @argc:               Number of arguments (arg 0 must be the command text)
  86 * @argv:               Arguments
  87 */
  88int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
  89                 int argc, char * const argv[]);
  90
  91/**
  92 * hash_block() - Hash a block according to the requested algorithm
  93 *
  94 * The caller probably knows the hash length for the chosen algorithm, but
  95 * in order to provide a general interface, and output_size parameter is
  96 * provided.
  97 *
  98 * @algo_name:          Hash algorithm to use
  99 * @data:               Data to hash
 100 * @len:                Lengh of data to hash in bytes
 101 * @output:             Place to put hash value
 102 * @output_size:        On entry, pointer to the number of bytes available in
 103 *                      output. On exit, pointer to the number of bytes used.
 104 *                      If NULL, then it is assumed that the caller has
 105 *                      allocated enough space for the hash. This is possible
 106 *                      since the caller is selecting the algorithm.
 107 * @return 0 if ok, -ve on error: -EPROTONOSUPPORT for an unknown algorithm,
 108 * -ENOSPC if the output buffer is not large enough.
 109 */
 110int hash_block(const char *algo_name, const void *data, unsigned int len,
 111               uint8_t *output, int *output_size);
 112
 113#endif /* !USE_HOSTCC */
 114
 115/**
 116 * hash_lookup_algo() - Look up the hash_algo struct for an algorithm
 117 *
 118 * The function returns the pointer to the struct or -EPROTONOSUPPORT if the
 119 * algorithm is not available.
 120 *
 121 * @algo_name: Hash algorithm to look up
 122 * @algop: Pointer to the hash_algo struct if found
 123 *
 124 * @return 0 if ok, -EPROTONOSUPPORT for an unknown algorithm.
 125 */
 126int hash_lookup_algo(const char *algo_name, struct hash_algo **algop);
 127
 128/**
 129 * hash_progressive_lookup_algo() - Look up hash_algo for prog. hash support
 130 *
 131 * The function returns the pointer to the struct or -EPROTONOSUPPORT if the
 132 * algorithm is not available with progressive hash support.
 133 *
 134 * @algo_name: Hash algorithm to look up
 135 * @algop: Pointer to the hash_algo struct if found
 136 *
 137 * @return 0 if ok, -EPROTONOSUPPORT for an unknown algorithm.
 138 */
 139int hash_progressive_lookup_algo(const char *algo_name,
 140                                 struct hash_algo **algop);
 141
 142/**
 143 * hash_parse_string() - Parse hash string into a binary array
 144 *
 145 * The function parses a hash string into a binary array that
 146 * can for example easily be used to compare to hash values.
 147 *
 148 * @algo_name: Hash algorithm to look up
 149 * @str: Hash string to get parsed
 150 * @result: Binary array of the parsed hash string
 151 *
 152 * @return 0 if ok, -EPROTONOSUPPORT for an unknown algorithm.
 153 */
 154int hash_parse_string(const char *algo_name, const char *str, uint8_t *result);
 155
 156#endif
 157