Hi Jeff, thanks for the reply. I've deleted the other messages cause I've found the solution by my own.
So, I've tested the whole thing with a test vector as you said and I found out, looking to Golang library's source code, that the output given to me was: *Nonce + Ciphertext + MAC*. You were right: the last one was actually an authentication tag. I decided to reimplement manually the *Seal *and *Open* functions removing the MAC generation and append. I think I'm gonna implement it back in a bit: I prefer to go without authenticated encryption at the moment. With a custom function I'm now able to remove the Nonce too and get the clear ciphertext that I can finally decrypt using Crypto++. Here is the source code of the changed functions. func sliceForAppend(in []byte, n int) (head, tail []byte) { if total := len(in) + n; cap(in) >= total { head = in[:total] } else { head = make([]byte, total) copy(head, in) } tail = head[len(in):] return } func sealGeneric(dst, nonce, plaintext []byte) []byte { ret, out := sliceForAppend(dst, len(plaintext)) ciphertext, _ := out[:len(plaintext)], out[len(plaintext):] var polyKey [32]byte s, _ := chacha20.NewUnauthenticatedCipher(key[:], nonce) s.XORKeyStream(polyKey[:], polyKey[:]) s.SetCounter(1) // set the counter to 1, skipping 32 bytes s.XORKeyStream(ciphertext, plaintext) return ret } func openGeneric(dst, nonce, ciphertext []byte) ([]byte, error) { var polyKey [32]byte s, _ := chacha20.NewUnauthenticatedCipher(key[:], nonce) s.XORKeyStream(polyKey[:], polyKey[:]) s.SetCounter(1) // set the counter to 1, skipping 32 bytes ret, out := sliceForAppend(dst, len(ciphertext)) s.XORKeyStream(out, ciphertext) return ret, nil } That's how I call encryption and decryption: func EncrytionWithChaChaPoly() { msg := make([]byte, 0) msg = append(msg, 0x4c,0x61,0x64,0x69,0x65,0x73,0x20,0x61,0x6e,0x64,0x20,0x47,0x65,0x6e,0x74,0x6c, 0x65,0x6d,0x65,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x63,0x6c,0x61,0x73, 0x73,0x20,0x6f,0x66,0x20,0x27,0x39,0x39,0x3a,0x20,0x49,0x66,0x20,0x49,0x20,0x63, 0x6f,0x75,0x6c,0x64,0x20,0x6f,0x66,0x66,0x65,0x72,0x20,0x79,0x6f,0x75,0x20,0x6f, 0x6e,0x6c,0x79,0x20,0x6f,0x6e,0x65,0x20,0x74,0x69,0x70,0x20,0x66,0x6f,0x72,0x20, 0x74,0x68,0x65,0x20,0x66,0x75,0x74,0x75,0x72,0x65,0x2c,0x20,0x73,0x75,0x6e,0x73, 0x63,0x72,0x65,0x65,0x6e,0x20,0x77,0x6f,0x75,0x6c,0x64,0x20,0x62,0x65,0x20,0x69, 0x74,0x2e, ) nonce := make([]byte, 0) nonce = append(nonce, 0x07,0x00,0x00,0x00,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x07,0x00,0x00,0x00,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47) fmt.Println("Nonce:") fmt.Println(nonce) // Encrypt the message and append the ciphertext to the nonce. encryptedMsg = sealGeneric(nonce, nonce, msg) fmt.Println("\nCipher:") fmt.Println(encryptedMsg) fmt.Println(len(encryptedMsg)) } func DecryptionWithChaChaPoly(){ if len(encryptedMsg) < aead.NonceSize() { panic("ciphertext too short") } // Split nonce and ciphertext. nonce, ciphertext := encryptedMsg[:aead.NonceSize()], encryptedMsg[aead.NonceSize():] // Decrypt the message and check it wasn't tampered with. plaintext, err := openGeneric(nil, nonce, ciphertext) if err != nil { panic(err) } fmt.Println("\nRecover:") fmt.Printf("%s\n", plaintext) } Tell me if I did something wrong. Thanks in advance. On Sunday, November 5, 2023 at 8:26:27 PM UTC+1 Jeffrey Walton wrote: > On Sun, Nov 5, 2023 at 4:38 AM Lucas Marchetti <lmarch...@gmail.com> > wrote: > >> Sorry, seeing now that I've linked the wrong Golang library, here it is: >> https://pkg.go.dev/golang.org/x/crypto/chacha20poly1305 >> >> On Sunday, November 5, 2023 at 10:10:44 AM UTC+1 Lucas Marchetti wrote: >> >>> I've just made a test encrypting the string "Hello World!" with both >>> client and server functions and these are the results. >>> >>> [image: Screenshot 2023-11-05 100312.png] >>> >>> Both green-highlighted bytes corresponds to the input string but, as you >>> can see, there is a different padding that I'm 100% sure is the source of >>> the problem. >>> >>> On Saturday, November 4, 2023 at 7:39:31 PM UTC+1 Lucas Marchetti wrote: >>> >>>> Good evening. >>>> >>>> I'm building a client-server application and I want to implement a >>>> XChaCha20 communication over TCP after performing key exchange. >>>> >>>> What I'm issuing is a bad decryption output like the one shown in the >>>> pic. >>>> >>>> [image: Screenshot 2023-11-04 193625.png] >>>> >>>> I'm currently using crypto++ 8.9 in the client-side and >>>> https://pkg.go.dev/golang.org/x/crypto/chacha20 in the server-side. >>>> >>>> Is that something related to sealing or authentication implemented in >>>> the Golang library? >>>> >>>> Functions that I'm using: >>>> >>>> [image: Screenshot 2023-11-04 193751.png] >>>> >>>> [image: Screenshot 2023-11-04 193832.png] >>>> >>>> Thanks in advance. >>>> >>> If you want help, then you should provide source code and post a link to > a minimal reproducer. Pictures are not helpful. > > The wiki is full of little working examples. For example, < > https://www.cryptopp.com/wiki/XChaCha20> and < > https://www.cryptopp.com/wiki/XChaCha20Poly1305>. > > You should also probably start with test vectors, and then move onto > arbitrary messages once things work with test vectors. Here are the ones > Crypto++ uses for XChaCha: < > https://github.com/weidai11/cryptopp/blob/master/TestVectors/chacha.txt>. > And here are the ones for ChaCha20/Poly1305: < > https://github.com/weidai11/cryptopp/blob/master/TestVectors/chacha20poly1305.txt#L4669 > >. > > I'm just guessing, but the 16-bytes of garbage at the end of the > [encrypted] message may be a Poly1305 authentication tag. But it is just a > guess. The go documentation should tell you what you have. > > Jeff > -- You received this message because you are subscribed to the Google Groups "Crypto++ Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to cryptopp-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/cryptopp-users/a8864354-51a6-4b4e-8763-24202c79a1e7n%40googlegroups.com.