uint8_t *input, uint32_t input_len,
void *local_data)
{
-// PrintRawDataFp(stdout, input, input_len);
+ SshState *ssh_state = (SshState *)state;
+
+ if (ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED || EnoughData(input, input_len) == TRUE) {
+ SCLogInfo("enough data, parse now");
+ // parse now
+ int r = SSHParseRecord(ssh_state, &ssh_state->srv_hdr, input, input_len);
+ SCReturnInt(r);
+ } else {
+ // buffer
+ }
+
+ PrintRawDataFp(stdout, input, input_len);
return 0;
}
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_SSH, STREAM_TOSERVER|STREAM_EOF, sshbuf, sshlen);
if (r != 0) {
printf("toclient chunk 1 returned %" PRId32 ", expected 0: ", r);
- result = 0;
SCMutexUnlock(&f.m);
goto end;
}
SshState *ssh_state = f.alstate;
if (ssh_state == NULL) {
printf("no ssh state: ");
- result = 0;
goto end;
}
if ( !(ssh_state->cli_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.software_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.proto_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->cli_hdr.software_version, "MySSHClient-0.5.1", strlen("MySSHClient-0.5.1")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->cli_hdr.proto_version, "2.0", strlen("2.0")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
result = 1;
-
end:
if (alp_tctx != NULL)
AppLayerParserThreadCtxFree(alp_tctx);
static int SSHParserTest02(void) {
int result = 0;
Flow f;
- uint8_t sshbuf[] = "lalala\n lal al al\nSSH-2.0-MySSHClient-0.5.1 some comments...\n";
+ uint8_t sshbuf[] = "SSH-2.0-MySSHClient-0.5.1 some comments...\n";
uint32_t sshlen = sizeof(sshbuf) - 1;
TcpSession ssn;
AppLayerParserThreadCtx *alp_tctx = AppLayerParserThreadCtxAlloc();
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_SSH, STREAM_TOSERVER|STREAM_EOF, sshbuf, sshlen);
if (r != 0) {
printf("toclient chunk 1 returned %" PRId32 ", expected 0: ", r);
- result = 0;
SCMutexUnlock(&f.m);
goto end;
}
SshState *ssh_state = f.alstate;
if (ssh_state == NULL) {
printf("no ssh state: ");
- result = 0;
goto end;
}
if ( !(ssh_state->cli_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.software_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.proto_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->cli_hdr.software_version, "MySSHClient-0.5.1", strlen("MySSHClient-0.5.1")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->cli_hdr.proto_version, "2.0", strlen("2.0")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
result = 1;
-
end:
if (alp_tctx != NULL)
AppLayerParserThreadCtxFree(alp_tctx);
static int SSHParserTest03(void) {
int result = 0;
Flow f;
- uint8_t sshbuf[] = "lalala\n lal al al\nSSH-2.0 some comments...\n";
+ uint8_t sshbuf[] = "SSH-2.0 some comments...\n";
uint32_t sshlen = sizeof(sshbuf) - 1;
TcpSession ssn;
AppLayerParserThreadCtx *alp_tctx = AppLayerParserThreadCtxAlloc();
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_SSH, STREAM_TOSERVER|STREAM_EOF, sshbuf, sshlen);
if (r == 0) {
printf("toclient chunk 1 returned %" PRId32 ", expected != 0: ", r);
- result = 0;
SCMutexUnlock(&f.m);
goto end;
}
SCMutexUnlock(&f.m);
- /* Ok, it returned an error. Let's make sure we didn't parse the string at all */
SshState *ssh_state = f.alstate;
if (ssh_state == NULL) {
printf("no ssh state: ");
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.flags & SSH_FLAG_VERSION_PARSED) {
printf("Client version string parsed? It's not a valid string: ");
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.proto_version != NULL) {
- result = 0;
goto end;
}
if (ssh_state->cli_hdr.software_version != NULL) {
- result = 0;
goto end;
}
result = 1;
-
end:
if (alp_tctx != NULL)
AppLayerParserThreadCtxFree(alp_tctx);
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_SSH, STREAM_TOCLIENT|STREAM_EOF, sshbuf, sshlen);
if (r != 0) {
printf("toserver chunk 1 returned %" PRId32 ", expected 0: ", r);
- result = 0;
SCMutexUnlock(&f.m);
goto end;
}
SshState *ssh_state = f.alstate;
if (ssh_state == NULL) {
printf("no ssh state: ");
- result = 0;
goto end;
}
- if ( !(ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED)) {
+ if (!(ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->srv_hdr.software_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->srv_hdr.proto_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->srv_hdr.software_version, "MySSHClient-0.5.1", strlen("MySSHClient-0.5.1")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->srv_hdr.proto_version, "2.0", strlen("2.0")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
return result;
}
-/** \test Send a version string in one chunk but multiple lines and comments.
- * (server version str)
+/** \test Send a version string in one chunk (server version str)
*/
static int SSHParserTest05(void) {
int result = 0;
Flow f;
- uint8_t sshbuf[] = "lalala\n lal al al\nSSH-2.0-MySSHClient-0.5.1 some comments...\n";
+ uint8_t sshbuf[] = "SSH-2.0-MySSHClient-0.5.1 some comments...\n";
uint32_t sshlen = sizeof(sshbuf) - 1;
TcpSession ssn;
AppLayerParserThreadCtx *alp_tctx = AppLayerParserThreadCtxAlloc();
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_SSH, STREAM_TOCLIENT|STREAM_EOF, sshbuf, sshlen);
if (r != 0) {
printf("toserver chunk 1 returned %" PRId32 ", expected 0: ", r);
- result = 0;
SCMutexUnlock(&f.m);
goto end;
}
SshState *ssh_state = f.alstate;
if (ssh_state == NULL) {
printf("no ssh state: ");
- result = 0;
goto end;
}
- if ( !(ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED)) {
+ if (!(ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->srv_hdr.software_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (ssh_state->srv_hdr.proto_version == NULL) {
printf("Client version string not parsed: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->srv_hdr.software_version, "MySSHClient-0.5.1", strlen("MySSHClient-0.5.1")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
if (strncmp((char*)ssh_state->srv_hdr.proto_version, "2.0", strlen("2.0")) != 0) {
printf("Client version string not parsed correctly: ");
- result = 0;
goto end;
}
result = 1;
-
end:
if (alp_tctx != NULL)
AppLayerParserThreadCtxFree(alp_tctx);
return result;
}
-/** \test Send a invalid version string in one chunk but multiple lines and comments.
- * (server version str)
+/** \test Send a invalid version string in one chunk (server version str)
*/
static int SSHParserTest06(void) {
int result = 0;
Flow f;
- uint8_t sshbuf[] = "lalala\n lal al al\nSSH-2.0 some comments...\n";
+ uint8_t sshbuf[] = "SSH-2.0 some comments...\n";
uint32_t sshlen = sizeof(sshbuf) - 1;
TcpSession ssn;
AppLayerParserThreadCtx *alp_tctx = AppLayerParserThreadCtxAlloc();
int r = AppLayerParserParse(alp_tctx, &f, ALPROTO_SSH, STREAM_TOCLIENT|STREAM_EOF, sshbuf, sshlen);
if (r == 0) {
printf("toserver chunk 1 returned %" PRId32 ", expected != 0: ", r);
- result = 0;
SCMutexUnlock(&f.m);
goto end;
}
SshState *ssh_state = f.alstate;
if (ssh_state == NULL) {
printf("no ssh state: ");
- result = 0;
goto end;
}
- if (ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED) {
+ if (ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED) {
printf("Client version string parsed? It's not a valid string: ");
- result = 0;
goto end;
}
if (ssh_state->srv_hdr.proto_version != NULL) {
- result = 0;
goto end;
}
if (ssh_state->srv_hdr.software_version != NULL) {
- result = 0;
goto end;
}
result = 1;
-
end:
if (alp_tctx != NULL)
AppLayerParserThreadCtxFree(alp_tctx);
static int SSHParserTest08(void) {
int result = 0;
Flow f;
- uint8_t sshbuf1[] = "Welcome to this ssh server\nSSH-";
+ uint8_t sshbuf1[] = "SSH-";
uint32_t sshlen1 = sizeof(sshbuf1) - 1;
uint8_t sshbuf2[] = "2.";
uint32_t sshlen2 = sizeof(sshbuf2) - 1;
goto end;
}
- if ( !(ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED)) {
+ if (!(ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
goto end;
}
static int SSHParserTest10(void) {
int result = 0;
Flow f;
- uint8_t sshbuf1[] = "Welcome to this ssh server\nSSH-";
+ uint8_t sshbuf1[] = "SSH-";
uint32_t sshlen1 = sizeof(sshbuf1) - 1;
uint8_t sshbuf2[] = "2.";
uint32_t sshlen2 = sizeof(sshbuf2) - 1;
goto end;
}
- if ( !(ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED)) {
+ if (!(ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
goto end;
}
static int SSHParserTest16(void) {
int result = 0;
Flow f;
- uint8_t sshbuf1[] = "Welcome to this ssh server\nSSH-";
+ uint8_t sshbuf1[] = "SSH-";
uint32_t sshlen1 = sizeof(sshbuf1) - 1;
uint8_t sshbuf2[] = "2.0-MySSHClient-0.5.1\r\n";
uint32_t sshlen2 = sizeof(sshbuf2) - 1;
goto end;
}
- if ( !(ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED)) {
+ if (!(ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
goto end;
}
static int SSHParserTest17(void) {
int result = 0;
Flow f;
- uint8_t sshbuf1[] = "Welcome to this ssh server\nSSH-";
+ uint8_t sshbuf1[] = "SSH-";
uint32_t sshlen1 = sizeof(sshbuf1) - 1;
uint8_t sshbuf2[] = "2.0-MySSHClient-0.5.1\r\n";
uint32_t sshlen2 = sizeof(sshbuf2) - 1;
goto end;
}
- if ( !(ssh_state->flags & SSH_FLAG_SERVER_VERSION_PARSED)) {
+ if (!(ssh_state->srv_hdr.flags & SSH_FLAG_VERSION_PARSED)) {
printf("Client version string not parsed: ");
goto end;
}