1111import de .rub .nds .modifiablevariable .bytearray .ByteArrayModificationFactory ;
1212import de .rub .nds .modifiablevariable .bytearray .ModifiableByteArray ;
1313import de .rub .nds .tlsattacker .core .config .Config ;
14+ import de .rub .nds .tlsattacker .core .constants .HandshakeMessageType ;
1415import de .rub .nds .tlsattacker .core .exceptions .WorkflowExecutionException ;
15- import de .rub .nds .tlsattacker .core .protocol .message .AlertMessage ;
16- import de .rub .nds .tlsattacker .core .protocol .message .CertificateMessage ;
17- import de .rub .nds .tlsattacker .core .protocol .message .ChangeCipherSpecMessage ;
1816import de .rub .nds .tlsattacker .core .protocol .message .ProtocolMessage ;
1917import de .rub .nds .tlsattacker .core .protocol .message .RSAClientKeyExchangeMessage ;
20- import de .rub .nds .tlsattacker .core .protocol .message .ServerHelloDoneMessage ;
21- import de .rub .nds .tlsattacker .core .protocol .message .ServerHelloMessage ;
2218import de .rub .nds .tlsattacker .core .state .State ;
23- import de .rub .nds .tlsattacker .core .state .TlsContext ;
2419import de .rub .nds .tlsattacker .core .workflow .WorkflowExecutor ;
2520import de .rub .nds .tlsattacker .core .workflow .WorkflowExecutorFactory ;
26- import de .rub .nds .tlsattacker .core .workflow .action . ReceiveAction ;
27- import de .rub .nds .tlsattacker .core .workflow .action . SendAction ;
21+ import de .rub .nds .tlsattacker .core .workflow .WorkflowTrace ;
22+ import de .rub .nds .tlsattacker .core .workflow .WorkflowTraceUtil ;
2823import de .rub .nds .tlsattacker .core .workflow .factory .WorkflowTraceType ;
2924import de .rub .nds .tlsattacker .util .MathHelper ;
3025import java .security .PublicKey ;
3126import java .security .interfaces .RSAPublicKey ;
32- import java .util .LinkedList ;
33- import java .util .List ;
34- import org .apache .logging .log4j .Level ;
35- import org .apache .logging .log4j .LogManager ;
36- import org .apache .logging .log4j .core .LoggerContext ;
37- import org .apache .logging .log4j .core .config .Configuration ;
38- import org .apache .logging .log4j .core .config .LoggerConfig ;
3927
4028/**
4129 *
@@ -45,65 +33,66 @@ public class RealDirectMessagePkcs1Oracle extends Pkcs1Oracle {
4533
4634 Config config ;
4735
48- public RealDirectMessagePkcs1Oracle (PublicKey pubKey , Config config ) {
36+ private final String validResponseContent ;
37+
38+ private final String invalidResponseContent ;
39+
40+ public RealDirectMessagePkcs1Oracle (PublicKey pubKey , Config config , String validResponseContent ,
41+ String invalidResponseContent ) {
4942 this .publicKey = (RSAPublicKey ) pubKey ;
5043 this .blockSize = MathHelper .intceildiv (publicKey .getModulus ().bitLength (), 8 );
5144 this .config = config ;
52- this .config .setWorkflowTraceType (WorkflowTraceType .HELLO );
45+ this .validResponseContent = validResponseContent ;
46+ this .invalidResponseContent = invalidResponseContent ;
5347
54- LoggerContext ctx = (LoggerContext ) LogManager .getContext (false );
55- Configuration ctxConfig = ctx .getConfiguration ();
56- LoggerConfig loggerConfig = ctxConfig .getLoggerConfig (LogManager .ROOT_LOGGER_NAME );
57- loggerConfig .setLevel (Level .INFO );
58- ctx .updateLoggers ();
48+ // LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
49+ // Configuration ctxConfig = ctx.getConfiguration();
50+ // LoggerConfig loggerConfig =
51+ // ctxConfig.getLoggerConfig(LogManager.ROOT_LOGGER_NAME);
52+ // loggerConfig.setLevel(Level.INFO);
53+ // ctx.updateLoggers();
5954 }
6055
6156 @ Override
6257 public boolean checkPKCSConformity (final byte [] msg ) {
63-
58+ // we are initializing a new connection in every loop step, since most
59+ // of the known servers close the connection after an invalid handshake
6460 State state = new State (config );
65- TlsContext tlsContext = state .getTlsContext ();
66- WorkflowExecutor workflowExecutor = WorkflowExecutorFactory .createWorkflowExecutor (
67- config .getWorkflowExecutorType (), state );
68-
69- List <ProtocolMessage > protocolMessages = new LinkedList <>();
70- protocolMessages .add (new ServerHelloMessage (config ));
71- protocolMessages .add (new CertificateMessage (config ));
72- protocolMessages .add (new ServerHelloDoneMessage (config ));
73- state .getWorkflowTrace ().addTlsAction (new ReceiveAction (protocolMessages ));
74- protocolMessages = new LinkedList <>();
75- RSAClientKeyExchangeMessage cke = new RSAClientKeyExchangeMessage (config );
76- protocolMessages .add (cke );
77- protocolMessages .add (new ChangeCipherSpecMessage (config ));
78- state .getWorkflowTrace ().addTlsAction (new SendAction (protocolMessages ));
61+ state .getConfig ().setWorkflowTraceType (WorkflowTraceType .FULL );
62+ WorkflowExecutor workflowExecutor = WorkflowExecutorFactory .createWorkflowExecutor (state .getConfig ()
63+ .getWorkflowExecutorType (), state );
64+ WorkflowTrace trace = state .getWorkflowTrace ();
7965
80- protocolMessages = new LinkedList <>();
81- protocolMessages .add (new AlertMessage (config ));
82- state .getWorkflowTrace ().addTlsAction (new ReceiveAction (protocolMessages ));
83-
84- ModifiableByteArray pms = new ModifiableByteArray ();
85- pms .setModification (ByteArrayModificationFactory .explicitValue (msg ));
86- cke .setPublicKey (pms );
87-
88- if (numberOfQueries % 100 == 0 ) {
89- LOGGER .debug ("Number of queries so far: {}" , numberOfQueries );
66+ RSAClientKeyExchangeMessage cke = (RSAClientKeyExchangeMessage ) WorkflowTraceUtil .getFirstSendMessage (
67+ HandshakeMessageType .CLIENT_KEY_EXCHANGE , trace );
68+ ModifiableByteArray epms = new ModifiableByteArray ();
69+ epms .setModification (ByteArrayModificationFactory .explicitValue (msg ));
70+ cke .setPublicKey (epms );
71+
72+ numberOfQueries ++;
73+ if (numberOfQueries % 1000 == 0 ) {
74+ LOGGER .info ("Number of queries so far: {}" , numberOfQueries );
9075 }
9176
92- boolean valid = true ;
77+ boolean conform = false ;
9378 try {
9479 workflowExecutor .executeWorkflow ();
80+ ProtocolMessage lastMessage = WorkflowTraceUtil .getLastReceivedMessage (trace );
81+ if (lastMessage != null ) {
82+ String lastMessageLower = lastMessage .toString ().toLowerCase ();
83+ if (validResponseContent != null ) {
84+ conform = lastMessageLower .contains (validResponseContent .toLowerCase ());
85+ } else if (invalidResponseContent != null ) {
86+ conform = !lastMessageLower .contains (invalidResponseContent .toLowerCase ());
87+ }
88+ }
9589 } catch (WorkflowExecutionException e ) {
9690 // TODO implementing the orcale through caught exceptions is not
9791 // smart
98- valid = false ;
99- e .printStackTrace ();
100- } finally {
101- numberOfQueries ++;
102- }
103- if (tlsContext .isReceivedFatalAlert ()) {
104- valid = false ;
92+ conform = false ;
93+ LOGGER .info (e .getLocalizedMessage (), e );
10594 }
10695
107- return valid ;
96+ return conform ;
10897 }
10998}
0 commit comments