Lee Kai Xuan / mbed-os

Fork of mbed-os by erkin yucel

Committer:
elessair
Date:
Sun Oct 23 15:10:02 2016 +0000
Revision:
0:f269e3021894
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elessair 0:f269e3021894 1 /*
elessair 0:f269e3021894 2 * Copyright (c) 2006-2016 ARM Limited. All rights reserved.
elessair 0:f269e3021894 3 *
elessair 0:f269e3021894 4 * SPDX-License-Identifier: LicenseRef-PBL
elessair 0:f269e3021894 5 *
elessair 0:f269e3021894 6 * Licensed under the Permissive Binary License, Version 1.0 (the "License"); you may not use this file except in compliance with the License.
elessair 0:f269e3021894 7 * You may obtain a copy of the License at
elessair 0:f269e3021894 8 *
elessair 0:f269e3021894 9 * https://www.mbed.com/licenses/PBL-1.0
elessair 0:f269e3021894 10 *
elessair 0:f269e3021894 11 * See the License for the specific language governing permissions and limitations under the License.
elessair 0:f269e3021894 12 *
elessair 0:f269e3021894 13 */
elessair 0:f269e3021894 14 /**
elessair 0:f269e3021894 15 * \file ns_sha256.h
elessair 0:f269e3021894 16 *
elessair 0:f269e3021894 17 * \brief SHA-256 cryptographic hash function
elessair 0:f269e3021894 18 *
elessair 0:f269e3021894 19 * This file is derived from sha256.h in mbed TLS 2.3.0.
elessair 0:f269e3021894 20 *
elessair 0:f269e3021894 21 * This file provides an API very similar to mbed TLS, either implemented
elessair 0:f269e3021894 22 * locally, or by calling mbed TLS, depending on NS_USE_EXTERNAL_MBED_TLS.
elessair 0:f269e3021894 23 *
elessair 0:f269e3021894 24 * Differences from mbed TLS:
elessair 0:f269e3021894 25 *
elessair 0:f269e3021894 26 * a) ns_ prefix instead of mbedtls_;
elessair 0:f269e3021894 27 * b) Pointers are void * instead of unsigned char * to avoid type clashes;
elessair 0:f269e3021894 28 * c) SHA-224 not supported;
elessair 0:f269e3021894 29 * d) Ability to output truncated hashes.
elessair 0:f269e3021894 30 */
elessair 0:f269e3021894 31
elessair 0:f269e3021894 32
elessair 0:f269e3021894 33 #ifndef NS_SHA256_H_
elessair 0:f269e3021894 34 #define NS_SHA256_H_
elessair 0:f269e3021894 35
elessair 0:f269e3021894 36 #ifdef NS_USE_EXTERNAL_MBED_TLS
elessair 0:f269e3021894 37
elessair 0:f269e3021894 38 #include <string.h>
elessair 0:f269e3021894 39 #include "mbedtls/sha256.h"
elessair 0:f269e3021894 40
elessair 0:f269e3021894 41 typedef mbedtls_sha256_context ns_sha256_context;
elessair 0:f269e3021894 42
elessair 0:f269e3021894 43 static inline void ns_sha256_init(ns_sha256_context *ctx)
elessair 0:f269e3021894 44 {
elessair 0:f269e3021894 45 mbedtls_sha256_init(ctx);
elessair 0:f269e3021894 46 }
elessair 0:f269e3021894 47
elessair 0:f269e3021894 48 static inline void ns_sha256_free(ns_sha256_context *ctx)
elessair 0:f269e3021894 49 {
elessair 0:f269e3021894 50 mbedtls_sha256_free(ctx);
elessair 0:f269e3021894 51 }
elessair 0:f269e3021894 52
elessair 0:f269e3021894 53 static inline void ns_sha256_clone(ns_sha256_context *dst,
elessair 0:f269e3021894 54 const ns_sha256_context *src)
elessair 0:f269e3021894 55 {
elessair 0:f269e3021894 56 mbedtls_sha256_clone(dst, src);
elessair 0:f269e3021894 57 }
elessair 0:f269e3021894 58
elessair 0:f269e3021894 59 static inline void ns_sha256_starts(ns_sha256_context *ctx)
elessair 0:f269e3021894 60 {
elessair 0:f269e3021894 61 mbedtls_sha256_starts(ctx, 0);
elessair 0:f269e3021894 62 }
elessair 0:f269e3021894 63
elessair 0:f269e3021894 64 static inline void ns_sha256_update(ns_sha256_context *ctx, const void *input,
elessair 0:f269e3021894 65 size_t ilen)
elessair 0:f269e3021894 66 {
elessair 0:f269e3021894 67 mbedtls_sha256_update(ctx, input, ilen);
elessair 0:f269e3021894 68 }
elessair 0:f269e3021894 69
elessair 0:f269e3021894 70 static inline void ns_sha256_finish(ns_sha256_context *ctx, void *output)
elessair 0:f269e3021894 71 {
elessair 0:f269e3021894 72 mbedtls_sha256_finish(ctx, output);
elessair 0:f269e3021894 73 }
elessair 0:f269e3021894 74
elessair 0:f269e3021894 75 static inline void ns_sha256(const void *input, size_t ilen, void *output)
elessair 0:f269e3021894 76 {
elessair 0:f269e3021894 77 mbedtls_sha256(input, ilen, output, 0);
elessair 0:f269e3021894 78 }
elessair 0:f269e3021894 79
elessair 0:f269e3021894 80 /* Extensions to standard mbed TLS - output the first bits of a hash only */
elessair 0:f269e3021894 81 /* Number of bits must be a multiple of 32, and <=256 */
elessair 0:f269e3021894 82 static inline void ns_sha256_finish_nbits(ns_sha256_context *ctx, void *output, unsigned obits)
elessair 0:f269e3021894 83 {
elessair 0:f269e3021894 84 if (obits == 256) {
elessair 0:f269e3021894 85 mbedtls_sha256_finish(ctx, output);
elessair 0:f269e3021894 86 } else {
elessair 0:f269e3021894 87 uint8_t sha256[32];
elessair 0:f269e3021894 88 mbedtls_sha256_finish(ctx, sha256);
elessair 0:f269e3021894 89 memcpy(output, sha256, obits / 8);
elessair 0:f269e3021894 90 }
elessair 0:f269e3021894 91 }
elessair 0:f269e3021894 92
elessair 0:f269e3021894 93 static inline void ns_sha256_nbits(const void *input, size_t ilen, void *output, unsigned obits)
elessair 0:f269e3021894 94 {
elessair 0:f269e3021894 95 if (obits == 256) {
elessair 0:f269e3021894 96 mbedtls_sha256(input, ilen, output, 0);
elessair 0:f269e3021894 97 } else {
elessair 0:f269e3021894 98 uint8_t sha256[32];
elessair 0:f269e3021894 99 mbedtls_sha256(input, ilen, sha256, 0);
elessair 0:f269e3021894 100 memcpy(output, sha256, obits / 8);
elessair 0:f269e3021894 101 }
elessair 0:f269e3021894 102 }
elessair 0:f269e3021894 103
elessair 0:f269e3021894 104 #else /* NS_USE_EXTERNAL_MBED_TLS */
elessair 0:f269e3021894 105
elessair 0:f269e3021894 106 #include <stddef.h>
elessair 0:f269e3021894 107 #include <stdint.h>
elessair 0:f269e3021894 108
elessair 0:f269e3021894 109 /**
elessair 0:f269e3021894 110 * \brief SHA-256 context structure
elessair 0:f269e3021894 111 */
elessair 0:f269e3021894 112 typedef struct
elessair 0:f269e3021894 113 {
elessair 0:f269e3021894 114 uint32_t total[2]; /*!< number of bytes processed */
elessair 0:f269e3021894 115 uint32_t state[8]; /*!< intermediate digest state */
elessair 0:f269e3021894 116 unsigned char buffer[64]; /*!< data block being processed */
elessair 0:f269e3021894 117 }
elessair 0:f269e3021894 118 ns_sha256_context;
elessair 0:f269e3021894 119
elessair 0:f269e3021894 120 /**
elessair 0:f269e3021894 121 * \brief Initialize SHA-256 context
elessair 0:f269e3021894 122 *
elessair 0:f269e3021894 123 * \param ctx SHA-256 context to be initialized
elessair 0:f269e3021894 124 */
elessair 0:f269e3021894 125 void ns_sha256_init( ns_sha256_context *ctx );
elessair 0:f269e3021894 126
elessair 0:f269e3021894 127 /**
elessair 0:f269e3021894 128 * \brief Clear SHA-256 context
elessair 0:f269e3021894 129 *
elessair 0:f269e3021894 130 * \param ctx SHA-256 context to be cleared
elessair 0:f269e3021894 131 */
elessair 0:f269e3021894 132 void ns_sha256_free( ns_sha256_context *ctx );
elessair 0:f269e3021894 133
elessair 0:f269e3021894 134 /**
elessair 0:f269e3021894 135 * \brief Clone (the state of) a SHA-256 context
elessair 0:f269e3021894 136 *
elessair 0:f269e3021894 137 * \param dst The destination context
elessair 0:f269e3021894 138 * \param src The context to be cloned
elessair 0:f269e3021894 139 */
elessair 0:f269e3021894 140 void ns_sha256_clone( ns_sha256_context *dst,
elessair 0:f269e3021894 141 const ns_sha256_context *src );
elessair 0:f269e3021894 142
elessair 0:f269e3021894 143 /**
elessair 0:f269e3021894 144 * \brief SHA-256 context setup
elessair 0:f269e3021894 145 *
elessair 0:f269e3021894 146 * \param ctx context to be initialized
elessair 0:f269e3021894 147 */
elessair 0:f269e3021894 148 void ns_sha256_starts( ns_sha256_context *ctx );
elessair 0:f269e3021894 149
elessair 0:f269e3021894 150 /**
elessair 0:f269e3021894 151 * \brief SHA-256 process buffer
elessair 0:f269e3021894 152 *
elessair 0:f269e3021894 153 * \param ctx SHA-256 context
elessair 0:f269e3021894 154 * \param input buffer holding the data
elessair 0:f269e3021894 155 * \param ilen length of the input data
elessair 0:f269e3021894 156 */
elessair 0:f269e3021894 157 void ns_sha256_update( ns_sha256_context *ctx, const void *input,
elessair 0:f269e3021894 158 size_t ilen );
elessair 0:f269e3021894 159
elessair 0:f269e3021894 160 /**
elessair 0:f269e3021894 161 * \brief SHA-256 final digest
elessair 0:f269e3021894 162 *
elessair 0:f269e3021894 163 * \param ctx SHA-256 context
elessair 0:f269e3021894 164 * \param output SHA-256 checksum result
elessair 0:f269e3021894 165 */
elessair 0:f269e3021894 166 void ns_sha256_finish( ns_sha256_context *ctx, void *output );
elessair 0:f269e3021894 167
elessair 0:f269e3021894 168 /**
elessair 0:f269e3021894 169 * \brief SHA-256 final digest
elessair 0:f269e3021894 170 *
elessair 0:f269e3021894 171 * \param ctx SHA-256 context
elessair 0:f269e3021894 172 * \param output SHA-256 checksum result
elessair 0:f269e3021894 173 * \param obits Number of bits of to output - must be multiple of 32
elessair 0:f269e3021894 174 */
elessair 0:f269e3021894 175 void ns_sha256_finish_nbits( ns_sha256_context *ctx,
elessair 0:f269e3021894 176 void *output, unsigned obits );
elessair 0:f269e3021894 177
elessair 0:f269e3021894 178 /**
elessair 0:f269e3021894 179 * \brief Output = SHA-256( input buffer )
elessair 0:f269e3021894 180 *
elessair 0:f269e3021894 181 * \param input buffer holding the data
elessair 0:f269e3021894 182 * \param ilen length of the input data
elessair 0:f269e3021894 183 * \param output SHA-256 checksum result
elessair 0:f269e3021894 184 */
elessair 0:f269e3021894 185 void ns_sha256( const void *input, size_t ilen,
elessair 0:f269e3021894 186 void *output );
elessair 0:f269e3021894 187
elessair 0:f269e3021894 188 /**
elessair 0:f269e3021894 189 * \brief Output = SHA-256( input buffer )
elessair 0:f269e3021894 190 *
elessair 0:f269e3021894 191 * \param input buffer holding the data
elessair 0:f269e3021894 192 * \param ilen length of the input data
elessair 0:f269e3021894 193 * \param output SHA-256 checksum result
elessair 0:f269e3021894 194 * \param obits Number of bits of to output - must be multiple of 32
elessair 0:f269e3021894 195 */
elessair 0:f269e3021894 196 void ns_sha256_nbits( const void *input, size_t ilen,
elessair 0:f269e3021894 197 void *output, unsigned obits );
elessair 0:f269e3021894 198
elessair 0:f269e3021894 199 #endif /* NS_USE_EXTERNAL_MBED_TLS */
elessair 0:f269e3021894 200
elessair 0:f269e3021894 201
elessair 0:f269e3021894 202 #endif /* NS_SHA256_H_ */