func makeHash(name string) hash.Hash { switch strings.ToLower(name) { case "ripemd160": return ripemd160.New() case "md4": return md4.New() case "md5": return md5.New() case "sha1": return sha1.New() case "sha256": return sha256.New() case "sha384": return sha512.New384() case "sha3-224": return sha3.New224() case "sha3-256": return sha3.New256() case "sha3-384": return sha3.New384() case "sha3-512": return sha3.New512() case "sha512": return sha512.New() case "sha512-224": return sha512.New512_224() case "sha512-256": return sha512.New512_256() case "crc32-ieee": return crc32.NewIEEE() case "crc64-iso": return crc64.New(crc64.MakeTable(crc64.ISO)) case "crc64-ecma": return crc64.New(crc64.MakeTable(crc64.ECMA)) case "adler32": return adler32.New() case "fnv32": return fnv.New32() case "fnv32a": return fnv.New32a() case "fnv64": return fnv.New64() case "fnv64a": return fnv.New64a() case "xor8": return new(xor8) case "fletch16": return &fletch16{} } return nil }
func calculateDigest(files []string, algorithm string) { var hasher hash.Hash switch algorithm { case "md5": hasher = md5.New() case "sha1": hasher = sha1.New() case "sha224": hasher = sha256.New224() case "sha256": hasher = sha256.New() case "sha384": hasher = sha512.New384() case "sha512": hasher = sha512.New() case "sha512224": hasher = sha512.New512_224() case "sha512256": hasher = sha512.New512_256() case "ripemd160": hasher = ripemd160.New() default: fmt.Printf("Algorithm %s not implemented yet\n", algorithm) os.Exit(1) } for _, fn := range files { hasher.Reset() file, err := os.Open(fn) if err != nil { panic(err.Error()) } if _, err := io.Copy(hasher, file); err != nil { panic(err.Error()) } fmt.Printf("%x %s\n", hasher.Sum(nil), fn) file.Close() } }
func (this HashFile) Exec(input types.Value) (out types.Value, err error) { var inputMap types.Map if i, ok := input.(types.Map); ok { inputMap = i } else { err = errors.New(fmt.Sprintf("expected a map as input, got a %T", input)) return } var hashName string var hashNameElement = inputMap[types.Keyword("hash")] if hashNameElement == nil { hashName = "sha256" } else if h, ok := hashNameElement.(types.String); ok { hashName = string(h) } else if k, ok := hashNameElement.(types.Keyword); ok { hashName = string(k) } else if s, ok := hashNameElement.(types.Symbol); ok { hashName = string(s) } else { err = errors.New(":hash must be a string, keyword, or symbol if specified") return } hashName = strings.ToLower(hashName) var hash hash.Hash if hashName == "md5" { hash = md5.New() } else if hashName == "sha" || hashName == "sha1" || hashName == "sha-1" { hash = sha1.New() } else if hashName == "sha224" || hashName == "sha-224" { hash = sha256.New224() } else if hashName == "sha256" || hashName == "sha-256" { hash = sha256.New() } else if hashName == "sha384" || hashName == "sha-384" { hash = sha512.New384() } else if hashName == "sha512/224" || hashName == "sha-512/224" { hash = sha512.New512_224() } else if hashName == "sha512/256" || hashName == "sha-512/256" { hash = sha512.New512_256() } else if hashName == "sha512" || hashName == "sha-512" { hash = sha512.New() } else { err = errors.New(fmt.Sprint("unknown hash name: ", hashName)) return } var fileName string var fileElem = inputMap[types.Keyword("file")] if fileElem == nil { err = errors.New(":file argument is required") return } else if f, ok := fileElem.(types.String); ok { fileName = string(f) } else { err = errors.New(":file argument must be a string") return } file, err := os.Open(fileName) if err != nil { return } hashOut := bufio.NewWriterSize(hash, hash.BlockSize()) wrote, err := io.Copy(hashOut, file) hashOut.Flush() if err != nil { return } out = types.Map{ types.Keyword("success"): types.Bool(true), types.Keyword("size"): types.Int(wrote), types.Keyword("file"): types.String(fileName), types.Keyword("hash"): types.Keyword(hashName), types.Keyword("digest"): types.String(fmt.Sprintf("%x", hash.Sum(nil))), } return }