00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _SHA1_H_
00040 #define _SHA1_H_
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 #include <stdint.h>
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 #ifndef _SHA_enum_
00087 #define _SHA_enum_
00088
00089
00090
00091 enum {
00092 shaSuccess = 0,
00093 shaNull,
00094 shaInputTooLong,
00095 shaStateError,
00096 shaBadParam
00097 };
00098 #endif
00099
00100
00101
00102
00103
00104 enum {
00105 SHA1_Message_Block_Size = 64, SHA224_Message_Block_Size = 64,
00106 SHA256_Message_Block_Size = 64, SHA384_Message_Block_Size = 128,
00107 SHA512_Message_Block_Size = 128,
00108 USHA_Max_Message_Block_Size = SHA512_Message_Block_Size,
00109 SHA1HashSize = 20, SHA224HashSize = 28, SHA256HashSize = 32,
00110 SHA384HashSize = 48, SHA512HashSize = 64,
00111 USHAMaxHashSize = SHA512HashSize,
00112
00113 SHA1HashSizeBits = 160, SHA224HashSizeBits = 224,
00114 SHA256HashSizeBits = 256, SHA384HashSizeBits = 384,
00115 SHA512HashSizeBits = 512, USHAMaxHashSizeBits = SHA512HashSizeBits
00116 };
00117
00118
00119
00120
00121 typedef enum SHAversion {
00122 SHA1, SHA224, SHA256, SHA384, SHA512
00123 } SHAversion;
00124
00125
00126
00127
00128
00129 typedef struct SHA1Context {
00130 uint32_t Intermediate_Hash[SHA1HashSize/4];
00131
00132 uint32_t Length_High;
00133 uint32_t Length_Low;
00134
00135 int_least16_t Message_Block_Index;
00136
00137 uint8_t Message_Block[SHA1_Message_Block_Size];
00138
00139 int Computed;
00140 int Corrupted;
00141 } SHA1Context;
00142
00143
00144
00145
00146
00147 typedef struct SHA256Context {
00148 uint32_t Intermediate_Hash[SHA256HashSize/4];
00149
00150 uint32_t Length_High;
00151 uint32_t Length_Low;
00152
00153 int_least16_t Message_Block_Index;
00154
00155 uint8_t Message_Block[SHA256_Message_Block_Size];
00156 int Computed;
00157 int Corrupted;
00158 } SHA256Context;
00159
00160
00161
00162
00163
00164 typedef struct SHA512Context {
00165 #ifdef USE_32BIT_ONLY
00166 uint32_t Intermediate_Hash[SHA512HashSize/4];
00167 uint32_t Length[4];
00168 #else
00169 uint64_t Intermediate_Hash[SHA512HashSize/8];
00170 uint64_t Length_High, Length_Low;
00171 #endif
00172
00173 int_least16_t Message_Block_Index;
00174
00175 uint8_t Message_Block[SHA512_Message_Block_Size];
00176
00177 int Computed;
00178 int Corrupted;
00179 } SHA512Context;
00180
00181
00182
00183
00184
00185 typedef struct SHA256Context SHA224Context;
00186
00187
00188
00189
00190
00191 typedef struct SHA512Context SHA384Context;
00192
00193
00194
00195
00196
00197 typedef struct USHAContext {
00198 int whichSha;
00199 union {
00200 SHA1Context sha1Context;
00201 SHA224Context sha224Context; SHA256Context sha256Context;
00202 SHA384Context sha384Context; SHA512Context sha512Context;
00203 } ctx;
00204 } USHAContext;
00205
00206
00207
00208
00209
00210 typedef struct HMACContext {
00211 int whichSha;
00212 int hashSize;
00213 int blockSize;
00214 USHAContext shaContext;
00215 unsigned char k_opad[USHA_Max_Message_Block_Size];
00216
00217 int Computed;
00218 int Corrupted;
00219
00220 } HMACContext;
00221
00222
00223
00224
00225
00226 typedef struct HKDFContext {
00227 int whichSha;
00228 HMACContext hmacContext;
00229 int hashSize;
00230 unsigned char prk[USHAMaxHashSize];
00231
00232 int Computed;
00233 int Corrupted;
00234 } HKDFContext;
00235
00236
00237
00238
00239
00240
00241 extern int SHA1Reset(SHA1Context *);
00242 extern int SHA1Input(SHA1Context *, const uint8_t *bytes,
00243 unsigned int bytecount);
00244 extern int SHA1FinalBits(SHA1Context *, uint8_t bits,
00245 unsigned int bit_count);
00246 extern int SHA1Result(SHA1Context *,
00247 uint8_t Message_Digest[SHA1HashSize]);
00248
00249 extern int SHA224Reset(SHA224Context *);
00250 extern int SHA224Input(SHA224Context *, const uint8_t *bytes,
00251 unsigned int bytecount);
00252 extern int SHA224FinalBits(SHA224Context *, uint8_t bits,
00253 unsigned int bit_count);
00254 extern int SHA224Result(SHA224Context *,
00255 uint8_t Message_Digest[SHA224HashSize]);
00256
00257
00258 extern int SHA256Reset(SHA256Context *);
00259 extern int SHA256Input(SHA256Context *, const uint8_t *bytes,
00260 unsigned int bytecount);
00261 extern int SHA256FinalBits(SHA256Context *, uint8_t bits,
00262 unsigned int bit_count);
00263 extern int SHA256Result(SHA256Context *,
00264 uint8_t Message_Digest[SHA256HashSize]);
00265
00266
00267 extern int SHA384Reset(SHA384Context *);
00268 extern int SHA384Input(SHA384Context *, const uint8_t *bytes,
00269 unsigned int bytecount);
00270 extern int SHA384FinalBits(SHA384Context *, uint8_t bits,
00271 unsigned int bit_count);
00272 extern int SHA384Result(SHA384Context *,
00273 uint8_t Message_Digest[SHA384HashSize]);
00274
00275
00276 extern int SHA512Reset(SHA512Context *);
00277 extern int SHA512Input(SHA512Context *, const uint8_t *bytes,
00278 unsigned int bytecount);
00279 extern int SHA512FinalBits(SHA512Context *, uint8_t bits,
00280 unsigned int bit_count);
00281 extern int SHA512Result(SHA512Context *,
00282 uint8_t Message_Digest[SHA512HashSize]);
00283
00284
00285 extern int USHAReset(USHAContext *context, SHAversion whichSha);
00286 extern int USHAInput(USHAContext *context,
00287 const uint8_t *bytes, unsigned int bytecount);
00288 extern int USHAFinalBits(USHAContext *context,
00289 uint8_t bits, unsigned int bit_count);
00290 extern int USHAResult(USHAContext *context,
00291 uint8_t Message_Digest[USHAMaxHashSize]);
00292 extern int USHABlockSize(enum SHAversion whichSha);
00293 extern int USHAHashSize(enum SHAversion whichSha);
00294 extern int USHAHashSizeBits(enum SHAversion whichSha);
00295 extern const char *USHAHashName(enum SHAversion whichSha);
00296
00297
00298
00299
00300
00301
00302 extern int hmac(SHAversion whichSha,
00303 const unsigned char *text,
00304 int text_len,
00305 const unsigned char *key,
00306 int key_len,
00307 uint8_t digest[USHAMaxHashSize]);
00308
00309
00310
00311
00312
00313
00314 extern int hmacReset(HMACContext *context, enum SHAversion whichSha,
00315 const unsigned char *key, int key_len);
00316 extern int hmacInput(HMACContext *context, const unsigned char *text,
00317 int text_len);
00318 extern int hmacFinalBits(HMACContext *context, uint8_t bits,
00319 unsigned int bit_count);
00320 extern int hmacResult(HMACContext *context,
00321 uint8_t digest[USHAMaxHashSize]);
00322
00323
00324
00325
00326
00327 extern int hkdf(SHAversion whichSha, const unsigned char *salt,
00328 int salt_len, const unsigned char *ikm, int ikm_len,
00329 const unsigned char *info, int info_len,
00330 uint8_t okm[ ], int okm_len);
00331 extern int hkdfExtract(SHAversion whichSha, const unsigned char *salt,
00332 int salt_len, const unsigned char *ikm,
00333 int ikm_len, uint8_t prk[USHAMaxHashSize]);
00334 extern int hkdfExpand(SHAversion whichSha, const uint8_t prk[ ],
00335 int prk_len, const unsigned char *info,
00336 int info_len, uint8_t okm[ ], int okm_len);
00337
00338
00339
00340
00341
00342
00343 extern int hkdfReset(HKDFContext *context, enum SHAversion whichSha,
00344 const unsigned char *salt, int salt_len);
00345 extern int hkdfInput(HKDFContext *context, const unsigned char *ikm,
00346 int ikm_len);
00347 extern int hkdfFinalBits(HKDFContext *context, uint8_t ikm_bits,
00348 unsigned int ikm_bit_count);
00349 extern int hkdfResult(HKDFContext *context,
00350 uint8_t prk[USHAMaxHashSize],
00351 const unsigned char *info, int info_len,
00352 uint8_t okm[USHAMaxHashSize], int okm_len);
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 #ifndef USE_MODIFIED_MACROS
00365 #define SHA_Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
00366 #define SHA_Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
00367 #else
00368
00369
00370
00371
00372 #define SHA_Ch(x, y, z) (((x) & ((y) ^ (z))) ^ (z))
00373 #define SHA_Maj(x, y, z) (((x) & ((y) | (z))) | ((y) & (z)))
00374
00375 #endif
00376
00377 #define SHA_Parity(x, y, z) ((x) ^ (y) ^ (z))
00378
00379 #endif