The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/crypto/sha2/sha512c.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright 2005 Colin Percival
    3  * Copyright (c) 2015 Allan Jude <allanjude@FreeBSD.org>
    4  * All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  * 1. Redistributions of source code must retain the above copyright
   10  *    notice, this list of conditions and the following disclaimer.
   11  * 2. Redistributions in binary form must reproduce the above copyright
   12  *    notice, this list of conditions and the following disclaimer in the
   13  *    documentation and/or other materials provided with the distribution.
   14  *
   15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   25  * SUCH DAMAGE.
   26  */
   27 
   28 #include <sys/cdefs.h>
   29 __FBSDID("$FreeBSD$");
   30 
   31 #include <sys/endian.h>
   32 #include <sys/types.h>
   33 
   34 #ifdef _KERNEL
   35 #include <sys/systm.h>
   36 #else
   37 #include <string.h>
   38 #endif
   39 
   40 #include "sha512.h"
   41 #include "sha512t.h"
   42 #include "sha384.h"
   43 #include "sha512c_impl.h"
   44 
   45 #if defined(ARM64_SHA512)
   46 #include <sys/auxv.h>
   47 #include <machine/ifunc.h>
   48 #endif
   49 
   50 #if BYTE_ORDER == BIG_ENDIAN
   51 
   52 /* Copy a vector of big-endian uint64_t into a vector of bytes */
   53 #define be64enc_vect(dst, src, len)     \
   54         memcpy((void *)dst, (const void *)src, (size_t)len)
   55 
   56 /* Copy a vector of bytes into a vector of big-endian uint64_t */
   57 #define be64dec_vect(dst, src, len)     \
   58         memcpy((void *)dst, (const void *)src, (size_t)len)
   59 
   60 #else /* BYTE_ORDER != BIG_ENDIAN */
   61 
   62 /*
   63  * Encode a length len/4 vector of (uint64_t) into a length len vector of
   64  * (unsigned char) in big-endian form.  Assumes len is a multiple of 8.
   65  */
   66 static void
   67 be64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)
   68 {
   69         size_t i;
   70 
   71         for (i = 0; i < len / 8; i++)
   72                 be64enc(dst + i * 8, src[i]);
   73 }
   74 
   75 /*
   76  * Decode a big-endian length len vector of (unsigned char) into a length
   77  * len/4 vector of (uint64_t).  Assumes len is a multiple of 8.
   78  */
   79 static void
   80 be64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)
   81 {
   82         size_t i;
   83 
   84         for (i = 0; i < len / 8; i++)
   85                 dst[i] = be64dec(src + i * 8);
   86 }
   87 
   88 #endif /* BYTE_ORDER != BIG_ENDIAN */
   89 
   90 /* SHA512 round constants. */
   91 static const uint64_t K[80] = {
   92         0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
   93         0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
   94         0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
   95         0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
   96         0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
   97         0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
   98         0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
   99         0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
  100         0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
  101         0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
  102         0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
  103         0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
  104         0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
  105         0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
  106         0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
  107         0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
  108         0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
  109         0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
  110         0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
  111         0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
  112         0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
  113         0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
  114         0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
  115         0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
  116         0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
  117         0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
  118         0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
  119         0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
  120         0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
  121         0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
  122         0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
  123         0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
  124         0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
  125         0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
  126         0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
  127         0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
  128         0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
  129         0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
  130         0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
  131         0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
  132 };
  133 
  134 /* Elementary functions used by SHA512 */
  135 #define Ch(x, y, z)     ((x & (y ^ z)) ^ z)
  136 #define Maj(x, y, z)    ((x & (y | z)) | (y & z))
  137 #define SHR(x, n)       (x >> n)
  138 #define ROTR(x, n)      ((x >> n) | (x << (64 - n)))
  139 #define S0(x)           (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))
  140 #define S1(x)           (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))
  141 #define s0(x)           (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))
  142 #define s1(x)           (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))
  143 
  144 /* SHA512 round function */
  145 #define RND(a, b, c, d, e, f, g, h, k)                  \
  146         h += S1(e) + Ch(e, f, g) + k;                   \
  147         d += h;                                         \
  148         h += S0(a) + Maj(a, b, c);
  149 
  150 /* Adjusted round function for rotating state */
  151 #define RNDr(S, W, i, ii)                       \
  152         RND(S[(80 - i) % 8], S[(81 - i) % 8],   \
  153             S[(82 - i) % 8], S[(83 - i) % 8],   \
  154             S[(84 - i) % 8], S[(85 - i) % 8],   \
  155             S[(86 - i) % 8], S[(87 - i) % 8],   \
  156             W[i + ii] + K[i + ii])
  157 
  158 /* Message schedule computation */
  159 #define MSCH(W, ii, i)                          \
  160         W[i + ii + 16] = s1(W[i + ii + 14]) + W[i + ii + 9] + s0(W[i + ii + 1]) + W[i + ii]
  161 
  162 /*
  163  * SHA512 block compression function.  The 512-bit state is transformed via
  164  * the 512-bit input block to produce a new state.
  165  */
  166 static void
  167 #if defined(ARM64_SHA512)
  168 SHA512_Transform_c(uint64_t * state, const unsigned char block[SHA512_BLOCK_LENGTH])
  169 #else
  170 SHA512_Transform(uint64_t * state, const unsigned char block[SHA512_BLOCK_LENGTH])
  171 #endif
  172 {
  173         uint64_t W[80];
  174         uint64_t S[8];
  175         int i;
  176 
  177         /* 1. Prepare the first part of the message schedule W. */
  178         be64dec_vect(W, block, SHA512_BLOCK_LENGTH);
  179 
  180         /* 2. Initialize working variables. */
  181         memcpy(S, state, SHA512_DIGEST_LENGTH);
  182 
  183         /* 3. Mix. */
  184         for (i = 0; i < 80; i += 16) {
  185                 RNDr(S, W, 0, i);
  186                 RNDr(S, W, 1, i);
  187                 RNDr(S, W, 2, i);
  188                 RNDr(S, W, 3, i);
  189                 RNDr(S, W, 4, i);
  190                 RNDr(S, W, 5, i);
  191                 RNDr(S, W, 6, i);
  192                 RNDr(S, W, 7, i);
  193                 RNDr(S, W, 8, i);
  194                 RNDr(S, W, 9, i);
  195                 RNDr(S, W, 10, i);
  196                 RNDr(S, W, 11, i);
  197                 RNDr(S, W, 12, i);
  198                 RNDr(S, W, 13, i);
  199                 RNDr(S, W, 14, i);
  200                 RNDr(S, W, 15, i);
  201 
  202                 if (i == 64)
  203                         break;
  204                 MSCH(W, 0, i);
  205                 MSCH(W, 1, i);
  206                 MSCH(W, 2, i);
  207                 MSCH(W, 3, i);
  208                 MSCH(W, 4, i);
  209                 MSCH(W, 5, i);
  210                 MSCH(W, 6, i);
  211                 MSCH(W, 7, i);
  212                 MSCH(W, 8, i);
  213                 MSCH(W, 9, i);
  214                 MSCH(W, 10, i);
  215                 MSCH(W, 11, i);
  216                 MSCH(W, 12, i);
  217                 MSCH(W, 13, i);
  218                 MSCH(W, 14, i);
  219                 MSCH(W, 15, i);
  220         }
  221 
  222         /* 4. Mix local working variables into global state */
  223         for (i = 0; i < 8; i++)
  224                 state[i] += S[i];
  225 }
  226 
  227 #if defined(ARM64_SHA512)
  228 static void
  229 SHA512_Transform_arm64(uint64_t * state,
  230     const unsigned char block[SHA512_BLOCK_LENGTH])
  231 {
  232         SHA512_Transform_arm64_impl(state, block, K);
  233 }
  234 
  235 DEFINE_UIFUNC(static, void, SHA512_Transform,
  236     (uint64_t * state, const unsigned char block[SHA512_BLOCK_LENGTH]))
  237 {
  238         u_long hwcap;
  239 
  240         if (elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)) == 0) {
  241                 if ((hwcap & HWCAP_SHA512) != 0) {
  242                         return (SHA512_Transform_arm64);
  243                 }
  244         }
  245 
  246         return (SHA512_Transform_c);
  247 }
  248 #endif
  249 
  250 static unsigned char PAD[SHA512_BLOCK_LENGTH] = {
  251         0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  252         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  253         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  254         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  255         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  256         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  257         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  258         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  259 };
  260 
  261 /* Add padding and terminating bit-count. */
  262 static void
  263 SHA512_Pad(SHA512_CTX * ctx)
  264 {
  265         size_t r;
  266 
  267         /* Figure out how many bytes we have buffered. */
  268         r = (ctx->count[1] >> 3) & 0x7f;
  269 
  270         /* Pad to 112 mod 128, transforming if we finish a block en route. */
  271         if (r < 112) {
  272                 /* Pad to 112 mod 128. */
  273                 memcpy(&ctx->buf[r], PAD, 112 - r);
  274         } else {
  275                 /* Finish the current block and mix. */
  276                 memcpy(&ctx->buf[r], PAD, 128 - r);
  277                 SHA512_Transform(ctx->state, ctx->buf);
  278 
  279                 /* The start of the final block is all zeroes. */
  280                 memset(&ctx->buf[0], 0, 112);
  281         }
  282 
  283         /* Add the terminating bit-count. */
  284         be64enc_vect(&ctx->buf[112], ctx->count, 16);
  285 
  286         /* Mix in the final block. */
  287         SHA512_Transform(ctx->state, ctx->buf);
  288 }
  289 
  290 /* SHA-512 initialization.  Begins a SHA-512 operation. */
  291 void
  292 SHA512_Init(SHA512_CTX * ctx)
  293 {
  294 
  295         /* Zero bits processed so far */
  296         ctx->count[0] = ctx->count[1] = 0;
  297 
  298         /* Magic initialization constants */
  299         ctx->state[0] = 0x6a09e667f3bcc908ULL;
  300         ctx->state[1] = 0xbb67ae8584caa73bULL;
  301         ctx->state[2] = 0x3c6ef372fe94f82bULL;
  302         ctx->state[3] = 0xa54ff53a5f1d36f1ULL;
  303         ctx->state[4] = 0x510e527fade682d1ULL;
  304         ctx->state[5] = 0x9b05688c2b3e6c1fULL;
  305         ctx->state[6] = 0x1f83d9abfb41bd6bULL;
  306         ctx->state[7] = 0x5be0cd19137e2179ULL;
  307 }
  308 
  309 /* Add bytes into the hash */
  310 void
  311 SHA512_Update(SHA512_CTX * ctx, const void *in, size_t len)
  312 {
  313         uint64_t bitlen[2];
  314         uint64_t r;
  315         const unsigned char *src = in;
  316 
  317         /* Number of bytes left in the buffer from previous updates */
  318         r = (ctx->count[1] >> 3) & 0x7f;
  319 
  320         /* Convert the length into a number of bits */
  321         bitlen[1] = ((uint64_t)len) << 3;
  322         bitlen[0] = ((uint64_t)len) >> 61;
  323 
  324         /* Update number of bits */
  325         if ((ctx->count[1] += bitlen[1]) < bitlen[1])
  326                 ctx->count[0]++;
  327         ctx->count[0] += bitlen[0];
  328 
  329         /* Handle the case where we don't need to perform any transforms */
  330         if (len < SHA512_BLOCK_LENGTH - r) {
  331                 memcpy(&ctx->buf[r], src, len);
  332                 return;
  333         }
  334 
  335         /* Finish the current block */
  336         memcpy(&ctx->buf[r], src, SHA512_BLOCK_LENGTH - r);
  337         SHA512_Transform(ctx->state, ctx->buf);
  338         src += SHA512_BLOCK_LENGTH - r;
  339         len -= SHA512_BLOCK_LENGTH - r;
  340 
  341         /* Perform complete blocks */
  342         while (len >= SHA512_BLOCK_LENGTH) {
  343                 SHA512_Transform(ctx->state, src);
  344                 src += SHA512_BLOCK_LENGTH;
  345                 len -= SHA512_BLOCK_LENGTH;
  346         }
  347 
  348         /* Copy left over data into buffer */
  349         memcpy(ctx->buf, src, len);
  350 }
  351 
  352 /*
  353  * SHA-512 finalization.  Pads the input data, exports the hash value,
  354  * and clears the context state.
  355  */
  356 void
  357 SHA512_Final(unsigned char digest[static SHA512_DIGEST_LENGTH], SHA512_CTX *ctx)
  358 {
  359 
  360         /* Add padding */
  361         SHA512_Pad(ctx);
  362 
  363         /* Write the hash */
  364         be64enc_vect(digest, ctx->state, SHA512_DIGEST_LENGTH);
  365 
  366         /* Clear the context state */
  367         explicit_bzero(ctx, sizeof(*ctx));
  368 }
  369 
  370 /*** SHA-512t: *********************************************************/
  371 /*
  372  * the SHA512t transforms are identical to SHA512 so reuse the existing function
  373  */
  374 void
  375 SHA512_224_Init(SHA512_CTX * ctx)
  376 {
  377 
  378         /* Zero bits processed so far */
  379         ctx->count[0] = ctx->count[1] = 0;
  380 
  381         /* Magic initialization constants */
  382         ctx->state[0] = 0x8c3d37c819544da2ULL;
  383         ctx->state[1] = 0x73e1996689dcd4d6ULL;
  384         ctx->state[2] = 0x1dfab7ae32ff9c82ULL;
  385         ctx->state[3] = 0x679dd514582f9fcfULL;
  386         ctx->state[4] = 0x0f6d2b697bd44da8ULL;
  387         ctx->state[5] = 0x77e36f7304c48942ULL;
  388         ctx->state[6] = 0x3f9d85a86a1d36c8ULL;
  389         ctx->state[7] = 0x1112e6ad91d692a1ULL;
  390 }
  391 
  392 void
  393 SHA512_224_Update(SHA512_CTX * ctx, const void *in, size_t len)
  394 {
  395 
  396         SHA512_Update(ctx, in, len);
  397 }
  398 
  399 void
  400 SHA512_224_Final(unsigned char digest[static SHA512_224_DIGEST_LENGTH], SHA512_CTX * ctx)
  401 {
  402 
  403         /* Add padding */
  404         SHA512_Pad(ctx);
  405 
  406         /* Write the hash */
  407         be64enc_vect(digest, ctx->state, SHA512_224_DIGEST_LENGTH);
  408 
  409         /* Clear the context state */
  410         explicit_bzero(ctx, sizeof(*ctx));
  411 }
  412 
  413 void
  414 SHA512_256_Init(SHA512_CTX * ctx)
  415 {
  416 
  417         /* Zero bits processed so far */
  418         ctx->count[0] = ctx->count[1] = 0;
  419 
  420         /* Magic initialization constants */
  421         ctx->state[0] = 0x22312194fc2bf72cULL;
  422         ctx->state[1] = 0x9f555fa3c84c64c2ULL;
  423         ctx->state[2] = 0x2393b86b6f53b151ULL;
  424         ctx->state[3] = 0x963877195940eabdULL;
  425         ctx->state[4] = 0x96283ee2a88effe3ULL;
  426         ctx->state[5] = 0xbe5e1e2553863992ULL;
  427         ctx->state[6] = 0x2b0199fc2c85b8aaULL;
  428         ctx->state[7] = 0x0eb72ddc81c52ca2ULL;
  429 }
  430 
  431 void
  432 SHA512_256_Update(SHA512_CTX * ctx, const void *in, size_t len)
  433 {
  434 
  435         SHA512_Update(ctx, in, len);
  436 }
  437 
  438 void
  439 SHA512_256_Final(unsigned char digest[static SHA512_256_DIGEST_LENGTH], SHA512_CTX * ctx)
  440 {
  441 
  442         /* Add padding */
  443         SHA512_Pad(ctx);
  444 
  445         /* Write the hash */
  446         be64enc_vect(digest, ctx->state, SHA512_256_DIGEST_LENGTH);
  447 
  448         /* Clear the context state */
  449         explicit_bzero(ctx, sizeof(*ctx));
  450 }
  451 
  452 /*** SHA-384: *********************************************************/
  453 /*
  454  * the SHA384 and SHA512 transforms are identical, so SHA384 is skipped
  455  */
  456 
  457 /* SHA-384 initialization.  Begins a SHA-384 operation. */
  458 void
  459 SHA384_Init(SHA384_CTX * ctx)
  460 {
  461 
  462         /* Zero bits processed so far */
  463         ctx->count[0] = ctx->count[1] = 0;
  464 
  465         /* Magic initialization constants */
  466         ctx->state[0] = 0xcbbb9d5dc1059ed8ULL;
  467         ctx->state[1] = 0x629a292a367cd507ULL;
  468         ctx->state[2] = 0x9159015a3070dd17ULL;
  469         ctx->state[3] = 0x152fecd8f70e5939ULL;
  470         ctx->state[4] = 0x67332667ffc00b31ULL;
  471         ctx->state[5] = 0x8eb44a8768581511ULL;
  472         ctx->state[6] = 0xdb0c2e0d64f98fa7ULL;
  473         ctx->state[7] = 0x47b5481dbefa4fa4ULL;
  474 }
  475 
  476 /* Add bytes into the SHA-384 hash */
  477 void
  478 SHA384_Update(SHA384_CTX * ctx, const void *in, size_t len)
  479 {
  480 
  481         SHA512_Update((SHA512_CTX *)ctx, in, len);
  482 }
  483 
  484 /*
  485  * SHA-384 finalization.  Pads the input data, exports the hash value,
  486  * and clears the context state.
  487  */
  488 void
  489 SHA384_Final(unsigned char digest[static SHA384_DIGEST_LENGTH], SHA384_CTX *ctx)
  490 {
  491 
  492         /* Add padding */
  493         SHA512_Pad((SHA512_CTX *)ctx);
  494 
  495         /* Write the hash */
  496         be64enc_vect(digest, ctx->state, SHA384_DIGEST_LENGTH);
  497 
  498         /* Clear the context state */
  499         explicit_bzero(ctx, sizeof(*ctx));
  500 }
  501 
  502 #ifdef WEAK_REFS
  503 /* When building libmd, provide weak references. Note: this is not
  504    activated in the context of compiling these sources for internal
  505    use in libcrypt.
  506  */
  507 #undef SHA512_Init
  508 __weak_reference(_libmd_SHA512_Init, SHA512_Init);
  509 #undef SHA512_Update
  510 __weak_reference(_libmd_SHA512_Update, SHA512_Update);
  511 #undef SHA512_Final
  512 __weak_reference(_libmd_SHA512_Final, SHA512_Final);
  513 #undef SHA512_Transform
  514 __weak_reference(_libmd_SHA512_Transform, SHA512_Transform);
  515 
  516 #undef SHA512_224_Init
  517 __weak_reference(_libmd_SHA512_224_Init, SHA512_224_Init);
  518 #undef SHA512_224_Update
  519 __weak_reference(_libmd_SHA512_224_Update, SHA512_224_Update);
  520 #undef SHA512_224_Final
  521 __weak_reference(_libmd_SHA512_224_Final, SHA512_224_Final);
  522 
  523 #undef SHA512_256_Init
  524 __weak_reference(_libmd_SHA512_256_Init, SHA512_256_Init);
  525 #undef SHA512_256_Update
  526 __weak_reference(_libmd_SHA512_256_Update, SHA512_256_Update);
  527 #undef SHA512_256_Final
  528 __weak_reference(_libmd_SHA512_256_Final, SHA512_256_Final);
  529 
  530 #undef SHA384_Init
  531 __weak_reference(_libmd_SHA384_Init, SHA384_Init);
  532 #undef SHA384_Update
  533 __weak_reference(_libmd_SHA384_Update, SHA384_Update);
  534 #undef SHA384_Final
  535 __weak_reference(_libmd_SHA384_Final, SHA384_Final);
  536 #endif

Cache object: 95cfed72680b9289eb0b59e5d7acb176


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.