void create_signing_string(List *http_headers, char *payload, char *region, char *longdate, char *shortdate, char **signing_string) {
  char *signed_request;
  char *canonical_request_str;

  create_canonical_request(http_headers, payload, &canonical_request_str);

  if (NULL == canonical_request_str) {
    puts("Failed to generate canonical request");
    free(canonical_request_str);
    return;
  }

  hash_sha256(canonical_request_str, strlen(canonical_request_str), &signed_request);
  if (NULL == signed_request) {
    puts("Failed to create signed_request");
    free(signed_request);
    return;
  }
  free(canonical_request_str);

  int signing_string_len = strlen("AWS4-HMAC-SHA256\n\n//kinesis/aws4_request\n") + strlen(longdate) + strlen(shortdate) + strlen(region) + 2*32;
  *signing_string = (char *)calloc(signing_string_len + 1, sizeof(char));
  if (!sprintf(*signing_string, "AWS4-HMAC-SHA256\n%s\n%s/%s/kinesis/aws4_request\n%s", longdate, shortdate, region, signed_request)) {
    puts("Failed to create sign_string");
    free(signing_string);
    return;
  }
}
Exemplo n.º 2
0
static dpl_status_t
dpl_s3_insert_signature_v4_params(const dpl_req_t *req, dpl_dict_t *query_params,
                                  struct tm *tm, char *date_str, char *signature)
{
  int           item;
  dpl_status_t  ret;
  dpl_vec_t     *canonical_params;
  char          canonical_request[4096] = "";
  char          sign_request[1024] = "";

  canonical_params = get_canonical_params(req->subresource, query_params, 0);
  if (canonical_params == NULL)
    return DPL_FAILURE;

  ret = create_canonical_request(req, NULL, NULL, canonical_params,
                                 canonical_request, sizeof(canonical_request));

  if (ret == DPL_SUCCESS) {
    DPRINTF("Canonical request:\n%s\n", canonical_request);
    ret = create_sign_request(req, canonical_request, tm, date_str,
                              sign_request, sizeof(sign_request));
  }

  if (ret == DPL_SUCCESS) {
    DPRINTF("Signing request:\n%s\n", sign_request);
    ret = create_signature(req, tm, sign_request, signature);
  }

  if (ret == DPL_SUCCESS)
    DPRINTF("Signature: %s\n", signature);

  for (item = 0; item < canonical_params->n_items; item++) {
    dpl_dict_var_t    *param = (dpl_dict_var_t *) dpl_vec_get(canonical_params, item);
    free(param->key);
    dpl_dict_var_free(param);
  }
  dpl_vec_free(canonical_params);

  return ret;
}
Exemplo n.º 3
0
dpl_status_t
dpl_s3_add_authorization_v4_to_headers(const dpl_req_t *req,
                                       dpl_dict_t *headers,
                                       const dpl_dict_t *query_params,
                                       struct tm *i_tm)
{
  int           item;
  dpl_status_t  ret;
  char          canonical_request[4096] = "";
  char          sign_request[1024] = "";
  char          signature[DPL_HEX_LENGTH(SHA256_DIGEST_LENGTH) + 1];
  char          authorization[1024] = "";
  char          date_str[32] = "";
  dpl_vec_t     *canonical_headers;
  dpl_vec_t     *canonical_params;
  struct tm     tm;

  ret = add_payload_signature_to_headers(req, headers);
  if (ret != DPL_SUCCESS)
    return ret;

  ret = get_current_utc_date(&tm, i_tm, date_str, sizeof(date_str));
  if (ret != DPL_SUCCESS)
    return ret;

  ret = dpl_dict_add(headers, "x-amz-date", date_str, 0);
  if (ret != DPL_SUCCESS)
    return ret;

  canonical_headers = get_canonical_headers(headers);
  if (canonical_headers == NULL)
    return DPL_FAILURE;

  canonical_params = get_canonical_params(req->subresource, query_params, 1);
  if (canonical_params == NULL) {
    dpl_vec_free(canonical_headers);
    return DPL_FAILURE;
  }

  ret = create_canonical_request(req, headers,
                                 canonical_headers, canonical_params,
                                 canonical_request, sizeof(canonical_request));

  if (ret == DPL_SUCCESS) {
    DPRINTF("Canonical request:\n%s\n", canonical_request);
    ret = create_sign_request(req, canonical_request, &tm, date_str,
                              sign_request, sizeof(sign_request));
  }

  if (ret == DPL_SUCCESS) {
    DPRINTF("Signing request:\n%s\n", sign_request);
    ret = create_signature(req, &tm, sign_request, signature);
  }

  if (ret == DPL_SUCCESS) {
    DPRINTF("Signature: %s\n", signature);
    ret = create_authorization(req, &tm, canonical_headers, signature,
                               authorization, sizeof(authorization));
  }

  if (ret == DPL_SUCCESS)
    ret = dpl_dict_add(headers, "Authorization", authorization, 0);

  for (item = 0; item < canonical_params->n_items; item++) {
    dpl_dict_var_t    *param = (dpl_dict_var_t *) dpl_vec_get(canonical_params, item);
    free(param->key);
    dpl_dict_var_free(param);
  }
  dpl_vec_free(canonical_params);
  dpl_vec_free(canonical_headers);

  return ret;
}