56            return !
error.empty();
 
 
 
   80            const bool lookup_product_code_arg,
 
   81            const int debug_level_arg)
 
   82        : 
cs(std::move(cs_arg)),
 
 
   91            const std::string &role_for_credentials_arg,
 
   92            const std::string &certs_dir_arg)
 
   93        : 
cs(std::move(cs_arg)),
 
 
  107        http_config->frame = 
frame;
 
  108        http_config->connect_timeout = 15;
 
  109        http_config->general_timeout = 30;
 
  113        ts->host.host = 
"169.254.169.254";
 
  114        ts->host.port = 
"80";
 
  115        ts->http_config = http_config;
 
 
  126            throw awspc_query_error(
"request pending");
 
  141                t->req.method = 
"PUT";
 
  142                t->req.uri = 
"/latest/api/token";
 
  143                t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token-ttl-seconds: 60");
 
  144                ts->transactions.push_back(std::move(t));
 
  150                self->token_query_complete(ts);
 
  156        catch (
const std::exception &e)
 
 
  185                done(
"could not fetch AWS identity document: " + ident_trans.
format_status(lts));
 
  192                done(
"could not fetch AWS identity document signature: " + sig_trans.
format_status(lts));
 
  198            const std::string sig = 
"-----BEGIN PKCS7-----\n" 
  200                                    + 
"\n-----END PKCS7-----\n";
 
  212                std::list<OpenSSLPKI::X509> certs;
 
  214                    certs.emplace_back(
awscert(), 
"AWS Cert");
 
  225                const std::string title = 
"identity-document";
 
  226                const Json::Value root = 
json::parse(ident, title);
 
  263        catch (
const std::exception &e)
 
 
  287                t->req.method = 
"GET";
 
  288                t->req.uri = 
"/latest/dynamic/instance-identity/document";
 
  289                t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
 
  290                ts->transactions.push_back(std::move(t));
 
  296                t->req.method = 
"GET";
 
  297                t->req.uri = 
"/latest/dynamic/instance-identity/pkcs7";
 
  298                t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
 
  299                ts->transactions.push_back(std::move(t));
 
  306                t->req.method = 
"GET";
 
  307                t->req.uri = 
"/latest/meta-data/product-codes";
 
  308                t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
 
  309                ts->transactions.push_back(std::move(t));
 
  316                t->req.method = 
"GET";
 
  318                t->ci.extra_headers.emplace_back(
"X-aws-ec2-metadata-token: " + token);
 
  319                ts->transactions.push_back(std::move(t));
 
  325                self->local_query_complete(ts);
 
  331        catch (
const std::exception &e)
 
 
  348        SSLLib::SSLAPI::Config::Ptr ssl(
new SSLLib::SSLAPI::Config);
 
  351        ssl->set_local_cert_enabled(
false);
 
  354        ssl->set_flags(ssl_flags);
 
  355        ssl->set_frame(
frame);
 
  361        hc->ssl_factory = ssl->new_factory();
 
  362        hc->user_agent = 
"PG";
 
  363        hc->connect_timeout = 30;
 
  364        hc->general_timeout = 60;
 
  368            "awspc1.openvpn.net",
 
  369            "awspc2.openvpn.net"));
 
  373        ts->host.host = hr->next_host();
 
  374        ts->host.port = 
"443";
 
  375        ts->http_config = hc;
 
  376        ts->error_recovery = hr;
 
  378        ts->retry_duration = Time::Duration::seconds(5);
 
  384            t->req.uri = 
"/prod/AwsPC";
 
  385            t->req.method = 
"POST";
 
  386            t->ci.type = 
"application/json";
 
  387            t->randomize_resolver_results = 
true;
 
  389            Json::Value root(Json::objectValue);
 
  392            root[
"host"] = Json::Value(openvpn_io::ip::host_name());
 
  394            root[
"productCode"] = Json::Value(pc);
 
  395            root[
"nonce"] = Json::Value(
nonce());
 
  396            const std::string jreq = root.toStyledString();
 
  400            ts->transactions.push_back(std::move(t));
 
  410            self->awspc_query_complete(ts);
 
 
  421            const std::string title = 
"awspc-reply";
 
  434                done(
"expected application/json reply from awspc server");
 
  443                            << root.toStyledString());
 
  450                done(et + 
" : " + em);
 
  457                done(
"awspc request/reply consistency");
 
  475        catch (
const std::exception &e)
 
 
  482                                      const std::string &key)
 const 
 
  497        const std::string title = 
"to-string-sig";
 
  502               + 
'/' + std::to_string(
json::get_int(reply, 
"concurrentConnections", title));
 
 
  507        unsigned char data[16];
 
 
  516            "-----BEGIN CERTIFICATE-----\n" 
  517            "MIIC7TCCAq0CCQCWukjZ5V4aZzAJBgcqhkjOOAQDMFwxCzAJBgNVBAYTAlVTMRkw\n" 
  518            "FwYDVQQIExBXYXNoaW5ndG9uIFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYD\n" 
  519            "VQQKExdBbWF6b24gV2ViIFNlcnZpY2VzIExMQzAeFw0xMjAxMDUxMjU2MTJaFw0z\n" 
  520            "ODAxMDUxMjU2MTJaMFwxCzAJBgNVBAYTAlVTMRkwFwYDVQQIExBXYXNoaW5ndG9u\n" 
  521            "IFN0YXRlMRAwDgYDVQQHEwdTZWF0dGxlMSAwHgYDVQQKExdBbWF6b24gV2ViIFNl\n" 
  522            "cnZpY2VzIExMQzCCAbcwggEsBgcqhkjOOAQBMIIBHwKBgQCjkvcS2bb1VQ4yt/5e\n" 
  523            "ih5OO6kK/n1Lzllr7D8ZwtQP8fOEpp5E2ng+D6Ud1Z1gYipr58Kj3nssSNpI6bX3\n" 
  524            "VyIQzK7wLclnd/YozqNNmgIyZecN7EglK9ITHJLP+x8FtUpt3QbyYXJdmVMegN6P\n" 
  525            "hviYt5JH/nYl4hh3Pa1HJdskgQIVALVJ3ER11+Ko4tP6nwvHwh6+ERYRAoGBAI1j\n" 
  526            "k+tkqMVHuAFcvAGKocTgsjJem6/5qomzJuKDmbJNu9Qxw3rAotXau8Qe+MBcJl/U\n" 
  527            "hhy1KHVpCGl9fueQ2s6IL0CaO/buycU1CiYQk40KNHCcHfNiZbdlx1E9rpUp7bnF\n" 
  528            "lRa2v1ntMX3caRVDdbtPEWmdxSCYsYFDk4mZrOLBA4GEAAKBgEbmeve5f8LIE/Gf\n" 
  529            "MNmP9CM5eovQOGx5ho8WqD+aTebs+k2tn92BBPqeZqpWRa5P/+jrdKml1qx4llHW\n" 
  530            "MXrs3IgIb6+hUIB+S8dz8/mmO0bpr76RoZVCXYab2CZedFut7qc3WUH9+EUAH5mw\n" 
  531            "vSeDCOUMYQR7R9LINYwouHIziqQYMAkGByqGSM44BAMDLwAwLAIUWXBlk40xTwSw\n" 
  532            "7HX32MxXYruse9ACFBNGmdX2ZBrVNGrN9N2f6ROk0k9K\n" 
  533            "-----END CERTIFICATE-----\n");
 
 
  541            "-----BEGIN CERTIFICATE-----\n" 
  542            "MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT\n" 
  543            "B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu\n" 
  544            "MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\n" 
  545            "MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\n" 
  546            "b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G\n" 
  547            "A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\n" 
  548            "hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq\n" 
  549            "9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD\n" 
  550            "+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd\n" 
  551            "fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl\n" 
  552            "NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC\n" 
  553            "MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9\n" 
  554            "BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac\n" 
  555            "vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r\n" 
  556            "5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV\n" 
  557            "N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO\n" 
  558            "LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1\n" 
  559            "-----END CERTIFICATE-----\n");
 
 
  566            "-----BEGIN CERTIFICATE-----\n" 
  567            "MIIDSDCCAjCgAwIBAgIQYadxADonNbu3mPeXR0yYVTANBgkqhkiG9w0BAQsFADAW\n" 
  568            "MRQwEgYDVQQDEwtBV1MgUEMgUm9vdDAeFw0xNjAzMDExOTU2NTZaFw0yNjAyMjcx\n" 
  569            "OTU2NTZaMBAxDjAMBgNVBAMTBWF3c3BjMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" 
  570            "MIIBCgKCAQEA0ggZoYroOMwDHKCngVOdUKiF6y65LDWmbAwZVqwVI7WYpvOELV34\n" 
  571            "04ZYtSqPq6IoGFuH6zl0P5rCi674T0oBPSUTmlLwLks+1zrGznboApkr67Mf2dCd\n" 
  572            "snlyaNPuwrjWHJBa6Pi9dv/YMoJgDxOxk9mslAlcl5xOFgXbfSj1pAA0KVzwwbzz\n" 
  573            "dnznJL67wCnuiAeqBxbkyarfOL414tepsI24kHoAddAVDdhWQ2WkhrT/vK2IRdGZ\n" 
  574            "kU5hAAz/qPKkJxebw5uc+cL2TBii2r0Hvg7tEXI9eIEWeoghftsE5YEuaQHP4EVL\n" 
  575            "JU+21OQzz0lT9L2rrvffTR7cF89Nbn2KMQIDAQABo4GXMIGUMAkGA1UdEwQCMAAw\n" 
  576            "HQYDVR0OBBYEFAMy6uiElCGZVP/wwJeqvXL7QHTSMEYGA1UdIwQ/MD2AFLDKS6Dk\n" 
  577            "NtTpQoOPxJi+DRS+GD2CoRqkGDAWMRQwEgYDVQQDEwtBV1MgUEMgUm9vdIIJAOu5\n" 
  578            "NqrIe040MBMGA1UdJQQMMAoGCCsGAQUFBwMCMAsGA1UdDwQEAwIHgDANBgkqhkiG\n" 
  579            "9w0BAQsFAAOCAQEAsFhhC9wwybTS2yTYiStATbxHWqnHJRrbMBpqX8FJweS1MM/j\n" 
  580            "pwr1suTllwTHpqXpqgN6SDzdeG2ZKx8pvJr/dlmD9e+cHguIMTo6TcqPv1MPl3MZ\n" 
  581            "ugOmDPlgmFYwAWBwzujiGR9bgdGfzw+94KK06iO8MrFLtkz9EbeoJol68mi98CEz\n" 
  582            "kmOb2BM6tVzkvB9fIYyNkW66ZJs2gXwb6RZTyE9HMMGR67nWKYo9SxpB6f+6hlyU\n" 
  583            "q7ptxP2Rwmz0u1pRaZdfHmJFOJnPniB7UmMx/t3ftqYWYDXuobr3LVvg7+33WUk0\n" 
  584            "HfSdbAEkzzC82UTHj0xVH/uZZt8ORChRxuIWZQ==\n" 
  585            "-----END CERTIFICATE-----\n");
 
 
 
PCQuery(WS::ClientSet::Ptr cs_arg, const std::string &role_for_credentials_arg, const std::string &certs_dir_arg)
OPENVPN_EXCEPTION(awspc_query_error)
void token_query_complete(WS::ClientSet::TransactionSet <s)
const bool lookup_product_code
static std::string awspc_signing_cert()
static std::string awscert()
void done(std::string error)
bool awspc_req_verify_consistency(const Json::Value &reply, const std::string &key) const
PCQuery(WS::ClientSet::Ptr cs_arg, const bool lookup_product_code_arg, const int debug_level_arg)
void queue_pc_validation(const std::string &pc)
void local_query_complete(WS::ClientSet::TransactionSet <s)
std::string nonce() const
std::function< void(Info info)> completion
void awspc_query_complete(WS::ClientSet::TransactionSet &ats)
static std::string to_string_sig(const Json::Value &reply)
bool awspc_req_verify_consistency(const Json::Value &reply) const
void start(std::function< void(Info info)> completion_arg)
std::string role_for_credentials
static std::string awspc_web_cert()
WS::ClientSet::TransactionSet::Ptr prepare_transaction_set()
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
void rand_fill(T &obj)
Fill a data object with random bytes.
#define OPENVPN_LOG(args)
void verify(const OpenSSLPKI::X509 &cert, const std::string &sig, const std::string &data, const std::string &digest)
void verify_pkcs7(const std::list< OpenSSLPKI::X509 > &certs, const std::string &sig, const std::string &data)
int get_int(const Json::Value &root, const NAME &name, const TITLE &title)
bool exists(const Json::Value &root, const NAME &name)
std::string get_string_optional(const Json::Value &root, const NAME &name, const std::string &default_value, const TITLE &title)
Json::Value parse(const std::string &str, const TITLE &title)
std::string get_string(const Json::Value &root, const NAME &name, const TITLE &title)
Frame::Ptr frame_init_simple(const size_t payload)
std::string read_text(const std::string &filename, const std::uint64_t max_size=0)
bool enum_dir(const std::string &dirname, F func)
std::string render_hex(const unsigned char *data, size_t size, const bool caps=false)
BufferPtr buf_from_string(const std::string &str)
std::string to_string() const
int concurrentConnections
bool instance_data_defined() const
std::string to_string() const
bool request_status_success() const
std::string format_status(const TransactionSet &ts) const