static int ct_base64_decode(const char *in, unsigned char **out)
{
size_t inlen = strlen(in);
- int outlen;
+ int outlen, i;
unsigned char *outbuf = NULL;
if (inlen == 0) {
goto err;
}
- /* Subtract padding bytes from |outlen| */
+ /* Subtract padding bytes from |outlen|. Any more than 2 is malformed. */
+ i = 0;
while (in[--inlen] == '=') {
--outlen;
+ if (++i > 2)
+ goto err;
}
*out = outbuf;
int CTLOG_new_from_base64(CTLOG **ct_log, const char *pkey_base64, const char *name)
{
unsigned char *pkey_der = NULL;
- int pkey_der_len = ct_base64_decode(pkey_base64, &pkey_der);
+ int pkey_der_len;
const unsigned char *p;
EVP_PKEY *pkey = NULL;
return 0;
}
- if (pkey_der_len <= 0) {
+ pkey_der_len = ct_base64_decode(pkey_base64, &pkey_der);
+ if (pkey_der_len < 0) {
CTerr(CT_F_CTLOG_NEW_FROM_BASE64, CT_R_LOG_CONF_INVALID_KEY);
return 0;
}
#define SETUP_CT_TEST_FIXTURE() SETUP_TEST_FIXTURE(CT_TEST_FIXTURE, set_up)
#define EXECUTE_CT_TEST() EXECUTE_TEST(execute_cert_test, tear_down)
-static int test_no_scts_in_certificate()
+static int test_no_scts_in_certificate(void)
{
SETUP_CT_TEST_FIXTURE();
fixture.certs_dir = certs_dir;
EXECUTE_CT_TEST();
}
-static int test_one_sct_in_certificate()
+static int test_one_sct_in_certificate(void)
{
SETUP_CT_TEST_FIXTURE();
fixture.certs_dir = certs_dir;
EXECUTE_CT_TEST();
}
-static int test_multiple_scts_in_certificate()
+static int test_multiple_scts_in_certificate(void)
{
SETUP_CT_TEST_FIXTURE();
fixture.certs_dir = certs_dir;
EXECUTE_CT_TEST();
}
-static int test_verify_one_sct()
+static int test_verify_one_sct(void)
{
SETUP_CT_TEST_FIXTURE();
fixture.certs_dir = certs_dir;
EXECUTE_CT_TEST();
}
-static int test_verify_multiple_scts()
+static int test_verify_multiple_scts(void)
{
SETUP_CT_TEST_FIXTURE();
fixture.certs_dir = certs_dir;
EXECUTE_CT_TEST();
}
-static int test_verify_fails_for_future_sct()
+static int test_verify_fails_for_future_sct(void)
{
SETUP_CT_TEST_FIXTURE();
fixture.epoch_time_in_ms = 1365094800000; /* Apr 4 17:00:00 2013 GMT */
EXECUTE_CT_TEST();
}
-static int test_decode_tls_sct()
+static int test_decode_tls_sct(void)
{
const unsigned char tls_sct_list[] = "\x00\x78" /* length of list */
"\x00\x76"
EXECUTE_CT_TEST();
}
-static int test_encode_tls_sct()
+static int test_encode_tls_sct(void)
{
const char log_id[] = "3xwuwRUAlFJHqWFoMl3cXHlZ6PfG04j8AC4LvT9012Q=";
const uint64_t timestamp = 1;
* Tests that the CT_POLICY_EVAL_CTX default time is approximately now.
* Allow +-10 minutes, as it may compensate for clock skew.
*/
-static int test_default_ct_policy_eval_ctx_time_is_now()
+static int test_default_ct_policy_eval_ctx_time_is_now(void)
{
int success = 0;
CT_POLICY_EVAL_CTX *ct_policy_ctx = CT_POLICY_EVAL_CTX_new();
return success;
}
+static int test_ctlog_from_base64(void)
+{
+ CTLOG *log = NULL;
+ const char notb64[] = "\01\02\03\04";
+ const char pad[] = "====";
+ const char name[] = "name";
+
+ /* We expect these to both fail! */
+ if (!TEST_true(!CTLOG_new_from_base64(&log, notb64, name))
+ || !TEST_true(!CTLOG_new_from_base64(&log, pad, name)))
+ return 0;
+ return 1;
+}
+
int test_main(int argc, char *argv[])
{
if ((ct_dir = getenv("CT_DIR")) == NULL)
ADD_TEST(test_decode_tls_sct);
ADD_TEST(test_encode_tls_sct);
ADD_TEST(test_default_ct_policy_eval_ctx_time_is_now);
+ ADD_TEST(test_ctlog_from_base64);
return run_tests(argv[0]);
}