package chksum import ( "bufio" "crypto/md5" "crypto/sha1" "crypto/sha256" "crypto/sha512" "encoding/hex" "errors" "hash" "os" "regexp" ) /* checksum file format SHA512 (filename) = hex-encoded checksum or SHA256 (filename) = hex-encoded checksum */ type Checksum struct { FileName string Alg string Bytes []byte Hash hash.Hash } var hashes = map[string]func() hash.Hash{ "SHA512": sha512.New, "SHA256": sha256.New, "SHA1": sha1.New, "MD5": md5.New, } func ParseFile(fname string) ([]Checksum, error) { fd, err := os.Open(fname) if err != nil { return nil, err } defer fd.Close() var checklist []Checksum re := regexp.MustCompile(`(\w+) \(([^\)]+)\) = (\w+)`) scanner := bufio.NewScanner(fd) for scanner.Scan() { //var cs Checksum r := re.FindStringSubmatch(scanner.Text()) if len(r) != 4 { return nil, errors.New("invalid content") } h, err := hex.DecodeString(r[3]) if err != nil { return nil, err } cs := Checksum{ FileName: r[2], Alg: r[1], Bytes: h, Hash: hashes[r[1]](), } checklist = append(checklist, cs) } return checklist, scanner.Err() } func (c Checksum) Check() bool { return false }