github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/ledger/common/hash/copy_generic.go (about)

     1  // The functions below were copied and modified from golang.org/x/crypto/sha3.
     2  //
     3  // Copyright (c) 2009 The Go Authors. All rights reserved.
     4  
     5  // Redistribution and use in source and binary forms, with or without
     6  // modification, are permitted provided that the following conditions are
     7  // met:
     8  
     9  //    * Redistributions of source code must retain the above copyright
    10  // notice, this list of conditions and the following disclaimer.
    11  //    * Redistributions in binary form must reproduce the above
    12  // copyright notice, this list of conditions and the following disclaimer
    13  // in the documentation and/or other materials provided with the
    14  // distribution.
    15  //    * Neither the name of Google Inc. nor the names of its
    16  // contributors may be used to endorse or promote products derived from
    17  // this software without specific prior written permission.
    18  
    19  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    20  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    21  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    22  // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    23  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    24  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    25  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    26  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    27  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    28  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    29  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    30  
    31  //go:build (!amd64 && !386 && !ppc64le) || purego
    32  // +build !amd64,!386,!ppc64le purego
    33  
    34  package hash
    35  
    36  import (
    37  	"encoding/binary"
    38  )
    39  
    40  // copyOut copies 32 bytes to a hash array.
    41  func copyOut(d *state) Hash {
    42  	var out Hash
    43  	for i := 0; i < 4; i++ {
    44  		binary.LittleEndian.PutUint64(out[i<<3:], d.a[i])
    45  	}
    46  	return out
    47  }
    48  
    49  // copyIn512 copies two 32 bytes arrays into the state and writes the padding;
    50  // it makes no non-portable assumptions about memory layout
    51  // or alignment.
    52  func copyIn512(d *state, buf1, buf2 Hash) {
    53  	sliceBuf1, sliceBuf2 := buf1[:], buf2[:]
    54  
    55  	var i int
    56  	for ; i < 4; i++ {
    57  		d.a[i] = binary.LittleEndian.Uint64(sliceBuf1)
    58  		sliceBuf1 = sliceBuf1[8:]
    59  	}
    60  	for ; i < 8; i++ {
    61  		d.a[i] = binary.LittleEndian.Uint64(sliceBuf2)
    62  		sliceBuf2 = sliceBuf2[8:]
    63  	}
    64  	// copy the dsbyte
    65  	// dsbyte also contains the first one bit for the padding.
    66  	d.a[8] = 0x6
    67  	// copy the last padding bit
    68  	d.a[16] = paddingEnd
    69  }
    70  
    71  // copyIn256 copies a 32 bytes array into the state without padding.
    72  // it makes no non-portable assumptions about memory layout
    73  // or alignment.
    74  func copyIn256(d *state, buf Hash) {
    75  	sliceBuf := buf[:]
    76  
    77  	for i := 0; i < 4; i++ {
    78  		d.a[i] = binary.LittleEndian.Uint64(sliceBuf)
    79  		sliceBuf = sliceBuf[8:]
    80  	}
    81  }