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; } }
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; }
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; }