9 #include <gmock/gmock.h> 10 #include <gtest/gtest.h> 21 using namespace folly;
31 context_ = std::make_shared<FizzClientContext>();
35 auto mockFactory = std::make_unique<MockFactory>();
36 mockFactory->setDefaults();
37 factory_ = mockFactory.get();
38 context_->setFactory(
std::move(mockFactory));
39 context_->setSupportedAlpns({
"h2"});
40 verifier_ = std::make_shared<MockCertificateVerifier>();
41 pskCache_ = std::make_shared<MockPskCache>();
42 context_->setPskCache(pskCache_);
43 context_->setSendEarlyData(
true);
44 mockLeaf_ = std::make_shared<MockPeerCert>();
45 mockClientCert_ = std::make_shared<MockSelfCert>();
52 mockWrite_->setDefaults();
53 state_.readRecordLayer().reset(mockRead_);
54 state_.writeRecordLayer().reset(mockWrite_);
62 mockHandshakeWrite_->setDefaults();
63 state_.readRecordLayer().reset(mockHandshakeRead_);
64 state_.writeRecordLayer().reset(mockHandshakeWrite_);
70 mockEarlyWrite_->setDefaults();
71 state_.earlyWriteRecordLayer().reset(mockEarlyWrite_);
75 auto handshakeContext = std::make_unique<MockHandshakeContext>();
76 mockHandshakeContext_ = handshakeContext.get();
77 mockHandshakeContext_->setDefaults();
78 state_.handshakeContext() =
std::move(handshakeContext);
79 auto keyScheduler = std::make_unique<MockKeyScheduler>();
80 mockKeyScheduler_ = keyScheduler.get();
81 mockKeyScheduler_->setDefaults();
82 state_.keyScheduler() =
std::move(keyScheduler);
109 state_.context() = context_;
111 auto mockKex = std::make_unique<MockKeyExchange>();
112 mockKex_ = mockKex.get();
113 mockKex_->setDefaults();
114 std::map<NamedGroup, std::unique_ptr<KeyExchange>> kexs;
116 state_.keyExchangers() =
std::move(kexs);
119 state_.clientRandom() =
std::move(random);
121 state_.sni() =
"www.hostname.com";
124 state_.state() = StateEnum::ExpectingServerHello;
125 state_.requestedExtensions() = std::vector<ExtensionType>(
136 setupExpectingServerHello();
138 auto handshakeContext = std::make_unique<MockHandshakeContext>();
139 mockHandshakeContext_ = handshakeContext.get();
140 mockHandshakeContext_->setDefaults();
141 state_.handshakeContext() =
std::move(handshakeContext);
145 state_.requestedExtensions() = std::vector<ExtensionType>(
157 setMockContextAndScheduler();
158 state_.context() = context_;
162 state_.state() = StateEnum::ExpectingEncryptedExtensions;
163 state_.requestedExtensions() = std::vector<ExtensionType>(
174 setupExpectingEncryptedExtensions();
175 setMockEarlyRecord();
176 state_.attemptedPsk() = getCachedPsk();
184 setMockContextAndScheduler();
185 state_.context() = context_;
186 state_.state() = StateEnum::ExpectingCertificate;
191 setMockContextAndScheduler();
192 context_->setClientCertificate(mockClientCert_);
193 state_.context() = context_;
194 state_.state() = StateEnum::ExpectingCertificate;
199 setMockContextAndScheduler();
200 state_.context() = context_;
202 mockIntermediate_ = std::make_shared<MockPeerCert>();
203 std::vector<std::shared_ptr<const PeerCert>> certs;
204 certs.push_back(mockLeaf_);
205 certs.push_back(mockIntermediate_);
206 state_.unverifiedCertChain() =
std::move(certs);
207 state_.state() = StateEnum::ExpectingCertificateVerify;
208 state_.clientAuthRequested() = ClientAuthType::NotRequested;
212 setMockHandshakeEncryptedRecord();
213 setMockContextAndScheduler();
214 state_.context() = context_;
220 state_.state() = StateEnum::ExpectingFinished;
221 state_.clientAuthRequested() = ClientAuthType::NotRequested;
227 setMockContextAndScheduler();
231 state_.context() = context_;
232 state_.state() = StateEnum::Established;
234 state_.sni() =
"www.hostname.com";
235 state_.serverCert() = mockLeaf_;
258 expectError<FizzException>(
actions,
none,
"invalid event");
264 expectError<FizzException>(
actions,
none,
"invalid event");
271 expectError<FizzException>(
278 expectActions<ReportError>(
actions);
282 EXPECT_CALL(*factory_, makePlaintextReadRecordLayer())
283 .WillOnce(
Invoke([
this]() {
284 auto ret = std::make_unique<MockPlaintextReadRecordLayer>();
285 mockRead_ = ret.get();
288 EXPECT_CALL(*factory_, makePlaintextWriteRecordLayer())
289 .WillOnce(
Invoke([
this]() {
290 auto ret = std::make_unique<MockPlaintextWriteRecordLayer>();
291 mockWrite_ = ret.get();
312 auto ret = std::make_unique<MockKeyExchange>();
323 connect.
sni =
"www.hostname.com";
327 expectActions<MutateState, WriteToSocket>(
actions);
331 processStateMutations(
actions);
332 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
333 EXPECT_EQ(state_.readRecordLayer().get(), mockRead_);
334 EXPECT_EQ(state_.writeRecordLayer().get(), mockWrite_);
336 *state_.encodedClientHello(),
encodeHandshake(getDefaultClientHello())));
337 EXPECT_EQ(state_.keyExchangers()->size(), 1);
340 EXPECT_EQ(*state_.sni(),
"www.hostname.com");
346 EXPECT_EQ(state_.earlyWriteRecordLayer().get(),
nullptr);
351 auto psk = getCachedPsk();
352 EXPECT_CALL(*factory_, makePlaintextReadRecordLayer())
353 .WillOnce(
Invoke([
this]() {
354 auto ret = std::make_unique<MockPlaintextReadRecordLayer>();
355 mockRead_ = ret.get();
358 EXPECT_CALL(*factory_, makePlaintextWriteRecordLayer())
359 .WillOnce(
Invoke([
this]() {
360 auto ret = std::make_unique<MockPlaintextWriteRecordLayer>();
361 mockWrite_ = ret.get();
380 auto ret = std::make_unique<MockKeyExchange>();
393 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
395 *mockKeyScheduler_, deriveEarlySecret(RangeMatches(
"resumptionsecret")));
399 return std::vector<uint8_t>({
'b',
'k'});
403 .InSequence(contextSeq)
405 return std::unique_ptr<HandshakeContext>(mockHandshakeContext_);
407 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
408 .InSequence(contextSeq);
410 .InSequence(contextSeq)
413 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
414 .InSequence(contextSeq);
418 connect.
sni =
"www.hostname.com";
423 expectActions<MutateState, WriteToSocket>(
actions);
427 processStateMutations(
actions);
428 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
429 EXPECT_EQ(state_.readRecordLayer().get(), mockRead_);
430 EXPECT_EQ(state_.writeRecordLayer().get(), mockWrite_);
431 EXPECT_EQ(state_.keyExchangers()->size(), 1);
434 EXPECT_EQ(*state_.sni(),
"www.hostname.com");
438 EXPECT_TRUE(state_.legacySessionId().value()->empty());
440 EXPECT_EQ(state_.attemptedPsk()->psk, psk.psk);
442 EXPECT_EQ(state_.earlyWriteRecordLayer().get(),
nullptr);
447 auto psk = getCachedPsk();
448 psk.maxEarlyDataSize = 9000;
449 EXPECT_CALL(*factory_, makePlaintextReadRecordLayer())
450 .WillOnce(
Invoke([
this]() {
451 auto ret = std::make_unique<MockPlaintextReadRecordLayer>();
452 mockRead_ = ret.get();
455 EXPECT_CALL(*factory_, makePlaintextWriteRecordLayer())
456 .WillOnce(
Invoke([
this]() {
457 auto ret = std::make_unique<MockPlaintextWriteRecordLayer>();
458 mockWrite_ = ret.get();
477 auto ret = std::make_unique<MockKeyExchange>();
490 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
492 *mockKeyScheduler_, deriveEarlySecret(RangeMatches(
"resumptionsecret")));
496 return std::vector<uint8_t>({
'b',
'k'});
500 .InSequence(contextSeq)
502 return std::unique_ptr<HandshakeContext>(mockHandshakeContext_);
504 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
505 .InSequence(contextSeq);
507 .InSequence(contextSeq)
510 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
511 .InSequence(contextSeq);
512 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
519 return std::vector<uint8_t>({
'e',
'e'});
526 return std::vector<uint8_t>({
'c',
'e',
't'});
528 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cet"),
_,
_))
535 expectAeadCreation({{
"clientearlykey", &earlyAead}});
536 expectEncryptedWriteRecordLayerCreation(
537 &earlyRecordLayer, &earlyAead,
StringPiece(
"cet"));
541 connect.
sni =
"www.hostname.com";
546 expectActions<MutateState, WriteToSocket, ReportEarlyHandshakeSuccess>(
551 auto earlySuccess = expectAction<ReportEarlyHandshakeSuccess>(
actions);
552 EXPECT_EQ(earlySuccess.maxEarlyDataSize, 9000);
553 processStateMutations(
actions);
554 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
555 EXPECT_EQ(state_.readRecordLayer().get(), mockRead_);
556 EXPECT_EQ(state_.writeRecordLayer().get(), mockWrite_);
557 EXPECT_EQ(state_.keyExchangers()->size(), 1);
560 EXPECT_EQ(*state_.sni(),
"www.hostname.com");
564 EXPECT_TRUE(state_.legacySessionId().value()->empty());
566 EXPECT_EQ(state_.attemptedPsk()->psk, psk.psk);
568 EXPECT_EQ(state_.earlyWriteRecordLayer().get(), earlyRecordLayer);
572 EXPECT_EQ(state_.earlyDataParams()->serverCert, mockLeaf_);
573 EXPECT_EQ(state_.earlyDataParams()->clientCert, mockClientCert_);
574 EXPECT_EQ(state_.earlyDataParams()->alpn,
"h2");
583 expectActions<MutateState, WriteToSocket>(
actions);
584 processStateMutations(
actions);
585 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
592 auto psk = getCachedPsk();
596 expectActions<MutateState, WriteToSocket>(
actions);
597 processStateMutations(
actions);
598 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
606 auto psk = getCachedPsk();
610 expectActions<MutateState, WriteToSocket>(
actions);
611 processStateMutations(
actions);
612 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
619 connect.
sni =
"www.hostname.com";
620 auto psk = getCachedPsk();
623 expectActions<MutateState, WriteToSocket>(
actions);
624 processStateMutations(
actions);
625 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
626 EXPECT_EQ(state_.attemptedPsk()->psk, psk.psk);
632 auto psk = getCachedPsk();
635 expectActions<MutateState, WriteToSocket>(
actions);
636 processStateMutations(
actions);
637 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
638 EXPECT_EQ(state_.attemptedPsk()->psk, psk.psk);
647 expectActions<MutateState, WriteToSocket>(
actions);
648 processStateMutations(
actions);
649 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
650 auto chlo = getDefaultClientHello();
659 context_->setSupportedAlpns({});
662 connect.
sni =
"www.hostname.com";
664 expectActions<MutateState, WriteToSocket>(
actions);
665 processStateMutations(
actions);
666 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
667 auto chlo = getDefaultClientHello();
678 connect.
sni =
"www.hostname.com";
679 auto extensions = std::make_shared<MockClientExtensions>();
681 EXPECT_CALL(*extensions, getClientHelloExtensions())
686 std::vector<Extension> exts;
691 expectActions<MutateState, WriteToSocket>(
actions);
692 processStateMutations(
actions);
693 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
694 auto chlo = getDefaultClientHello();
698 chlo.extensions.push_back(
std::move(ext));
708 auto ret = std::make_unique<MockKeyExchange>();
713 mockKex1 = ret.get();
718 auto ret = std::make_unique<MockKeyExchange>();
723 mockKex2 = ret.get();
730 connect.
sni =
"www.hostname.com";
732 expectActions<MutateState, WriteToSocket>(
actions);
733 processStateMutations(
actions);
734 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
735 EXPECT_EQ(state_.keyExchangers()->size(), 2);
745 auto ret = std::make_unique<MockKeyExchange>();
754 auto psk = getCachedPsk();
761 expectActions<MutateState, WriteToSocket>(
actions);
762 processStateMutations(
actions);
763 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
764 EXPECT_EQ(state_.keyExchangers()->size(), 1);
769 context_->setDefaultShares({});
772 connect.
sni =
"www.hostname.com";
774 expectActions<MutateState, WriteToSocket>(
actions);
775 processStateMutations(
actions);
776 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
777 EXPECT_EQ(state_.keyExchangers()->size(), 0);
783 auto psk = getCachedPsk();
784 psk.maxEarlyDataSize = 1000;
787 expectActions<MutateState, WriteToSocket, ReportEarlyHandshakeSuccess>(
789 processStateMutations(
actions);
790 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
798 auto psk = getCachedPsk();
799 psk.maxEarlyDataSize = 1000;
803 expectActions<MutateState, WriteToSocket, ReportEarlyHandshakeSuccess>(
805 processStateMutations(
actions);
806 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
813 context_->setSendEarlyData(
false);
816 auto psk = getCachedPsk();
817 psk.maxEarlyDataSize = 1000;
820 expectActions<MutateState, WriteToSocket>(
actions);
821 processStateMutations(
actions);
822 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
830 auto psk = getCachedPsk();
831 psk.maxEarlyDataSize = 1000;
835 expectActions<MutateState, WriteToSocket>(
actions);
836 processStateMutations(
actions);
837 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
843 context_->setCompatibilityMode(
true);
846 connect.
sni =
"www.hostname.com";
848 expectActions<MutateState, WriteToSocket>(
actions);
849 processStateMutations(
actions);
850 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
852 EXPECT_FALSE(state_.legacySessionId().value()->empty());
856 context_->setCompatibilityMode(
true);
859 auto psk = getCachedPsk();
860 psk.maxEarlyDataSize = 1000;
863 expectActions<MutateState, WriteToSocket, ReportEarlyHandshakeSuccess>(
865 processStateMutations(
actions);
866 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
870 EXPECT_FALSE(state_.legacySessionId().value()->empty());
874 setupExpectingServerHello();
879 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
883 return std::unique_ptr<HandshakeContext>(mockHandshakeContext_);
886 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(BufMatches(
"chlo")))
887 .InSequence(contextSeq);
889 *mockHandshakeContext_, appendToTranscript(BufMatches(
"shloencoding")))
890 .InSequence(contextSeq);
891 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
892 .InSequence(contextSeq)
894 EXPECT_CALL(*mockKex_, generateSharedSecret(RangeMatches(
"servershare")))
898 *mockKeyScheduler_, deriveHandshakeSecret(RangeMatches(
"sharedsecret")));
904 return std::vector<uint8_t>({
's',
'h',
't'});
911 return std::vector<uint8_t>({
'c',
'h',
't'});
913 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sht"),
_,
_))
918 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cht"),
_,
_))
927 expectAeadCreation(&waead, &raead);
928 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sht"));
929 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cht"));
932 expectActions<MutateState>(
actions);
933 processStateMutations(
actions);
934 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
935 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
937 state_.readRecordLayer()->getEncryptionLevel(),
939 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
941 state_.writeRecordLayer()->getEncryptionLevel(),
943 EXPECT_EQ(state_.handshakeContext().get(), mockHandshakeContext_);
944 EXPECT_EQ(state_.keyScheduler().get(), mockKeyScheduler_);
958 setupExpectingServerHelloAfterHrr();
962 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
965 *mockHandshakeContext_, appendToTranscript(BufMatches(
"shloencoding")))
966 .InSequence(contextSeq);
967 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
968 .InSequence(contextSeq)
970 EXPECT_CALL(*mockKex_, generateSharedSecret(RangeMatches(
"servershare")))
974 *mockKeyScheduler_, deriveHandshakeSecret(RangeMatches(
"sharedsecret")));
980 return std::vector<uint8_t>({
's',
'h',
't'});
987 return std::vector<uint8_t>({
'c',
'h',
't'});
989 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sht"),
_,
_))
994 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cht"),
_,
_))
1003 expectAeadCreation(&waead, &raead);
1004 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sht"));
1005 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cht"));
1008 expectActions<MutateState>(
actions);
1009 processStateMutations(
actions);
1010 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1011 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
1013 state_.readRecordLayer()->getEncryptionLevel(),
1015 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
1017 state_.writeRecordLayer()->getEncryptionLevel(),
1019 EXPECT_EQ(state_.handshakeContext().get(), mockHandshakeContext_);
1020 EXPECT_EQ(state_.keyScheduler().get(), mockKeyScheduler_);
1030 EXPECT_EQ(state_.serverCert(),
nullptr);
1034 setupExpectingServerHello();
1035 state_.attemptedPsk() = getCachedPsk();
1040 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
1044 return std::unique_ptr<HandshakeContext>(mockHandshakeContext_);
1047 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(BufMatches(
"chlo")))
1048 .InSequence(contextSeq);
1050 *mockHandshakeContext_, appendToTranscript(BufMatches(
"shloencoding")))
1051 .InSequence(contextSeq);
1052 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
1053 .InSequence(contextSeq)
1055 EXPECT_CALL(*mockKex_, generateSharedSecret(RangeMatches(
"servershare")))
1059 *mockKeyScheduler_, deriveEarlySecret(RangeMatches(
"resumptionsecret")));
1061 *mockKeyScheduler_, deriveHandshakeSecret(RangeMatches(
"sharedsecret")));
1067 return std::vector<uint8_t>({
's',
'h',
't'});
1074 return std::vector<uint8_t>({
'c',
'h',
't'});
1076 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sht"),
_,
_))
1081 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cht"),
_,
_))
1090 expectAeadCreation(&waead, &raead);
1091 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sht"));
1092 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cht"));
1095 expectActions<MutateState>(
actions);
1096 processStateMutations(
actions);
1097 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1098 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
1100 state_.readRecordLayer()->getEncryptionLevel(),
1102 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
1104 state_.writeRecordLayer()->getEncryptionLevel(),
1106 EXPECT_EQ(state_.handshakeContext().get(), mockHandshakeContext_);
1107 EXPECT_EQ(state_.keyScheduler().get(), mockKeyScheduler_);
1117 EXPECT_EQ(state_.serverCert(), mockLeaf_);
1118 EXPECT_EQ(state_.clientCert(), mockClientCert_);
1122 setupExpectingServerHello();
1123 state_.attemptedPsk() = getCachedPsk();
1128 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
1132 return std::unique_ptr<HandshakeContext>(mockHandshakeContext_);
1135 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(BufMatches(
"chlo")))
1136 .InSequence(contextSeq);
1138 *mockHandshakeContext_, appendToTranscript(BufMatches(
"shloencoding")))
1139 .InSequence(contextSeq);
1140 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
1141 .InSequence(contextSeq)
1144 *mockKeyScheduler_, deriveEarlySecret(RangeMatches(
"resumptionsecret")));
1145 EXPECT_CALL(*mockKeyScheduler_, deriveHandshakeSecret());
1151 return std::vector<uint8_t>({
's',
'h',
't'});
1158 return std::vector<uint8_t>({
'c',
'h',
't'});
1160 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sht"),
_,
_))
1165 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cht"),
_,
_))
1174 expectAeadCreation(&waead, &raead);
1175 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sht"));
1176 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cht"));
1181 expectActions<MutateState>(
actions);
1182 processStateMutations(
actions);
1183 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1184 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
1186 state_.readRecordLayer()->getEncryptionLevel(),
1188 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
1190 state_.writeRecordLayer()->getEncryptionLevel(),
1192 EXPECT_EQ(state_.handshakeContext().get(), mockHandshakeContext_);
1193 EXPECT_EQ(state_.keyScheduler().get(), mockKeyScheduler_);
1203 EXPECT_EQ(state_.serverCert(), mockLeaf_);
1207 setupExpectingServerHelloAfterHrr();
1208 state_.attemptedPsk() = getCachedPsk();
1212 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
1215 *mockHandshakeContext_, appendToTranscript(BufMatches(
"shloencoding")))
1216 .InSequence(contextSeq);
1217 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
1218 .InSequence(contextSeq)
1220 EXPECT_CALL(*mockKex_, generateSharedSecret(RangeMatches(
"servershare")))
1224 *mockKeyScheduler_, deriveHandshakeSecret(RangeMatches(
"sharedsecret")));
1230 return std::vector<uint8_t>({
's',
'h',
't'});
1237 return std::vector<uint8_t>({
'c',
'h',
't'});
1239 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sht"),
_,
_))
1244 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cht"),
_,
_))
1253 expectAeadCreation(&waead, &raead);
1254 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sht"));
1255 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cht"));
1258 expectActions<MutateState>(
actions);
1259 processStateMutations(
actions);
1260 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1261 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
1263 state_.readRecordLayer()->getEncryptionLevel(),
1265 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
1267 state_.writeRecordLayer()->getEncryptionLevel(),
1269 EXPECT_EQ(state_.handshakeContext().get(), mockHandshakeContext_);
1270 EXPECT_EQ(state_.keyScheduler().get(), mockKeyScheduler_);
1280 EXPECT_EQ(state_.serverCert(), mockLeaf_);
1284 setupExpectingServerHello();
1286 expectActions<MutateState>(
actions);
1287 processStateMutations(
actions);
1288 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1292 setupExpectingServerHello();
1293 state_.attemptedPsk() = getCachedPsk();
1295 expectActions<MutateState>(
actions);
1296 processStateMutations(
actions);
1297 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1302 setupExpectingServerHello();
1303 state_.attemptedPsk() = getCachedPsk();
1305 expectActions<MutateState>(
actions);
1306 processStateMutations(
actions);
1307 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1312 setupExpectingServerHello();
1313 EXPECT_CALL(*mockRead_, hasUnparsedHandshakeData())
1314 .WillRepeatedly(
Return(
true));
1316 expectError<FizzException>(
1321 setupExpectingServerHello();
1328 expectError<FizzException>(
1331 "unsupported server version");
1335 setupExpectingServerHello();
1337 shlo.cipher_suite =
static_cast<CipherSuite>(0x03ff);
1339 expectError<FizzException>(
1345 setupExpectingServerHello();
1354 expectError<FizzException>(
1359 setupExpectingServerHello();
1363 expectError<FizzException>(
1368 setupExpectingServerHelloAfterHrr();
1371 expectError<FizzException>(
1376 setupExpectingServerHelloAfterHrr();
1379 expectError<FizzException>(
1384 setupExpectingServerHelloAfterHrr();
1385 auto mockKex = std::make_unique<MockKeyExchange>();
1386 mockKex->setDefaults();
1387 std::map<NamedGroup, std::unique_ptr<KeyExchange>> kexs;
1389 state_.keyExchangers() =
std::move(kexs);
1392 expectError<FizzException>(
1397 setupExpectingServerHello();
1398 state_.requestedExtensions() = std::vector<ExtensionType>(
1405 expectError<FizzException>(
1408 "unexpected extension in shlo: pre_shared_key");
1412 setupExpectingServerHello();
1413 state_.attemptedPsk() = getCachedPsk();
1419 expectError<FizzException>(
1424 setupExpectingServerHello();
1425 state_.attemptedPsk() = getCachedPsk();
1428 expectError<FizzException>(
1431 "incompatible cipher in psk");
1435 setupExpectingServerHello();
1436 state_.attemptedPsk() = getCachedPsk();
1439 expectActions<MutateState>(
actions);
1440 processStateMutations(
actions);
1441 EXPECT_EQ(state_.state(), StateEnum::ExpectingEncryptedExtensions);
1447 setupExpectingServerHello();
1448 state_.attemptedPsk() = getCachedPsk();
1450 expectError<FizzException>(
1455 setupExpectingEncryptedExtensions();
1456 auto ext = std::make_shared<MockClientExtensions>();
1457 state_.extensions() = ext;
1460 expectActions<MutateState>(
actions);
1461 processStateMutations(
actions);
1466 setupExpectingServerHello();
1467 state_.attemptedPsk() = getCachedPsk();
1471 expectError<FizzException>(
1476 setupExpectingServerHello();
1480 expectError<FizzException>(
1487 auto psk = getCachedPsk();
1491 expectActions<MutateState, WriteToSocket>(
actions);
1492 processStateMutations(
actions);
1493 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1495 auto& encodedHello = *state_.encodedClientHello();
1498 encodedHello->trimStart(4);
1499 auto decodedHello = decode<ClientHello>(
std::move(encodedHello));
1500 auto keyShare = getExtension<ClientKeyShare>(decodedHello.extensions);
1506 setupExpectingServerHello();
1507 state_.clientRandom()->fill(0x66);
1513 .InSequence(contextSeq)
1515 return std::unique_ptr<HandshakeContext>(mockHandshakeContext1);
1517 EXPECT_CALL(*mockHandshakeContext1, appendToTranscript(BufMatches(
"chlo")))
1518 .InSequence(contextSeq);
1519 EXPECT_CALL(*mockHandshakeContext1, getHandshakeContext())
1520 .InSequence(contextSeq)
1524 .InSequence(contextSeq)
1526 return std::unique_ptr<HandshakeContext>(mockHandshakeContext2);
1528 EXPECT_CALL(*mockHandshakeContext2, appendToTranscript(
_))
1529 .InSequence(contextSeq);
1531 *mockHandshakeContext2, appendToTranscript(BufMatches(
"hrrencoding")))
1532 .InSequence(contextSeq);
1533 EXPECT_CALL(*mockHandshakeContext2, appendToTranscript(
_))
1534 .InSequence(contextSeq);
1538 auto ret = std::make_unique<MockKeyExchange>();
1543 mockKex = ret.get();
1546 auto chlo = getDefaultClientHello();
1547 chlo.random.fill(0x66);
1553 auto it =
chlo.extensions.erase(
1569 expectActions<MutateState, WriteToSocket>(
actions);
1573 processStateMutations(
actions);
1574 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1575 EXPECT_EQ(state_.readRecordLayer().get(), mockRead_);
1577 state_.readRecordLayer()->getEncryptionLevel(),
1579 EXPECT_EQ(state_.writeRecordLayer().get(), mockWrite_);
1581 state_.writeRecordLayer()->getEncryptionLevel(),
1584 IOBufEqualTo()(*state_.encodedClientHello(), encodedExpectedChlo));
1586 StringPiece((*state_.encodedClientHello())->coalesce()),
1588 EXPECT_EQ(state_.keyExchangers()->size(), 1);
1591 EXPECT_EQ(*state_.sni(),
"www.hostname.com");
1604 auto psk = getCachedPsk();
1605 setupExpectingServerHello();
1606 state_.attemptedPsk() = psk;
1607 state_.clientRandom()->fill(0x66);
1613 [=]() {
return std::unique_ptr<KeyScheduler>(mockKeyScheduler_); }));
1615 *mockKeyScheduler_, deriveEarlySecret(RangeMatches(
"resumptionsecret")));
1619 return std::vector<uint8_t>({
'b',
'k'});
1624 .InSequence(contextSeq)
1626 return std::unique_ptr<HandshakeContext>(mockHandshakeContext1);
1628 EXPECT_CALL(*mockHandshakeContext1, appendToTranscript(BufMatches(
"chlo")))
1629 .InSequence(contextSeq);
1630 EXPECT_CALL(*mockHandshakeContext1, getHandshakeContext())
1631 .InSequence(contextSeq)
1635 .InSequence(contextSeq)
1637 return std::unique_ptr<HandshakeContext>(mockHandshakeContext2);
1639 EXPECT_CALL(*mockHandshakeContext2, appendToTranscript(
_))
1640 .InSequence(contextSeq);
1642 *mockHandshakeContext2, appendToTranscript(BufMatches(
"hrrencoding")))
1643 .InSequence(contextSeq);
1644 EXPECT_CALL(*mockHandshakeContext2, appendToTranscript(
_))
1645 .InSequence(contextSeq);
1647 .InSequence(contextSeq)
1650 EXPECT_CALL(*mockHandshakeContext2, appendToTranscript(
_))
1651 .InSequence(contextSeq);
1655 auto ret = std::make_unique<MockKeyExchange>();
1660 mockKex = ret.get();
1674 expectActions<MutateState, WriteToSocket>(
actions);
1678 processStateMutations(
actions);
1679 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1680 EXPECT_EQ(state_.readRecordLayer().get(), mockRead_);
1682 state_.readRecordLayer()->getEncryptionLevel(),
1684 EXPECT_EQ(state_.writeRecordLayer().get(), mockWrite_);
1686 state_.writeRecordLayer()->getEncryptionLevel(),
1688 EXPECT_EQ(state_.keyExchangers()->size(), 1);
1691 EXPECT_EQ(*state_.sni(),
"www.hostname.com");
1700 EXPECT_EQ(state_.attemptedPsk()->psk, psk.psk);
1705 setupExpectingServerHello();
1708 expectActions<MutateState, WriteToSocket>(
actions);
1709 processStateMutations(
actions);
1710 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1714 setupExpectingServerHello();
1715 state_.attemptedPsk() = getCachedPsk();
1719 expectActions<MutateState, WriteToSocket>(
actions);
1720 processStateMutations(
actions);
1721 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1726 setupExpectingServerHello();
1730 expectError<FizzException>(
1735 setupExpectingServerHello();
1742 expectError<FizzException>(
1745 "unsupported server version");
1749 setupExpectingServerHello();
1751 hrr.cipher_suite =
static_cast<CipherSuite>(0x03ff);
1753 expectError<FizzException>(
1758 setupExpectingServerHello();
1765 expectError<FizzException>(
1770 setupExpectingServerHello();
1776 auto encryptionLevel = state_.writeRecordLayer()->getEncryptionLevel();
1778 expectError<FizzException>(
1781 EXPECT_EQ(write.contents[0].encryptionLevel, encryptionLevel);
1786 setupExpectingServerHello();
1788 auto mockKex = std::make_unique<MockKeyExchange>();
1789 mockKex->setDefaults();
1794 expectActions<MutateState, WriteToSocket>(
actions);
1795 processStateMutations(
actions);
1796 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1798 EXPECT_EQ(state_.keyExchangers()->size(), 2);
1803 setupExpectingServerHello();
1809 expectActions<MutateState, WriteToSocket>(
actions);
1810 processStateMutations(
actions);
1811 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1812 auto range = (*state_.encodedClientHello())->coalesce();
1817 setupExpectingServerHello();
1821 expectActions<MutateState, WriteToSocket>(
actions);
1822 processStateMutations(
actions);
1823 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1825 EXPECT_EQ(state_.earlyWriteRecordLayer(),
nullptr);
1829 context_->setCompatibilityMode(
true);
1830 setupExpectingServerHello();
1833 expectActions<MutateState, WriteToSocket>(
actions);
1834 processStateMutations(
actions);
1841 EXPECT_EQ(state_.state(), StateEnum::ExpectingServerHello);
1846 context_->setSupportedAlpns({
"h2"});
1847 setupExpectingEncryptedExtensions();
1849 *mockHandshakeContext_, appendToTranscript(BufMatches(
"eeencoding")));
1852 expectActions<MutateState>(
actions);
1853 processStateMutations(
actions);
1855 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificate);
1859 context_->setSupportedAlpns({
"h2"});
1860 setupExpectingEncryptedExtensions();
1861 state_.serverCert() = mockLeaf_;
1863 *mockHandshakeContext_, appendToTranscript(BufMatches(
"eeencoding")));
1866 expectActions<MutateState>(
actions);
1867 processStateMutations(
actions);
1869 EXPECT_EQ(state_.state(), StateEnum::ExpectingFinished);
1870 EXPECT_EQ(state_.serverCert(), mockLeaf_);
1874 context_->setSupportedAlpns({
"h2"});
1875 setupExpectingEncryptedExtensions();
1877 expectActions<MutateState>(
actions);
1878 processStateMutations(
actions);
1880 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificate);
1884 context_->setSupportedAlpns({
"h2"});
1885 setupExpectingEncryptedExtensions();
1891 expectError<FizzException>(
1896 context_->setSupportedAlpns({
"h3",
"h1"});
1897 setupExpectingEncryptedExtensions();
1899 expectError<FizzException>(
1904 context_->setSupportedAlpns({
"h2"});
1905 setupExpectingEncryptedExtensions();
1910 expectActions<MutateState>(
actions);
1911 processStateMutations(
actions);
1913 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificate);
1917 setupExpectingEncryptedExtensions();
1921 expectError<FizzException>(
1924 "unexpected extension in ee: pre_shared_key");
1928 setupExpectingEncryptedExtensions();
1929 state_.requestedExtensions() = std::vector<ExtensionType>(
1936 expectError<FizzException>(
1939 "unexpected extension in ee: server_name");
1943 setupExpectingEncryptedExtensionsEarlySent();
1947 expectActions<MutateState>(
actions);
1948 processStateMutations(
actions);
1949 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificate);
1954 setupExpectingEncryptedExtensionsEarlySent();
1957 expectActions<MutateState>(
actions);
1958 processStateMutations(
actions);
1959 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificate);
1964 setupExpectingEncryptedExtensionsEarlySent();
1968 expectActions<MutateState>(
actions);
1969 processStateMutations(
actions);
1970 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificate);
1975 setupExpectingEncryptedExtensionsEarlySent();
1980 expectError<FizzException>(
1983 "unexpected accepted early data");
1987 setupExpectingEncryptedExtensionsEarlySent();
1992 expectError<FizzException>(
1997 setupExpectingEncryptedExtensionsEarlySent();
1998 state_.earlyDataParams()->alpn =
"h3";
1999 state_.attemptedPsk()->alpn =
"h3";
2003 expectError<FizzException>(
2008 setupExpectingCertificate();
2010 *mockHandshakeContext_, appendToTranscript(BufMatches(
"certencoding")));
2011 mockLeaf_ = std::make_shared<MockPeerCert>();
2012 mockIntermediate_ = std::make_shared<MockPeerCert>();
2013 EXPECT_CALL(*factory_, _makePeerCert(BufMatches(
"cert1")))
2014 .WillOnce(
Return(mockLeaf_));
2015 EXPECT_CALL(*factory_, _makePeerCert(BufMatches(
"cert2")))
2016 .WillOnce(
Return(mockIntermediate_));
2027 expectActions<MutateState>(
actions);
2028 processStateMutations(
actions);
2029 EXPECT_EQ(state_.unverifiedCertChain()->size(), 2);
2030 EXPECT_EQ(state_.unverifiedCertChain()->at(0), mockLeaf_);
2031 EXPECT_EQ(state_.unverifiedCertChain()->at(1), mockIntermediate_);
2032 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificateVerify);
2036 setupExpectingCertificate();
2042 expectActions<MutateState>(
actions);
2043 processStateMutations(
actions);
2044 EXPECT_EQ(state_.unverifiedCertChain()->size(), 1);
2045 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificateVerify);
2049 setupExpectingCertificate();
2056 expectError<FizzException>(
2061 setupExpectingCertificate();
2064 expectError<FizzException>(
2069 setupExpectingCertificate();
2071 *mockHandshakeContext_,
2072 appendToTranscript(BufMatches(
"compcertencoding")));
2073 mockLeaf_ = std::make_shared<MockPeerCert>();
2074 mockIntermediate_ = std::make_shared<MockPeerCert>();
2075 EXPECT_CALL(*factory_, _makePeerCert(BufMatches(
"cert1")))
2076 .WillOnce(
Return(mockLeaf_));
2077 EXPECT_CALL(*factory_, _makePeerCert(BufMatches(
"cert2")))
2078 .WillOnce(
Return(mockIntermediate_));
2080 auto decompressor = std::make_shared<MockCertificateDecompressor>();
2081 decompressor->setDefaults();
2082 auto decompressionMgr = std::make_shared<CertDecompressionManager>();
2083 decompressionMgr->setDecompressors(
2085 context_->setCertDecompressionManager(
std::move(decompressionMgr));
2106 expectActions<MutateState>(
actions);
2107 processStateMutations(
actions);
2108 EXPECT_EQ(state_.unverifiedCertChain()->size(), 2);
2109 EXPECT_EQ(state_.unverifiedCertChain()->at(0), mockLeaf_);
2110 EXPECT_EQ(state_.unverifiedCertChain()->at(1), mockIntermediate_);
2112 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificateVerify);
2116 setupExpectingCertificate();
2117 auto decompressor = std::make_shared<MockCertificateDecompressor>();
2118 decompressor->setDefaults();
2119 auto decompressionMgr = std::make_shared<CertDecompressionManager>();
2120 decompressionMgr->setDecompressors(
2122 context_->setCertDecompressionManager(
std::move(decompressionMgr));
2134 expectActions<MutateState>(
actions);
2135 processStateMutations(
actions);
2136 EXPECT_EQ(state_.unverifiedCertChain()->size(), 1);
2138 EXPECT_EQ(state_.state(), StateEnum::ExpectingCertificateVerify);
2142 setupExpectingCertificate();
2143 auto decompressor = std::make_shared<MockCertificateDecompressor>();
2144 decompressor->setDefaults();
2145 auto decompressionMgr = std::make_shared<CertDecompressionManager>();
2146 decompressionMgr->setDecompressors(
2148 context_->setCertDecompressionManager(
std::move(decompressionMgr));
2153 expectError<FizzException>(
2158 setupExpectingCertificate();
2159 auto decompressor = std::make_shared<MockCertificateDecompressor>();
2160 decompressor->setDefaults();
2163 throw std::runtime_error(
"foo");
2165 auto decompressionMgr = std::make_shared<CertDecompressionManager>();
2166 decompressionMgr->setDecompressors(
2168 context_->setCertDecompressionManager(
std::move(decompressionMgr));
2171 expectError<FizzException>(
2176 setupExpectingCertificate();
2177 auto decompressor = std::make_shared<MockCertificateDecompressor>();
2178 decompressor->setDefaults();
2179 auto decompressionMgr = std::make_shared<CertDecompressionManager>();
2180 decompressionMgr->setDecompressors(
2182 context_->setCertDecompressionManager(
std::move(decompressionMgr));
2196 expectError<FizzException>(
2201 setupExpectingCertificate();
2202 auto decompressor = std::make_shared<MockCertificateDecompressor>();
2203 decompressor->setDefaults();
2208 auto decompressionMgr = std::make_shared<CertDecompressionManager>();
2209 decompressionMgr->setDecompressors(
2211 context_->setCertDecompressionManager(
std::move(decompressionMgr));
2214 expectError<FizzException>(
2219 setupExpectingCertificate();
2222 expectError<FizzException>(
2227 setupExpectingCertificateVerify();
2229 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2230 .InSequence(contextSeq)
2234 *mockHandshakeContext_,
2235 appendToTranscript(BufMatches(
"certverifyencoding")))
2236 .InSequence(contextSeq);
2242 RangeMatches(
"certcontext"),
2243 RangeMatches(
"signature")));
2246 [
this](
const std::vector<std::shared_ptr<const PeerCert>>& certs) {
2254 expectActions<MutateState>(
actions);
2255 processStateMutations(
actions);
2257 EXPECT_EQ(state_.serverCert(), mockLeaf_);
2259 EXPECT_EQ(state_.state(), StateEnum::ExpectingFinished);
2263 setupExpectingCertificateVerify();
2266 expectActions<MutateState>(
actions);
2267 processStateMutations(
actions);
2268 EXPECT_EQ(state_.state(), StateEnum::ExpectingFinished);
2272 setupExpectingCertificateVerify();
2273 state_.verifier() =
nullptr;
2276 expectActions<MutateState>(
actions);
2277 processStateMutations(
actions);
2278 EXPECT_EQ(state_.state(), StateEnum::ExpectingFinished);
2283 setupExpectingCertificateVerify();
2286 expectError<FizzException>(
2291 setupExpectingCertificateVerify();
2297 RangeMatches(
"context"),
2298 RangeMatches(
"signature")))
2303 expectError<FizzException>(
2308 setupExpectingCertificateVerify();
2314 expectError<FizzVerificationException>(
2319 setupExpectingCertificateVerify();
2321 .WillOnce(Throw(std::runtime_error(
"no good")));
2324 expectError<FizzException>(
2329 setupExpectingCertificate();
2332 expectActions<MutateState>(
actions);
2333 processStateMutations(
actions);
2334 EXPECT_EQ(state_.clientAuthRequested(), ClientAuthType::RequestedNoMatch);
2335 EXPECT_EQ(state_.selectedClientCert(),
nullptr);
2340 setupExpectingCertificate();
2343 expectActions<MutateState>(
actions);
2344 processStateMutations(
actions);
2347 expectError<FizzException>(
2350 "duplicate certificate request message");
2354 setupExpectingCertificateRequest();
2360 certificateRequest.extensions.clear();
2361 certificateRequest.extensions.emplace_back(
2369 expectActions<MutateState>(
actions);
2370 processStateMutations(
actions);
2371 EXPECT_EQ(state_.clientAuthRequested(), ClientAuthType::RequestedNoMatch);
2372 EXPECT_EQ(state_.selectedClientCert(),
nullptr);
2377 setupExpectingCertificateRequest();
2384 certificateRequest.extensions.clear();
2385 certificateRequest.extensions.emplace_back(
2390 std::vector<SignatureScheme>(1, SignatureScheme::rsa_pss_sha256)));
2393 expectActions<MutateState>(
actions);
2394 processStateMutations(
actions);
2395 EXPECT_EQ(state_.clientAuthRequested(), ClientAuthType::RequestedNoMatch);
2396 EXPECT_EQ(state_.selectedClientCert(),
nullptr);
2401 setupExpectingCertificateRequest();
2411 certificateRequest.extensions.clear();
2412 certificateRequest.extensions.emplace_back(
2419 SignatureScheme::rsa_pss_sha512})));
2422 expectActions<MutateState>(
actions);
2423 processStateMutations(
actions);
2424 EXPECT_EQ(state_.clientAuthRequested(), ClientAuthType::Sent);
2425 EXPECT_EQ(state_.selectedClientCert(), mockClientCert_);
2430 setupExpectingCertificateRequest();
2438 expectActions<MutateState>(
actions);
2439 processStateMutations(
actions);
2440 EXPECT_EQ(state_.clientAuthRequested(), ClientAuthType::Sent);
2441 EXPECT_EQ(state_.selectedClientCert(), mockClientCert_);
2446 setupExpectingFinished();
2447 doFinishedFlow(ClientAuthType::NotRequested);
2451 setupExpectingFinished();
2452 state_.clientAuthRequested() = ClientAuthType::RequestedNoMatch;
2453 doFinishedFlow(ClientAuthType::RequestedNoMatch);
2454 EXPECT_EQ(state_.clientCert(),
nullptr);
2458 setupExpectingFinished();
2459 state_.clientAuthRequested() = ClientAuthType::Sent;
2461 state_.selectedClientCert() = mockClientCert_;
2462 doFinishedFlow(ClientAuthType::Sent);
2463 EXPECT_EQ(state_.clientCert(), mockClientCert_);
2467 setupExpectingFinished();
2469 setMockEarlyRecord();
2473 .InSequence(contextSeq)
2477 *mockHandshakeContext_,
2478 appendToTranscript(BufMatches(
"finishedencoding")))
2479 .InSequence(contextSeq);
2480 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2481 .InSequence(contextSeq)
2484 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
2485 .InSequence(contextSeq);
2486 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2487 .InSequence(contextSeq)
2490 .InSequence(contextSeq)
2493 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
2494 .InSequence(contextSeq);
2495 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2496 .InSequence(contextSeq)
2520 EXPECT_CALL(*mockKeyScheduler_, deriveMasterSecret());
2528 return std::vector<uint8_t>({
'r',
'e',
's'});
2531 *mockKeyScheduler_, deriveAppTrafficSecrets(RangeMatches(
"sfincontext")));
2535 return std::vector<uint8_t>({
's',
'a',
't'});
2540 return std::vector<uint8_t>({
'c',
'a',
't'});
2542 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sat"),
_,
_))
2547 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cat"),
_,
_))
2556 expectAeadCreation(&waead, &raead);
2557 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sat"));
2558 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cat"));
2559 EXPECT_CALL(*mockKeyScheduler_, clearMasterSecret());
2562 expectActions<MutateState, ReportHandshakeSuccess, WriteToSocket>(
actions);
2574 auto reportSuccess = expectAction<ReportHandshakeSuccess>(
actions);
2575 EXPECT_EQ(reportSuccess.earlyDataAccepted,
true);
2576 processStateMutations(
actions);
2577 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
2579 state_.readRecordLayer()->getEncryptionLevel(),
2581 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
2583 state_.writeRecordLayer()->getEncryptionLevel(),
2585 EXPECT_EQ(state_.earlyWriteRecordLayer().get(),
nullptr);
2586 EXPECT_EQ(state_.state(), StateEnum::Established);
2594 .InSequence(contextSeq)
2598 *mockHandshakeContext_,
2599 appendToTranscript(BufMatches(
"finishedencoding")))
2600 .InSequence(contextSeq);
2601 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2602 .InSequence(contextSeq)
2605 if (authType != ClientAuthType::NotRequested) {
2606 if (authType == ClientAuthType::Sent) {
2608 .InSequence(contextSeq)
2612 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
2613 .InSequence(contextSeq)
2614 .WillOnce(
Invoke([authType](
const Buf& enc) {
2615 if (authType == ClientAuthType::Sent) {
2622 if (authType == ClientAuthType::Sent) {
2623 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2624 .InSequence(contextSeq)
2632 RangeMatches(
"csentcontext")))
2633 .InSequence(contextSeq)
2636 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
2637 .InSequence(contextSeq)
2645 .InSequence(contextSeq)
2648 EXPECT_CALL(*mockHandshakeContext_, appendToTranscript(
_))
2649 .InSequence(contextSeq);
2650 EXPECT_CALL(*mockHandshakeContext_, getHandshakeContext())
2651 .InSequence(contextSeq)
2661 case ClientAuthType::NotRequested:
2662 case ClientAuthType::Stored:
2666 case ClientAuthType::RequestedNoMatch: {
2668 expectedMessages->prependChain(
2673 case ClientAuthType::Sent: {
2674 auto expectedMessages =
2676 expectedMessages->prependChain(
2678 expectedMessages->prependChain(
2687 EXPECT_CALL(*mockKeyScheduler_, deriveMasterSecret());
2695 return std::vector<uint8_t>({
'r',
'e',
's'});
2698 *mockKeyScheduler_, deriveAppTrafficSecrets(RangeMatches(
"sfincontext")));
2702 return std::vector<uint8_t>({
's',
'a',
't'});
2707 return std::vector<uint8_t>({
'c',
'a',
't'});
2709 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sat"),
_,
_))
2714 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cat"),
_,
_))
2723 expectAeadCreation(&waead, &raead);
2724 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sat"));
2725 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cat"));
2726 EXPECT_CALL(*mockKeyScheduler_, clearMasterSecret());
2729 expectActions<MutateState, ReportHandshakeSuccess, WriteToSocket>(
actions);
2735 auto reportSuccess = expectAction<ReportHandshakeSuccess>(
actions);
2736 EXPECT_EQ(reportSuccess.earlyDataAccepted,
false);
2737 processStateMutations(
actions);
2738 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
2740 state_.readRecordLayer()->getEncryptionLevel(),
2742 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
2744 state_.writeRecordLayer()->getEncryptionLevel(),
2746 EXPECT_EQ(state_.state(), StateEnum::Established);
2753 setupExpectingFinished();
2755 expectActions<MutateState, ReportHandshakeSuccess, WriteToSocket>(
actions);
2756 processStateMutations(
actions);
2757 EXPECT_EQ(state_.state(), StateEnum::Established);
2761 setupExpectingFinished();
2762 EXPECT_CALL(*mockHandshakeRead_, hasUnparsedHandshakeData())
2763 .WillRepeatedly(
Return(
true));
2765 expectError<FizzException>(
2770 setupExpectingFinished();
2774 expectError<FizzException>(
2779 setupExpectingFinished();
2782 expectActions<MutateState, ReportHandshakeSuccess, WriteToSocket>(
actions);
2783 auto reportSuccess = expectAction<ReportHandshakeSuccess>(
actions);
2784 EXPECT_EQ(reportSuccess.earlyDataAccepted,
false);
2785 processStateMutations(
actions);
2786 EXPECT_EQ(state_.state(), StateEnum::Established);
2790 context_->setCompatibilityMode(
true);
2791 setupExpectingFinished();
2793 expectActions<MutateState, ReportHandshakeSuccess, WriteToSocket>(
actions);
2800 processStateMutations(
actions);
2801 EXPECT_EQ(state_.state(), StateEnum::Established);
2806 setupAcceptingData();
2810 getResumptionSecret(RangeMatches(
"resumptionsecret"), RangeMatches(
"")))
2813 state_.clientCert() = mockClientCert_;
2817 auto psk = newCachedPsk.psk;
2825 EXPECT_EQ(psk.clientCert, mockClientCert_);
2827 EXPECT_EQ(psk.ticketAgeAdd, 0x44444444);
2831 setupAcceptingData();
2835 getResumptionSecret(
2836 RangeMatches(
"resumptionsecret"), RangeMatches(
"nonce")))
2847 setupAcceptingData();
2851 getResumptionSecret(RangeMatches(
"resumptionsecret"), RangeMatches(
"")))
2861 auto psk = newCachedPsk.psk;
2870 EXPECT_EQ(psk.ticketAgeAdd, 0x44444444);
2874 setupAcceptingData();
2882 setupAcceptingData();
2898 write.contents[0].encryptionLevel,
2899 state_.writeRecordLayer()->getEncryptionLevel());
2904 setupAcceptingData();
2906 expectActions<MutateState>(
actions);
2911 setupAcceptingData();
2912 EXPECT_CALL(*mockRead_, hasUnparsedHandshakeData())
2913 .WillRepeatedly(
Return(
true));
2915 expectError<FizzException>(
2920 setupAcceptingData();
2921 EXPECT_CALL(*mockKeyScheduler_, serverKeyUpdate());
2927 return std::vector<uint8_t>({
's',
'a',
't'});
2941 EXPECT_CALL(*mockKeyScheduler_, clientKeyUpdate());
2945 return std::vector<uint8_t>({
'c',
'a',
't'});
2948 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"sat"),
_,
_))
2953 EXPECT_CALL(*mockKeyScheduler_, getTrafficKey(RangeMatches(
"cat"),
_,
_))
2964 expectAeadCreation(&waead, &raead);
2965 expectEncryptedReadRecordLayerCreation(&rrl, &raead,
StringPiece(
"sat"));
2966 expectEncryptedWriteRecordLayerCreation(&wrl, &waead,
StringPiece(
"cat"));
2969 expectActions<MutateState, WriteToSocket>(
actions);
2974 write.contents[0].encryptionLevel,
2975 state_.writeRecordLayer()->getEncryptionLevel());
2977 processStateMutations(
actions);
2978 EXPECT_EQ(state_.readRecordLayer().get(), rrl);
2980 state_.readRecordLayer()->getEncryptionLevel(),
2982 EXPECT_EQ(state_.writeRecordLayer().get(), wrl);
2984 state_.writeRecordLayer()->getEncryptionLevel(),
2986 EXPECT_EQ(state_.state(), StateEnum::Established);
2990 setupExpectingServerHello();
2997 setupExpectingServerHello();
2998 setMockEarlyRecord();
3019 setupExpectingServerHello();
3020 setMockEarlyRecord();
3024 processStateMutations(
actions);
3026 state_.writeRecordLayer()->getEncryptionLevel(),
3029 state_.earlyWriteRecordLayer()->getEncryptionLevel(),
3034 setupExpectingServerHello();
3035 setMockEarlyRecord();
3039 processStateMutations(
actions);
3041 state_.writeRecordLayer()->getEncryptionLevel(),
3044 state_.earlyWriteRecordLayer()->getEncryptionLevel(),
3049 setupExpectingServerHello();
3050 setMockEarlyRecord();
3052 context_->setCompatibilityMode(
true);
3055 expectActions<MutateState, WriteToSocket>(
actions);
3062 processStateMutations(
actions);
3067 setupExpectingServerHello();
3068 setMockEarlyRecord();
3070 state_.sentCCS() =
true;
3071 context_->setCompatibilityMode(
true);
3075 expectActions<WriteToSocket>(
actions);
3080 setupExpectingFinished();
3081 setMockEarlyRecord();
3083 context_->setCompatibilityMode(
true);
3087 expectActions<MutateState, WriteToSocket, ReportHandshakeSuccess>(
actions);
3099 processStateMutations(
actions);
3104 setupExpectingServerHello();
3115 setupExpectingEncryptedExtensionsEarlySent();
3135 setupExpectingEncryptedExtensionsEarlySent();
3146 setupExpectingEncryptedExtensionsEarlySent();
3157 setupExpectingEncryptedExtensionsEarlySent();
3168 setupExpectingFinished();
3169 setMockEarlyRecord();
3190 setupExpectingFinished();
3201 setupAcceptingData();
3221 setupAcceptingData();
MockHandshakeContext * mockHandshakeContext_
std::shared_ptr< const Cert > serverCert
void setupExpectingEncryptedExtensionsEarlySent()
MockPlaintextWriteRecordLayer * mockWrite_
std::shared_ptr< const client::FizzClientContext > context
Buf encodeHandshake(T &&handshakeMsg)
std::shared_ptr< const CertificateVerifier > verifier
Integral2 random(Integral1 low, Integral2 up)
folly::Optional< client::CachedPsk > cachedPsk
std::vector< Extension >::const_iterator findExtension(const std::vector< Extension > &extensions, ExtensionType type)
static Optional< EarlyDataParams > getEarlyDataParams(const FizzClientContext &context, const Optional< CachedPsk > &psk)
std::shared_ptr< const Cert > clientCert
void setupExpectingCertificateVerify()
CertificateCompressionAlgorithm algorithm
EarlyDataParams getEarlyDataParams()
void write(const T &in, folly::io::Appender &appender)
uint32_t max_early_data_size
int connect(NetworkSocket s, const sockaddr *name, socklen_t namelen)
CertificateCompressionAlgorithm
#define ASSERT_EQ(val1, val2)
static const std::string chlo
static std::unique_ptr< IOBuf > create(std::size_t capacity)
static NewSessionTicket newSessionTicket()
std::shared_ptr< ClientExtensions > extensions
#define EXPECT_EQ(val1, val2)
KeyShareEntry server_share
std::chrono::steady_clock::time_point now()
constexpr detail::Map< Move > move
std::shared_ptr< MockPskCache > pskCache_
static CertificateMsg certificate()
uint32_t uncompressed_length
The non test part of the code is expected to have failures gtest_output_test_ cc
—— Concurrent Priority Queue Implementation ——
static EarlyAppWrite earlyAppWrite()
void setMockContextAndScheduler()
std::shared_ptr< const Cert > clientCert
std::shared_ptr< MockPeerCert > mockLeaf_
PolymorphicAction< internal::InvokeWithoutArgsAction< FunctionImpl > > InvokeWithoutArgs(FunctionImpl function_impl)
std::vector< KeyShareEntry > client_shares
static ServerHello serverHello()
static Finished finished()
static ClientHello getDefaultClientHello()
Gen range(Value begin, Value end)
MockKeyScheduler * mockKeyScheduler_
CachedPsk getTestPsk(std::string pskName, std::chrono::system_clock::time_point issueTime)
ProtocolVersion selected_version
constexpr Params params[]
void setupAcceptingData()
virtual Actions processAppWrite(const State &, AppWrite)
static CertificateRequest certificateRequest()
PolymorphicMatcher< internal::HasSubstrMatcher< internal::string > > HasSubstr(const internal::string &substring)
uint16_t selected_identity
PolymorphicAction< internal::InvokeAction< FunctionImpl > > Invoke(FunctionImpl function_impl)
static AppWrite appWrite()
NamedGroup selected_group
static EncryptedExtensions encryptedExt()
std::vector< SignatureScheme > supported_signature_algorithms
EncryptionLevel encryptionLevel
MockPlaintextReadRecordLayer * mockRead_
virtual Actions processWriteNewSessionTicket(const State &, WriteNewSessionTicket)
static CertificateVerify certificateVerify()
static CompressedCertificate compressedCertificate()
std::unique_ptr< folly::IOBuf > makeRandom(size_t n)
static void removeExtension(T &msg, ExtensionType ext)
void setMockEarlyRecord()
std::shared_ptr< const Cert > serverCert
void setupExpectingEncryptedExtensions()
Buf getFinishedData(std::unique_ptr< KeyDerivation > &deriver, Buf &finishedMacKey, const Buf &finishedTranscript)
MockEncryptedWriteRecordLayer * mockEarlyWrite_
Actions actions(Args &&...act)
#define EXPECT_TRUE(condition)
#define EXPECT_THAT(value, matcher)
TEST_F(RSAPSSTest, TestSignVerify)
static const std::string nst
static HelloRetryRequest helloRetryRequest()
ExtensionType extension_type
MockEncryptedWriteRecordLayer * mockHandshakeWrite_
std::unique_ptr< folly::IOBuf > Buf
std::shared_ptr< const CertificateVerifier > verifier_
std::shared_ptr< MockSelfCert > mockClientCert_
#define EXPECT_CALL(obj, call)
const internal::AnythingMatcher _
void setMockHandshakeEncryptedRecord()
MockKeyExchange * mockKex_
folly::Optional< std::string > alpn
static KeyUpdate keyUpdate(bool reqUpdate)
#define EXPECT_FALSE(condition)
std::shared_ptr< MockPeerCert > mockIntermediate_
Extension encodeExtension(const TokenBindingParameters ¶ms)
Range< const char * > StringPiece
void setupExpectingCertificateRequest()
folly::Optional< std::string > sni
Actions processEvent(const State &state, Param param)
static std::unique_ptr< IOBuf > copyBuffer(const void *buf, std::size_t size, std::size_t headroom=0, std::size_t minTailroom=0)
void setupExpectingServerHelloAfterHrr()
void setupExpectingServerHello()
Buf compressed_certificate_message
static ClientHello clientHello()
MockEncryptedReadRecordLayer * mockHandshakeRead_
std::shared_ptr< FizzClientContext > context_
constexpr ProtocolVersion TestProtocolVersion
void setupExpectingCertificate()
static ServerHello serverHelloPsk()
internal::ReturnAction< R > Return(R value)
std::shared_ptr< MockCertificateVerifier > verifier_
void setupExpectingFinished()