Browse Source

Fix incorrect HMac Chaining, further checking needed

Shelikhoo 4 years ago
parent
commit
0024c6e028
1 changed files with 15 additions and 4 deletions
  1. 15 4
      proxy/vmess/aead/kdf.go

+ 15 - 4
proxy/vmess/aead/kdf.go

@@ -7,16 +7,27 @@ import (
 )
 )
 
 
 func KDF(key []byte, path ...string) []byte {
 func KDF(key []byte, path ...string) []byte {
-	var hmacf hash.Hash
+	hmacCreator := &hMacCreator{value: []byte(KDFSaltConstVMessAEADKDF)}
 	for _, v := range path {
 	for _, v := range path {
-		hmacf = hmac.New(func() hash.Hash {
-			return hmac.New(sha256.New, []byte(KDFSaltConstVMessAEADKDF))
-		}, []byte(v))
+		hmacCreator = &hMacCreator{value: []byte(v), parent: hmacCreator}
 	}
 	}
+	hmacf := hmacCreator.Create()
 	hmacf.Write(key)
 	hmacf.Write(key)
 	return hmacf.Sum(nil)
 	return hmacf.Sum(nil)
 }
 }
 
 
+type hMacCreator struct {
+	parent *hMacCreator
+	value  []byte
+}
+
+func (h *hMacCreator) Create() hash.Hash {
+	if h.parent == nil {
+		return hmac.New(sha256.New, h.value)
+	}
+	return hmac.New(h.parent.Create, h.value)
+}
+
 func KDF16(key []byte, path ...string) []byte {
 func KDF16(key []byte, path ...string) []byte {
 	r := KDF(key, path...)
 	r := KDF(key, path...)
 	return r[:16]
 	return r[:16]