OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / golang.org / x / crypto / pkcs12 / mac.go
diff --git a/vendor/golang.org/x/crypto/pkcs12/mac.go b/vendor/golang.org/x/crypto/pkcs12/mac.go
new file mode 100644 (file)
index 0000000..5f38aa7
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package pkcs12
+
+import (
+       "crypto/hmac"
+       "crypto/sha1"
+       "crypto/x509/pkix"
+       "encoding/asn1"
+)
+
+type macData struct {
+       Mac        digestInfo
+       MacSalt    []byte
+       Iterations int `asn1:"optional,default:1"`
+}
+
+// from PKCS#7:
+type digestInfo struct {
+       Algorithm pkix.AlgorithmIdentifier
+       Digest    []byte
+}
+
+var (
+       oidSHA1 = asn1.ObjectIdentifier([]int{1, 3, 14, 3, 2, 26})
+)
+
+func verifyMac(macData *macData, message, password []byte) error {
+       if !macData.Mac.Algorithm.Algorithm.Equal(oidSHA1) {
+               return NotImplementedError("unknown digest algorithm: " + macData.Mac.Algorithm.Algorithm.String())
+       }
+
+       key := pbkdf(sha1Sum, 20, 64, macData.MacSalt, password, macData.Iterations, 3, 20)
+
+       mac := hmac.New(sha1.New, key)
+       mac.Write(message)
+       expectedMAC := mac.Sum(nil)
+
+       if !hmac.Equal(macData.Mac.Digest, expectedMAC) {
+               return ErrIncorrectPassword
+       }
+       return nil
+}