42
42
import java .util .Random ;
43
43
44
44
import static de .rub .nds .tlsattacker .core .certificate .ocsp .OCSPResponseTypes .NONCE ;
45
+ import de .rub .nds .tlsattacker .core .constants .NamedGroup ;
46
+ import de .rub .nds .tlsattacker .core .constants .PskKeyExchangeMode ;
47
+ import de .rub .nds .tlsattacker .core .constants .SignatureAndHashAlgorithm ;
48
+ import de .rub .nds .tlsattacker .core .protocol .message .CertificateMessage ;
49
+ import de .rub .nds .tlsattacker .core .protocol .message .cert .CertificateEntry ;
50
+ import de .rub .nds .tlsattacker .core .protocol .message .extension .CertificateStatusRequestExtensionMessage ;
51
+ import de .rub .nds .tlsattacker .core .protocol .message .extension .ExtensionMessage ;
45
52
import de .rub .nds .tlsscanner .serverscanner .config .ScannerConfig ;
46
53
import de .rub .nds .tlsscanner .serverscanner .constants .ProbeType ;
47
54
import de .rub .nds .tlsscanner .serverscanner .report .SiteReport ;
@@ -62,6 +69,7 @@ public class OcspProbe extends TlsProbe {
62
69
private OCSPResponse firstResponse ;
63
70
private OCSPResponse secondResponse ;
64
71
private OCSPResponse httpGetResponse ;
72
+ private List <NamedGroup > tls13NamedGroups ;
65
73
66
74
public static final int NONCE_TEST_VALUE_1 = 42 ;
67
75
public static final int NONCE_TEST_VALUE_2 = 1337 ;
@@ -84,9 +92,12 @@ public ProbeResult executeTest() {
84
92
getMustStaple (serverCertChain );
85
93
getStapledResponse (tlsConfig );
86
94
performRequest (serverCertChain );
87
-
95
+ List <CertificateStatusRequestExtensionMessage > tls13CertStatus = null ;
96
+ if (tls13NamedGroups != null ) {
97
+ tls13CertStatus = getCertificateStatusFromCertificateEntryExtension ();
98
+ }
88
99
return new OcspResult (supportsOcsp , supportsStapling , mustStaple , supportsNonce , stapledResponse ,
89
- firstResponse , secondResponse , httpGetResponse );
100
+ firstResponse , secondResponse , httpGetResponse , tls13CertStatus );
90
101
}
91
102
92
103
private void getMustStaple (Certificate certChain ) {
@@ -222,16 +233,63 @@ private Config initTlsConfig() {
222
233
223
234
@ Override
224
235
public boolean canBeExecuted (SiteReport report ) {
225
- return report .getCertificateChain () != null ;
236
+ // We also need the tls13 groups to perform a tls13 handshake
237
+ return report .getCertificateChain () != null && report .isProbeAlreadyExecuted (ProbeType .NAMED_GROUPS );
226
238
}
227
239
228
240
@ Override
229
241
public void adjustConfig (SiteReport report ) {
230
242
serverCertChain = report .getCertificateChain ().getCertificate ();
243
+ tls13NamedGroups = report .getSupportedTls13Groups ();
244
+ }
245
+
246
+ private List <CertificateStatusRequestExtensionMessage > getCertificateStatusFromCertificateEntryExtension () {
247
+ List <CertificateStatusRequestExtensionMessage > certificateStatuses = new LinkedList <>();
248
+ Config tlsConfig = getScannerConfig ().createConfig ();
249
+ tlsConfig .setQuickReceive (true );
250
+ tlsConfig .setDefaultClientSupportedCiphersuites (CipherSuite .getImplementedTls13CipherSuites ());
251
+ tlsConfig .setHighestProtocolVersion (ProtocolVersion .TLS13 );
252
+ tlsConfig .setSupportedVersions (ProtocolVersion .TLS13 );
253
+ tlsConfig .setEnforceSettings (false );
254
+ tlsConfig .setEarlyStop (true );
255
+ tlsConfig .setStopReceivingAfterFatal (true );
256
+ tlsConfig .setStopActionsAfterFatal (true );
257
+ tlsConfig .setWorkflowTraceType (WorkflowTraceType .HELLO );
258
+ tlsConfig .setDefaultClientNamedGroups (tls13NamedGroups );
259
+ tlsConfig .setAddECPointFormatExtension (false );
260
+ tlsConfig .setAddEllipticCurveExtension (true );
261
+ tlsConfig .setAddSignatureAndHashAlgorithmsExtension (true );
262
+ tlsConfig .setAddSupportedVersionsExtension (true );
263
+ tlsConfig .setAddKeyShareExtension (true );
264
+ tlsConfig .setAddServerNameIndicationExtension (true );
265
+ tlsConfig .setAddCertificateStatusRequestExtension (true );
266
+ tlsConfig .setUseFreshRandom (true );
267
+ tlsConfig .setDefaultClientSupportedSignatureAndHashAlgorithms (SignatureAndHashAlgorithm
268
+ .getTls13SignatureAndHashAlgorithms ());
269
+ State state = new State (tlsConfig );
270
+ List <PskKeyExchangeMode > pskKex = new LinkedList <>();
271
+ pskKex .add (PskKeyExchangeMode .PSK_DHE_KE );
272
+ pskKex .add (PskKeyExchangeMode .PSK_KE );
273
+ tlsConfig .setPSKKeyExchangeModes (pskKex );
274
+ tlsConfig .setAddPSKKeyExchangeModesExtension (true );
275
+ executeState (state );
276
+ if (WorkflowTraceUtil .didReceiveMessage (HandshakeMessageType .CERTIFICATE , state .getWorkflowTrace ())) {
277
+ CertificateMessage certificateMessage = (CertificateMessage ) WorkflowTraceUtil .getFirstReceivedMessage (
278
+ HandshakeMessageType .CERTIFICATE , state .getWorkflowTrace ());
279
+ List <CertificateEntry > certificateEntries = certificateMessage .getCertificatesListAsEntry ();
280
+ for (CertificateEntry certificateEntry : certificateEntries ) {
281
+ for (ExtensionMessage extensionMessage : certificateEntry .getExtensions ()) {
282
+ if (extensionMessage instanceof CertificateStatusRequestExtensionMessage ) {
283
+ certificateStatuses .add ((CertificateStatusRequestExtensionMessage ) extensionMessage );
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return certificateStatuses ;
231
289
}
232
290
233
291
@ Override
234
292
public ProbeResult getCouldNotExecuteResult () {
235
- return new OcspResult (null , false , false , false , null , null , null , null );
293
+ return new OcspResult (null , false , false , false , null , null , null , null , null );
236
294
}
237
295
}
0 commit comments