Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-os by
features/nanostack/FEATURE_NANOSTACK/sal-stack-nanostack/nanostack/ns_sha256.h@0:f269e3021894, 2016-10-23 (annotated)
- Committer:
- elessair
- Date:
- Sun Oct 23 15:10:02 2016 +0000
- Revision:
- 0:f269e3021894
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New 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_ */ |
