1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "net/quic/crypto/chacha20_poly1305_encrypter.h"
7 #include "net/quic/test_tools/quic_test_utils.h"
9 using base::StringPiece
;
13 // The test vectors come from draft-agl-tls-chacha20poly1305-04 Section 7.
15 // Each test vector consists of five strings of lowercase hexadecimal digits.
16 // The strings may be empty (zero length). A test vector with a NULL |key|
17 // marks the end of an array of test vectors.
26 const TestVector test_vectors
[] = {
27 { "4290bcb154173531f314af57f3be3b5006da371ece272afa1b5dbdd110"
29 "86d09974840bded2a5ca",
31 "87e229d4500845a079c0",
32 "e3e446f7ede9a19b62a4677dabf4e3d24b876bb28475" // "3896e1d6" truncated.
42 // EncryptWithNonce wraps the |Encrypt| method of |encrypter| to allow passing
43 // in an nonce and also to allocate the buffer needed for the ciphertext.
44 QuicData
* EncryptWithNonce(ChaCha20Poly1305Encrypter
* encrypter
,
46 StringPiece associated_data
,
47 StringPiece plaintext
) {
48 size_t ciphertext_size
= encrypter
->GetCiphertextSize(plaintext
.length());
49 scoped_ptr
<char[]> ciphertext(new char[ciphertext_size
]);
51 if (!encrypter
->Encrypt(nonce
, associated_data
, plaintext
,
52 reinterpret_cast<unsigned char*>(ciphertext
.get()))) {
56 return new QuicData(ciphertext
.release(), ciphertext_size
, true);
59 TEST(ChaCha20Poly1305EncrypterTest
, Encrypt
) {
60 if (!ChaCha20Poly1305Encrypter::IsSupported()) {
61 LOG(INFO
) << "ChaCha20+Poly1305 not supported. Test skipped.";
65 for (size_t i
= 0; test_vectors
[i
].key
!= NULL
; i
++) {
66 // Decode the test vector.
72 ASSERT_TRUE(DecodeHexString(test_vectors
[i
].key
, &key
));
73 ASSERT_TRUE(DecodeHexString(test_vectors
[i
].pt
, &pt
));
74 ASSERT_TRUE(DecodeHexString(test_vectors
[i
].iv
, &iv
));
75 ASSERT_TRUE(DecodeHexString(test_vectors
[i
].aad
, &aad
));
76 ASSERT_TRUE(DecodeHexString(test_vectors
[i
].ct
, &ct
));
78 ChaCha20Poly1305Encrypter encrypter
;
79 ASSERT_TRUE(encrypter
.SetKey(key
));
80 scoped_ptr
<QuicData
> encrypted(EncryptWithNonce(
82 // This deliberately tests that the encrypter can handle an AAD that
83 // is set to NULL, as opposed to a zero-length, non-NULL pointer.
84 StringPiece(aad
.length() ? aad
.data() : NULL
, aad
.length()), pt
));
85 ASSERT_TRUE(encrypted
.get());
87 test::CompareCharArraysWithHexError("ciphertext", encrypted
->data(),
88 encrypted
->length(), ct
.data(),
93 TEST(ChaCha20Poly1305EncrypterTest
, GetMaxPlaintextSize
) {
94 ChaCha20Poly1305Encrypter encrypter
;
95 EXPECT_EQ(1000u, encrypter
.GetMaxPlaintextSize(1012));
96 EXPECT_EQ(100u, encrypter
.GetMaxPlaintextSize(112));
97 EXPECT_EQ(10u, encrypter
.GetMaxPlaintextSize(22));
100 TEST(ChaCha20Poly1305EncrypterTest
, GetCiphertextSize
) {
101 ChaCha20Poly1305Encrypter encrypter
;
102 EXPECT_EQ(1012u, encrypter
.GetCiphertextSize(1000));
103 EXPECT_EQ(112u, encrypter
.GetCiphertextSize(100));
104 EXPECT_EQ(22u, encrypter
.GetCiphertextSize(10));