tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

sha3.c (6824B)


      1 #ifdef FREEBL_NO_DEPEND
      2 #include "stubs.h"
      3 #endif
      4 
      5 #include "prtypes.h" /* for PRUintXX */
      6 #include "secport.h" /* for PORT_XXX */
      7 #include "blapi.h"
      8 #include "blapii.h"
      9 #include "blapit.h"
     10 #include "secerr.h"
     11 #include "Hacl_Hash_SHA3.h"
     12 
     13 struct SHA3ContextStr {
     14    Hacl_Streaming_Keccak_state *st;
     15 };
     16 
     17 SHA3_224Context *
     18 SHA3_224_NewContext()
     19 {
     20    SHA3_224Context *ctx = PORT_New(SHA3_224Context);
     21    ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_224);
     22    return ctx;
     23 }
     24 
     25 SHA3_256Context *
     26 SHA3_256_NewContext()
     27 {
     28    SHA3_256Context *ctx = PORT_New(SHA3_256Context);
     29    ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_256);
     30    return ctx;
     31 }
     32 
     33 SHA3_384Context *
     34 SHA3_384_NewContext()
     35 {
     36    SHA3_384Context *ctx = PORT_New(SHA3_384Context);
     37    ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_384);
     38    return ctx;
     39 }
     40 
     41 SHA3_512Context *
     42 SHA3_512_NewContext()
     43 {
     44    SHA3_512Context *ctx = PORT_New(SHA3_512Context);
     45    ctx->st = Hacl_Streaming_Keccak_malloc(Spec_Hash_Definitions_SHA3_512);
     46    return ctx;
     47 }
     48 
     49 void
     50 SHA3_224_DestroyContext(SHA3_224Context *ctx, PRBool freeit)
     51 {
     52    Hacl_Streaming_Keccak_reset(ctx->st);
     53    if (freeit) {
     54        Hacl_Streaming_Keccak_free(ctx->st);
     55        PORT_Free(ctx);
     56    }
     57 }
     58 
     59 void
     60 SHA3_256_DestroyContext(SHA3_256Context *ctx, PRBool freeit)
     61 {
     62    Hacl_Streaming_Keccak_reset(ctx->st);
     63    if (freeit) {
     64        Hacl_Streaming_Keccak_free(ctx->st);
     65        PORT_Free(ctx);
     66    }
     67 }
     68 
     69 void
     70 SHA3_384_DestroyContext(SHA3_384Context *ctx, PRBool freeit)
     71 {
     72    Hacl_Streaming_Keccak_reset(ctx->st);
     73    if (freeit) {
     74        Hacl_Streaming_Keccak_free(ctx->st);
     75        PORT_Free(ctx);
     76    }
     77 }
     78 
     79 void
     80 SHA3_512_DestroyContext(SHA3_512Context *ctx, PRBool freeit)
     81 {
     82    Hacl_Streaming_Keccak_reset(ctx->st);
     83    if (freeit) {
     84        Hacl_Streaming_Keccak_free(ctx->st);
     85        PORT_Free(ctx);
     86    }
     87 }
     88 
     89 unsigned int
     90 SHA3_224_FlattenSize(SHA3_224Context *ctx)
     91 {
     92    return 0;
     93 }
     94 
     95 unsigned int
     96 SHA3_256_FlattenSize(SHA3_256Context *ctx)
     97 {
     98    return 0;
     99 }
    100 
    101 unsigned int
    102 SHA3_384_FlattenSize(SHA3_384Context *ctx)
    103 {
    104    return 0;
    105 }
    106 
    107 unsigned int
    108 SHA3_512_FlattenSize(SHA3_512Context *ctx)
    109 {
    110    return 0;
    111 }
    112 
    113 void
    114 SHA3_224_Begin(SHA3_224Context *ctx)
    115 {
    116    Hacl_Streaming_Keccak_reset(ctx->st);
    117 }
    118 
    119 void
    120 SHA3_256_Begin(SHA3_256Context *ctx)
    121 {
    122    Hacl_Streaming_Keccak_reset(ctx->st);
    123 }
    124 
    125 void
    126 SHA3_384_Begin(SHA3_384Context *ctx)
    127 {
    128    Hacl_Streaming_Keccak_reset(ctx->st);
    129 }
    130 
    131 void
    132 SHA3_512_Begin(SHA3_512Context *ctx)
    133 {
    134    Hacl_Streaming_Keccak_reset(ctx->st);
    135 }
    136 
    137 void
    138 SHA3_224_Update(SHA3_224Context *ctx, const unsigned char *input,
    139                unsigned int inputLen)
    140 {
    141    Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen);
    142 }
    143 
    144 void
    145 SHA3_256_Update(SHA3_256Context *ctx, const unsigned char *input,
    146                unsigned int inputLen)
    147 {
    148    Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen);
    149 }
    150 
    151 void
    152 SHA3_384_Update(SHA3_384Context *ctx, const unsigned char *input,
    153                unsigned int inputLen)
    154 {
    155    Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen);
    156 }
    157 
    158 void
    159 SHA3_512_Update(SHA3_512Context *ctx, const unsigned char *input,
    160                unsigned int inputLen)
    161 {
    162    Hacl_Streaming_Keccak_update(ctx->st, (uint8_t *)input, inputLen);
    163 }
    164 
    165 void
    166 SHA3_224_End(SHA3_224Context *ctx, unsigned char *digest,
    167             unsigned int *digestLen, unsigned int maxDigestLen)
    168 {
    169    uint8_t sha3_digest[SHA3_224_LENGTH] = { 0 };
    170    Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest);
    171 
    172    unsigned int len = PR_MIN(SHA3_224_LENGTH, maxDigestLen);
    173    memcpy(digest, sha3_digest, len);
    174    if (digestLen)
    175        *digestLen = len;
    176 }
    177 
    178 void
    179 SHA3_256_End(SHA3_256Context *ctx, unsigned char *digest,
    180             unsigned int *digestLen, unsigned int maxDigestLen)
    181 {
    182    uint8_t sha3_digest[SHA3_256_LENGTH] = { 0 };
    183    Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest);
    184 
    185    unsigned int len = PR_MIN(SHA3_256_LENGTH, maxDigestLen);
    186    memcpy(digest, sha3_digest, len);
    187    if (digestLen)
    188        *digestLen = len;
    189 }
    190 
    191 void
    192 SHA3_384_End(SHA3_384Context *ctx, unsigned char *digest,
    193             unsigned int *digestLen, unsigned int maxDigestLen)
    194 {
    195    uint8_t sha3_digest[SHA3_384_LENGTH] = { 0 };
    196    Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest);
    197 
    198    unsigned int len = PR_MIN(SHA3_384_LENGTH, maxDigestLen);
    199    memcpy(digest, sha3_digest, len);
    200    if (digestLen)
    201        *digestLen = len;
    202 }
    203 
    204 void
    205 SHA3_512_End(SHA3_512Context *ctx, unsigned char *digest,
    206             unsigned int *digestLen, unsigned int maxDigestLen)
    207 {
    208    uint8_t sha3_digest[SHA3_512_LENGTH] = { 0 };
    209    Hacl_Streaming_Keccak_finish(ctx->st, sha3_digest);
    210 
    211    unsigned int len = PR_MIN(SHA3_512_LENGTH, maxDigestLen);
    212    memcpy(digest, sha3_digest, len);
    213    if (digestLen)
    214        *digestLen = len;
    215 }
    216 
    217 SECStatus
    218 SHA3_224_HashBuf(unsigned char *dest, const unsigned char *src,
    219                 PRUint32 src_length)
    220 {
    221    SHA3_224Context *ctx = SHA3_224_NewContext();
    222    SHA3_224_Begin(ctx);
    223    SHA3_224_Update(ctx, src, src_length);
    224    SHA3_224_End(ctx, dest, NULL, SHA3_224_LENGTH);
    225    SHA3_224_DestroyContext(ctx, true);
    226    return SECSuccess;
    227 }
    228 
    229 SECStatus
    230 SHA3_256_HashBuf(unsigned char *dest, const unsigned char *src,
    231                 PRUint32 src_length)
    232 {
    233    SHA3_256Context *ctx = SHA3_256_NewContext();
    234    SHA3_256_Begin(ctx);
    235    SHA3_256_Update(ctx, src, src_length);
    236    SHA3_256_End(ctx, dest, NULL, SHA3_256_LENGTH);
    237    SHA3_256_DestroyContext(ctx, true);
    238    return SECSuccess;
    239 }
    240 
    241 SECStatus
    242 SHA3_384_HashBuf(unsigned char *dest, const unsigned char *src,
    243                 PRUint32 src_length)
    244 {
    245    SHA3_384Context *ctx = SHA3_384_NewContext();
    246    SHA3_384_Begin(ctx);
    247    SHA3_384_Update(ctx, src, src_length);
    248    SHA3_384_End(ctx, dest, NULL, SHA3_384_LENGTH);
    249    SHA3_384_DestroyContext(ctx, true);
    250    return SECSuccess;
    251 }
    252 
    253 SECStatus
    254 SHA3_512_HashBuf(unsigned char *dest, const unsigned char *src,
    255                 PRUint32 src_length)
    256 {
    257    SHA3_512Context *ctx = SHA3_512_NewContext();
    258    SHA3_512_Begin(ctx);
    259    SHA3_512_Update(ctx, src, src_length);
    260    SHA3_512_End(ctx, dest, NULL, SHA3_512_LENGTH);
    261    SHA3_512_DestroyContext(ctx, true);
    262    return SECSuccess;
    263 }
    264 
    265 SECStatus
    266 SHA3_224_Hash(unsigned char *dest, const char *src)
    267 {
    268    return SHA3_224_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
    269 }
    270 
    271 SECStatus
    272 SHA3_256_Hash(unsigned char *dest, const char *src)
    273 {
    274    return SHA3_256_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
    275 }
    276 
    277 SECStatus
    278 SHA3_384_Hash(unsigned char *dest, const char *src)
    279 {
    280    return SHA3_384_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
    281 }
    282 
    283 SECStatus
    284 SHA3_512_Hash(unsigned char *dest, const char *src)
    285 {
    286    return SHA3_512_HashBuf(dest, (const unsigned char *)src, PORT_Strlen(src));
    287 }