Thank you for info, i changed my code to use that build in template and changed "cast(ubyte[]" to "xxx.representation" and it is still working:

#!/usr/bin/rdmd -L-lcurl

module sigawsv4;

import std.stdio, std.process;
import std.digest.sha, std.digest.hmac;
import std.string;
import std.conv;
import std.datetime;
import std.net.curl;

void main()
{
        auto accessKey = environment["AWS_ACCESS_KEY"];
        auto secretKey = environment["AWS_SECRET_KEY"];

        auto currentClock = Clock.currTime(UTC());

        auto currentDate = cast(Date)currentClock;
        auto curDateStr = currentDate.toISOString;

        auto currentTime = cast(TimeOfDay)currentClock;
        auto curTimeStr = currentTime.toISOString;

        auto xamztime = curDateStr ~ "T" ~ curTimeStr ~ "Z";

        
        string method = "GET";
        string service = "ec2";
        string host = "ec2.amazonaws.com";
        string region = "us-east-1";
        string endpoint = "https://ec2.amazonaws.com";;
string request_parameters = "Action=DescribeInstances&Version=2013-10-15";


        alias sign = hmac!SHA256;

auto getSignatureKey(string key, string dateStamp, string regionName, string serviceName)
        {
                auto kString = ("AWS4" ~ key).representation;
                auto kDate = sign(dateStamp.representation, kString);
                auto kRegion = sign(regionName.representation, kDate);
                auto kService = sign(serviceName.representation, kRegion);
                auto kSigning = sign("aws4_request".representation, kService);

                return kSigning;
        }


        string canonicalURI = "/";
        string canonicalQueryString = request_parameters;
string canonicalHeadersString = "host:" ~ host ~ "\n" ~ "x-amz-date:" ~ xamztime ~ "\n";
        string signedHeaders = "host;x-amz-date";
        string payloadHash = sha256Of("").toHexString.toLower;
string canonicalRequest = method ~ "\n" ~ canonicalURI ~ "\n" ~ canonicalQueryString ~ "\n" ~ canonicalHeadersString ~ "\n" ~ signedHeaders ~ "\n" ~ payloadHash;


        string algorithm = "AWS4-HMAC-SHA256";
string credentialScope = curDateStr ~ "/" ~ region ~ "/" ~ service ~ "/" ~ "aws4_request"; string stringToSign = algorithm ~ "\n" ~ xamztime ~ "\n" ~ credentialScope ~ "\n" ~ sha256Of(canonicalRequest).toHexString.toLower;

auto signingKey = getSignatureKey(secretKey, curDateStr, region, service);

string signature = hmac!SHA256(stringToSign.representation, signingKey).toHexString.toLower;

string authorizationHeader = algorithm ~ " " ~ "Credential=" ~ accessKey ~ "/" ~ credentialScope ~ ", " ~ "SignedHeaders=" ~ signedHeaders ~ ", " ~ "Signature=" ~ signature;

        auto client = HTTP(endpoint ~ "?" ~ canonicalQueryString);
        client.method = HTTP.Method.get;
        client.addRequestHeader("x-amz-date", xamztime);
        client.addRequestHeader("Authorization", authorizationHeader);
        auto content = client.perform();

        writeln(content);
}


Reply via email to