in src/common/commonutils/SshUtils.c [349:449]
static int CheckAppropriateCiphersForSsh(const char* ciphers, char** reason, OsConfigLogHandle log)
{
char* sshCiphers = NULL;
char* ciphersValue = NULL;
char* value = NULL;
size_t ciphersValueLength = 0;
size_t i = 0;
int status = 0;
if (NULL == ciphers)
{
OsConfigLogError(log, "CheckAppropriateCiphersForSsh: invalid argument");
return EINVAL;
}
else if (0 != IsSshServerActive(log))
{
return status;
}
else if (NULL == (sshCiphers = DuplicateStringToLowercase(g_sshCiphers)))
{
OsConfigLogError(log, "CheckAppropriateCiphersForSsh: failed to duplicate string to lowercase");
return ENOMEM;
}
if (NULL == (ciphersValue = GetSshServerState(sshCiphers, log)))
{
OsConfigLogInfo(log, "CheckAppropriateCiphersForSsh: '%s' not found in SSH Server response", sshCiphers);
OsConfigCaptureReason(reason, "'%s' not found in SSH Server response", sshCiphers);
status = ENOENT;
}
else
{
ciphersValueLength = strlen(ciphersValue);
// Check that no unapproved ciphers are configured
for (i = 0; i < ciphersValueLength; i++)
{
if (NULL == (value = DuplicateString(&(ciphersValue[i]))))
{
OsConfigLogError(log, "CheckAppropriateCiphersForSsh: failed to duplicate string");
status = ENOMEM;
break;
}
else
{
TruncateAtFirst(value, ',');
if (NULL == strstr(ciphers, value))
{
status = ENOENT;
OsConfigLogInfo(log, "CheckAppropriateCiphersForSsh: unapproved cipher '%s' found in SSH Server response", value);
OsConfigCaptureReason(reason, "Cipher '%s' found in SSH Server response is unapproved", value);
}
i += strlen(value);
FREE_MEMORY(value);
continue;
}
}
ciphersValueLength = strlen(ciphers);
// Check that all required ciphers are configured
for (i = 0; i < ciphersValueLength; i++)
{
if (NULL == (value = DuplicateString(&(ciphers[i]))))
{
OsConfigLogError(log, "CheckAppropriateCiphersForSsh: failed to duplicate ciphers string");
status = ENOMEM;
break;
}
else
{
TruncateAtFirst(value, ',');
if (NULL == strstr(ciphersValue, value))
{
status = ENOENT;
OsConfigLogInfo(log, "CheckAppropriateCiphersForSsh: required cipher '%s' not found in SSH Server response", &(ciphers[i]));
OsConfigCaptureReason(reason, "Cipher '%s' is required and is not found in SSH Server response", &(ciphers[i]));
}
i += strlen(value);
FREE_MEMORY(value);
continue;
}
}
}
if (0 == status)
{
OsConfigCaptureSuccessReason(reason, "%s reports that '%s' is set to '%s' (only approved ciphers)", g_sshServerService, sshCiphers, ciphersValue);
}
FREE_MEMORY(ciphersValue);
FREE_MEMORY(sshCiphers);
OsConfigLogInfo(log, "CheckAppropriateCiphersForSsh returning %d", status);
return status;
}