"Fossies" - the Fresh Open Source Software Archive

Member "littleutils-1.2.5/littleutils/b2sum.c" (29 Oct 2021, 2091 Bytes) of package /linux/privat/littleutils-1.2.5.tar.lz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2    BLAKE2 reference source code package - b2sum tool
    3 
    4    Copyright 2012, Samuel Neves <sneves@dei.uc.pt>.  You may use this under the
    5    terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at
    6    your option.  The terms of these licenses can be found at:
    7 
    8    - CC0 1.0 Universal : https://creativecommons.org/publicdomain/zero/1.0
    9    - OpenSSL license   : https://www.openssl.org/source/license.html
   10    - Apache 2.0        : https://www.apache.org/licenses/LICENSE-2.0
   11 
   12    More information about the BLAKE2 hash function can be found at
   13    https://blake2.net.
   14 
   15    Modifications for portability and partial file reads by Brian Lindholm,
   16    2020-2021.
   17 */
   18 
   19 #include <config.h>
   20 
   21 #ifdef HAVE_STDIO_H
   22 # include <stdio.h>
   23 #endif
   24 #ifdef HAVE_STDLIB_H
   25 # include <stdlib.h>
   26 #endif
   27 #ifdef HAVE_STRINGS_H
   28 # include <string.h>
   29 #endif
   30 
   31 #include "blake2.h"
   32 
   33 int blake2b_stream( FILE *stream, void *resstream, size_t outbytes, off_t readbytes )
   34 {
   35   int ret = -1;
   36   size_t sum, n, target;
   37   blake2b_state S[1];
   38   static const size_t buffer_length = 32768;
   39   uint8_t *buffer = ( uint8_t * )malloc( buffer_length );
   40   off_t total = 0;
   41 
   42   if( !buffer ) return -1;
   43 
   44   blake2b_init( S, outbytes );
   45   if ( readbytes == 0 )
   46   {
   47     sum = 0;
   48     goto final_process;
   49   }
   50 
   51   while( 1 )
   52   {
   53     if ( ( readbytes < 0 ) || ( ( readbytes - total ) > (off_t) buffer_length ) )
   54       target = (size_t) buffer_length;
   55     else
   56       target = (size_t) ( readbytes - total );
   57     sum = 0;
   58 
   59     while( 1 )
   60     {
   61       if( ( (off_t) sum >= target ) || feof( stream ) )
   62         goto final_process;
   63 
   64       n = fread( buffer + sum, 1, target - sum, stream );
   65       sum += n;
   66 
   67       if( buffer_length == sum )
   68         break;
   69 
   70       if( 0 == n )
   71       {
   72         if( ferror( stream ) )
   73           goto cleanup_buffer;
   74 
   75         goto final_process;
   76       }
   77     }
   78     total += (off_t) sum;
   79 
   80     blake2b_update( S, buffer, buffer_length );
   81   }
   82 
   83 final_process:;
   84 
   85   if( sum > 0 ) blake2b_update( S, buffer, sum );
   86 
   87   blake2b_final( S, resstream, outbytes );
   88   ret = 0;
   89 cleanup_buffer:
   90   free( buffer );
   91   return ret;
   92 }