github.com/yacovm/fabric@v2.0.0-alpha.0.20191128145320-c5d4087dc723+incompatible/common/util/utils.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package util 8 9 import ( 10 "crypto/rand" 11 "fmt" 12 "io" 13 "time" 14 15 "github.com/golang/protobuf/ptypes/timestamp" 16 "github.com/hyperledger/fabric/bccsp" 17 "github.com/hyperledger/fabric/bccsp/factory" 18 ) 19 20 // ComputeSHA256 returns SHA2-256 on data 21 func ComputeSHA256(data []byte) (hash []byte) { 22 hash, err := factory.GetDefault().Hash(data, &bccsp.SHA256Opts{}) 23 if err != nil { 24 panic(fmt.Errorf("Failed computing SHA256 on [% x]", data)) 25 } 26 return 27 } 28 29 // ComputeSHA3256 returns SHA3-256 on data 30 func ComputeSHA3256(data []byte) (hash []byte) { 31 hash, err := factory.GetDefault().Hash(data, &bccsp.SHA3_256Opts{}) 32 if err != nil { 33 panic(fmt.Errorf("Failed computing SHA3_256 on [% x]", data)) 34 } 35 return 36 } 37 38 // GenerateBytesUUID returns a UUID based on RFC 4122 returning the generated bytes 39 func GenerateBytesUUID() []byte { 40 uuid := make([]byte, 16) 41 _, err := io.ReadFull(rand.Reader, uuid) 42 if err != nil { 43 panic(fmt.Sprintf("Error generating UUID: %s", err)) 44 } 45 46 // variant bits; see section 4.1.1 47 uuid[8] = uuid[8]&^0xc0 | 0x80 48 49 // version 4 (pseudo-random); see section 4.1.3 50 uuid[6] = uuid[6]&^0xf0 | 0x40 51 52 return uuid 53 } 54 55 // GenerateUUID returns a UUID based on RFC 4122 56 func GenerateUUID() string { 57 uuid := GenerateBytesUUID() 58 return idBytesToStr(uuid) 59 } 60 61 // CreateUtcTimestamp returns a google/protobuf/Timestamp in UTC 62 func CreateUtcTimestamp() *timestamp.Timestamp { 63 now := time.Now().UTC() 64 secs := now.Unix() 65 nanos := int32(now.UnixNano() - (secs * 1000000000)) 66 return &(timestamp.Timestamp{Seconds: secs, Nanos: nanos}) 67 } 68 69 func idBytesToStr(id []byte) string { 70 return fmt.Sprintf("%x-%x-%x-%x-%x", id[0:4], id[4:6], id[6:8], id[8:10], id[10:]) 71 } 72 73 // ToChaincodeArgs converts string args to []byte args 74 func ToChaincodeArgs(args ...string) [][]byte { 75 bargs := make([][]byte, len(args)) 76 for i, arg := range args { 77 bargs[i] = []byte(arg) 78 } 79 return bargs 80 } 81 82 // ConcatenateBytes is useful for combining multiple arrays of bytes, especially for 83 // signatures or digests over multiple fields 84 func ConcatenateBytes(data ...[]byte) []byte { 85 finalLength := 0 86 for _, slice := range data { 87 finalLength += len(slice) 88 } 89 result := make([]byte, finalLength) 90 last := 0 91 for _, slice := range data { 92 for i := range slice { 93 result[i+last] = slice[i] 94 } 95 last += len(slice) 96 } 97 return result 98 }