blob: dc017658803d375c3626728b5e8bd2c77a34a0a2 [file] [log] [blame]
/** @file
*
* A brief file description
*
* @section license License
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "catch.hpp"
#include "quic/QUICPacket.h"
#include "quic/Mock.h"
TEST_CASE("QUICPacketFactory_Create_VersionNegotiationPacket", "[quic]")
{
MockQUICPacketProtectionKeyInfo pp_key_info;
QUICPacketFactory factory(pp_key_info);
const uint8_t raw_dcid[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
const uint8_t raw_scid[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
QUICConnectionId dcid(raw_dcid, 8);
QUICConnectionId scid(raw_scid, 8);
QUICPacketUPtr vn_packet = factory.create_version_negotiation_packet(scid, dcid);
REQUIRE(vn_packet != nullptr);
CHECK(vn_packet->type() == QUICPacketType::VERSION_NEGOTIATION);
CHECK(vn_packet->destination_cid() == scid);
CHECK(vn_packet->source_cid() == dcid);
CHECK(vn_packet->version() == 0x00);
QUICVersion supported_version = QUICTypeUtil::read_QUICVersion(vn_packet->payload());
CHECK(supported_version == QUIC_SUPPORTED_VERSIONS[0]);
uint8_t expected[] = {
0xa7, // Long header, Type: NONE
0x00, 0x00, 0x00, 0x00, // Version
0x08, // DCID Len
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, // Destination Connection ID
0x08, // SCID Len
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, // Source Connection ID
0xff, 0x00, 0x00, 0x17, // Supported Version
0x1a, 0x2a, 0x3a, 0x4a, // Excercise Version
};
uint8_t buf[1024] = {0};
size_t buf_len;
vn_packet->store(buf, &buf_len);
CHECK((buf[0] & 0x80) == 0x80); // Lower 7 bits of the first byte is random
CHECK(memcmp(buf + 1, expected + 1, buf_len - 1) == 0);
}
TEST_CASE("QUICPacketFactory_Create_Retry", "[quic]")
{
MockQUICPacketProtectionKeyInfo pp_key_info;
QUICPacketFactory factory(pp_key_info);
factory.set_version(0x11223344);
uint8_t raw[] = {0xaa, 0xbb, 0xcc, 0xdd};
QUICRetryToken token(raw, 4);
QUICPacketUPtr packet =
factory.create_retry_packet(QUICConnectionId(reinterpret_cast<const uint8_t *>("\x01\x02\x03\x04"), 4),
QUICConnectionId(reinterpret_cast<const uint8_t *>("\x11\x12\x13\x14"), 4),
QUICConnectionId(reinterpret_cast<const uint8_t *>("\x04\x03\x02\x01"), 4), token);
REQUIRE(packet != nullptr);
CHECK(packet->type() == QUICPacketType::RETRY);
CHECK((packet->destination_cid() == QUICConnectionId(reinterpret_cast<const uint8_t *>("\x01\x02\x03\x04"), 4)));
CHECK(memcmp(packet->payload(), raw, sizeof(raw)) == 0);
CHECK(packet->packet_number() == 0);
CHECK(packet->version() == QUIC_SUPPORTED_VERSIONS[0]);
}
TEST_CASE("QUICPacketFactory_Create_Handshake", "[quic]")
{
MockQUICPacketProtectionKeyInfo pp_key_info;
pp_key_info.set_encryption_key_available(QUICKeyPhase::HANDSHAKE);
QUICPacketFactory factory(pp_key_info);
factory.set_version(0x11223344);
uint8_t raw[] = {0xaa, 0xbb, 0xcc, 0xdd};
ats_unique_buf payload = ats_unique_malloc(sizeof(raw));
memcpy(payload.get(), raw, sizeof(raw));
QUICPacketUPtr packet =
factory.create_handshake_packet(QUICConnectionId(reinterpret_cast<const uint8_t *>("\x01\x02\x03\x04"), 4),
QUICConnectionId(reinterpret_cast<const uint8_t *>("\x11\x12\x13\x14"), 4), 0,
std::move(payload), sizeof(raw), true, false, true);
REQUIRE(packet != nullptr);
CHECK(packet->type() == QUICPacketType::HANDSHAKE);
CHECK((packet->destination_cid() == QUICConnectionId(reinterpret_cast<const uint8_t *>("\x01\x02\x03\x04"), 4)));
CHECK(memcmp(packet->payload(), raw, sizeof(raw)) != 0);
CHECK(packet->packet_number() <= 0xFFFFFBFF);
CHECK(packet->version() == 0x11223344);
}
TEST_CASE("QUICPacketFactory_Create_StatelessResetPacket", "[quic]")
{
MockQUICPacketProtectionKeyInfo pp_key_info;
QUICPacketFactory factory(pp_key_info);
QUICStatelessResetToken token({reinterpret_cast<const uint8_t *>("\x30\x39"), 2}, 67890);
QUICPacketUPtr packet =
factory.create_stateless_reset_packet(QUICConnectionId(reinterpret_cast<const uint8_t *>("\x01\x02\x03\x04"), 4), token);
REQUIRE(packet != nullptr);
CHECK(packet->type() == QUICPacketType::STATELESS_RESET);
CHECK((packet->destination_cid() == QUICConnectionId(reinterpret_cast<const uint8_t *>("\x01\x02\x03\x04"), 4)));
}