{"action":"created","comment":{"url":"https://api.github.com/repos/openssl/openssl/pulls/comments/41740298","id":41740298,"diff_hunk":"@@ -0,0 +1,330 @@\n+/* engines/e_dasync.c */\n+/*\n+ * Written by Matt Caswell (matt@openssl.org) for the OpenSSL project.\n+ */\n+/* ====================================================================\n+ * Copyright (c) 2015 The OpenSSL Project.  All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or without\n+ * modification, are permitted provided that the following conditions\n+ * are met:\n+ *\n+ * 1. Redistributions of source code must retain the above copyright\n+ *    notice, this list of conditions and the following disclaimer.\n+ *\n+ * 2. Redistributions in binary form must reproduce the above copyright\n+ *    notice, this list of conditions and the following disclaimer in\n+ *    the documentation and/or other materials provided with the\n+ *    distribution.\n+ *\n+ * 3. All advertising materials mentioning features or use of this\n+ *    software must display the following acknowledgment:\n+ *    \"This product includes software developed by the OpenSSL Project\n+ *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)\"\n+ *\n+ * 4. The names \"OpenSSL Toolkit\" and \"OpenSSL Project\" must not be used to\n+ *    endorse or promote products derived from this software without\n+ *    prior written permission. For written permission, please contact\n+ *    licensing@OpenSSL.org.\n+ *\n+ * 5. Products derived from this software may not be called \"OpenSSL\"\n+ *    nor may \"OpenSSL\" appear in their names without prior written\n+ *    permission of the OpenSSL Project.\n+ *\n+ * 6. Redistributions of any form whatsoever must retain the following\n+ *    acknowledgment:\n+ *    \"This product includes software developed by the OpenSSL Project\n+ *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)\"\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY\n+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR\n+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n+ * OF THE POSSIBILITY OF SUCH DAMAGE.\n+ * ====================================================================\n+ */\n+\n+#include <stdio.h>\n+#include <string.h>\n+\n+#include <openssl/engine.h>\n+#include <openssl/sha.h>\n+#include <openssl/rsa.h>\n+#include <openssl/evp.h>\n+#include <openssl/async.h>\n+#include <openssl/bn.h>\n+\n+#define DASYNC_LIB_NAME \"DASYNC\"\n+#include \"e_dasync_err.c\"\n+\n+/* Engine Id and Name */\n+static const char *engine_dasync_id = \"dasync\";\n+static const char *engine_dasync_name = \"Dummy Async engine support\";\n+\n+\n+/* Engine Lifetime functions */\n+static int dasync_destroy(ENGINE *e);\n+static int dasync_init(ENGINE *e);\n+static int dasync_finish(ENGINE *e);\n+void ENGINE_load_dasync(void);\n+\n+\n+/* Set up digests. Just SHA1 for now */\n+static int dasync_digests(ENGINE *e, const EVP_MD **digest,\n+                          const int **nids, int nid);\n+\n+static int dasync_digest_nids[] = { NID_sha1, 0 };\n+\n+static void dummy_pause_job(void);\n+\n+/* SHA1 */\n+static int dasync_sha1_init(EVP_MD_CTX *ctx);\n+static int dasync_sha1_update(EVP_MD_CTX *ctx, const void *data,\n+                             unsigned long count);\n+static int dasync_sha1_final(EVP_MD_CTX *ctx, unsigned char *md);\n+\n+static const EVP_MD dasync_sha1 = {\n+    NID_sha1,\n+    NID_sha1WithRSAEncryption,\n+    SHA_DIGEST_LENGTH,\n+    EVP_MD_FLAG_PKEY_METHOD_SIGNATURE | EVP_MD_FLAG_DIGALGID_ABSENT,\n+    dasync_sha1_init,\n+    dasync_sha1_update,\n+    dasync_sha1_final,\n+    NULL,\n+    NULL,\n+    EVP_PKEY_NULL_method,\n+    SHA_CBLOCK,\n+    sizeof(EVP_MD *) + sizeof(SHA_CTX),\n+};\n+\n+/* RSA */\n+\n+static int dasync_pub_enc(int flen, const unsigned char *from,\n+                    unsigned char *to, RSA *rsa, int padding);\n+static int dasync_pub_dec(int flen, const unsigned char *from,\n+                    unsigned char *to, RSA *rsa, int padding);\n+static int dasync_rsa_priv_enc(int flen, const unsigned char *from,\n+                      unsigned char *to, RSA *rsa, int padding);\n+static int dasync_rsa_priv_dec(int flen, const unsigned char *from,\n+                      unsigned char *to, RSA *rsa, int padding);\n+static int dasync_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa,\n+                              BN_CTX *ctx);\n+\n+static int dasync_rsa_init(RSA *rsa);\n+static int dasync_rsa_finish(RSA *rsa);\n+\n+static RSA_METHOD dasync_rsa_method = {\n+    \"Dummy Async RSA method\",\n+    dasync_pub_enc,             /* pub_enc */\n+    dasync_pub_dec,             /* pub_dec */\n+    dasync_rsa_priv_enc,        /* priv_enc */\n+    dasync_rsa_priv_dec,        /* priv_dec */\n+    dasync_rsa_mod_exp,         /* rsa_mod_exp */\n+    BN_mod_exp_mont,            /* bn_mod_exp */\n+    dasync_rsa_init,            /* init */\n+    dasync_rsa_finish,          /* finish */\n+    0,                          /* flags */\n+    NULL,                       /* app_data */\n+    0,                          /* rsa_sign */\n+    0,                          /* rsa_verify */\n+    NULL                        /* rsa_keygen */\n+};\n+\n+\n+static int bind_dasync(ENGINE *e)\n+{\n+    /* Ensure the dasync error handling is set up */\n+    ERR_load_DASYNC_strings();\n+\n+    if (!ENGINE_set_id(e, engine_dasync_id)\n+        || !ENGINE_set_name(e, engine_dasync_name)\n+        || !ENGINE_set_RSA(e, &dasync_rsa_method)\n+        || !ENGINE_set_digests(e, dasync_digests)\n+        || !ENGINE_set_destroy_function(e, dasync_destroy)\n+        || !ENGINE_set_init_function(e, dasync_init)\n+        || !ENGINE_set_finish_function(e, dasync_finish)) {\n+        DASYNCerr(DASYNC_F_BIND_DASYNC, DASYNC_R_INIT_FAILED);\n+        return 0;\n+    }\n+\n+    return 1;\n+}\n+\n+# ifndef OPENSSL_NO_DYNAMIC_ENGINE\n+static int bind_helper(ENGINE *e, const char *id)\n+{\n+    if (id && (strcmp(id, engine_dasync_id) != 0))\n+        return 0;\n+    if (!bind_dasync(e))\n+        return 0;\n+    return 1;\n+}\n+\n+IMPLEMENT_DYNAMIC_CHECK_FN()\n+    IMPLEMENT_DYNAMIC_BIND_FN(bind_helper)\n+# endif\n+\n+static ENGINE *engine_dasync(void)\n+{\n+    ENGINE *ret = ENGINE_new();\n+    if (!ret)\n+        return NULL;\n+    if (!bind_dasync(ret)) {\n+        ENGINE_free(ret);\n+        return NULL;\n+    }\n+    return ret;\n+}\n+\n+void ENGINE_load_dasync(void)\n+{\n+    ENGINE *toadd = engine_dasync();\n+    if (!toadd)\n+        return;\n+    ENGINE_add(toadd);\n+    ENGINE_free(toadd);\n+    ERR_clear_error();\n+}\n+\n+static int dasync_init(ENGINE *e)\n+{\n+    return 1;\n+}\n+\n+\n+static int dasync_finish(ENGINE *e)\n+{\n+    return 1;\n+}\n+\n+\n+static int dasync_destroy(ENGINE *e)\n+{\n+    ERR_unload_DASYNC_strings();\n+    return 1;\n+}\n+\n+static int dasync_digests(ENGINE *e, const EVP_MD **digest,\n+                          const int **nids, int nid)\n+{\n+    int ok = 1;\n+    if (!digest) {\n+        /* We are returning a list of supported nids */\n+        *nids = dasync_digest_nids;\n+        return (sizeof(dasync_digest_nids) -\n+                1) / sizeof(dasync_digest_nids[0]);\n+    }\n+    /* We are being asked for a specific digest */\n+    switch (nid) {\n+    case NID_sha1:\n+        *digest = &dasync_sha1;\n+        break;\n+    default:\n+        ok = 0;\n+        *digest = NULL;\n+        break;\n+    }\n+    return ok;\n+}\n+\n+static void dummy_pause_job(void) {\n+    ASYNC_JOB *job;\n+\n+    if ((job = ASYNC_get_current_job()) == NULL)\n+        return;\n+\n+    /*\n+     * In the Dummy async engine we are cheating. We signal that the job\n+     * is complete by waking it before the call to ASYNC_pause_job(). A real\n+     * async engine would only wake when the job was actually complete\n+     */\n+    ASYNC_wake(job);\n+\n+    /* Ignore errors - we carry on anyway */\n+    ASYNC_pause_job();\n+\n+    ASYNC_clear_wake(job);\n+}\n+\n+\n+/*\n+ * SHA1 implementation. At the moment we just defer to the standard\n+ * implementation\n+ */\n+#undef data\n+#define data(ctx) ((SHA_CTX *)(ctx)->md_data)\n+static int dasync_sha1_init(EVP_MD_CTX *ctx)\n+{\n+    dummy_pause_job();\n+\n+    return SHA1_Init(data(ctx));\n+}\n+\n+static int dasync_sha1_update(EVP_MD_CTX *ctx, const void *data,\n+                             unsigned long count)\n+{\n+    dummy_pause_job();\n+\n+    return SHA1_Update(data(ctx), data, (size_t)count);\n+}\n+\n+static int dasync_sha1_final(EVP_MD_CTX *ctx, unsigned char *md)\n+{\n+    dummy_pause_job();\n+\n+    return SHA1_Final(md, data(ctx));\n+}\n+\n+/*\n+ * RSA implementation\n+ */\n+\n+static int dasync_pub_enc(int flen, const unsigned char *from,\n+                    unsigned char *to, RSA *rsa, int padding) {\n+    dummy_pause_job();\n+    return RSA_PKCS1_SSLeay()->rsa_pub_enc(flen, from, to, rsa, padding);\n+}\n+\n+static int dasync_pub_dec(int flen, const unsigned char *from,\n+                    unsigned char *to, RSA *rsa, int padding) {\n+    dummy_pause_job();\n+    return RSA_PKCS1_SSLeay()->rsa_pub_dec(flen, from, to, rsa, padding);\n+}\n+\n+static int dasync_rsa_priv_enc(int flen, const unsigned char *from,\n+                      unsigned char *to, RSA *rsa, int padding)\n+{\n+    dummy_pause_job();\n+    return RSA_PKCS1_SSLeay()->rsa_priv_enc(flen, from, to, rsa, padding);\n+}\n+\n+static int dasync_rsa_priv_dec(int flen, const unsigned char *from,\n+                      unsigned char *to, RSA *rsa, int padding)\n+{\n+    /* Ignore errors - we carry on anyway */\n+    ASYNC_pause_job();","path":"engines/e_dasync.c","position":313,"original_position":313,"commit_id":"378097710418abeec1a11c1ea56cb09d57af40d2","original_commit_id":"378097710418abeec1a11c1ea56cb09d57af40d2","user":{"login":"stevelinsell","id":15036083,"avatar_url":"https://avatars.githubusercontent.com/u/15036083?v=3","gravatar_id":"","url":"https://api.github.com/users/stevelinsell","html_url":"https://github.com/stevelinsell","followers_url":"https://api.github.com/users/stevelinsell/followers","following_url":"https://api.github.com/users/stevelinsell/following{/other_user}","gists_url":"https://api.github.com/users/stevelinsell/gists{/gist_id}","starred_url":"https://api.github.com/users/stevelinsell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevelinsell/subscriptions","organizations_url":"https://api.github.com/users/stevelinsell/orgs","repos_url":"https://api.github.com/users/stevelinsell/repos","events_url":"https://api.github.com/users/stevelinsell/events{/privacy}","received_events_url":"https://api.github.com/users/stevelinsell/received_events","type":"User","site_admin":false},"body":"Is there a reason why this particular function has not been moved to use dummy_pause_job() like the others in dasync engine? Sorry for flagging this late, just spotted it while looking at something else!","created_at":"2015-10-12T09:52:25Z","updated_at":"2015-10-12T09:52:25Z","html_url":"https://github.com/openssl/openssl/pull/433#discussion_r41740298","pull_request_url":"https://api.github.com/repos/openssl/openssl/pulls/433","_links":{"self":{"href":"https://api.github.com/repos/openssl/openssl/pulls/comments/41740298"},"html":{"href":"https://github.com/openssl/openssl/pull/433#discussion_r41740298"},"pull_request":{"href":"https://api.github.com/repos/openssl/openssl/pulls/433"}}},"pull_request":{"url":"https://api.github.com/repos/openssl/openssl/pulls/433","id":47006243,"html_url":"https://github.com/openssl/openssl/pull/433","diff_url":"https://github.com/openssl/openssl/pull/433.diff","patch_url":"https://github.com/openssl/openssl/pull/433.patch","issue_url":"https://api.github.com/repos/openssl/openssl/issues/433","number":433,"state":"open","locked":false,"title":"Add ASYNC support","user":{"login":"mattcaswell","id":7422273,"avatar_url":"https://avatars.githubusercontent.com/u/7422273?v=3","gravatar_id":"","url":"https://api.github.com/users/mattcaswell","html_url":"https://github.com/mattcaswell","followers_url":"https://api.github.com/users/mattcaswell/followers","following_url":"https://api.github.com/users/mattcaswell/following{/other_user}","gists_url":"https://api.github.com/users/mattcaswell/gists{/gist_id}","starred_url":"https://api.github.com/users/mattcaswell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattcaswell/subscriptions","organizations_url":"https://api.github.com/users/mattcaswell/orgs","repos_url":"https://api.github.com/users/mattcaswell/repos","events_url":"https://api.github.com/users/mattcaswell/events{/privacy}","received_events_url":"https://api.github.com/users/mattcaswell/received_events","type":"User","site_admin":false},"body":"Add support for performing crypto operations asynchronously - as per my post to openssl-dev@openssl.org.","created_at":"2015-10-07T09:45:22Z","updated_at":"2015-10-12T09:52:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"00578b76666ca8f2e128d4188f3ab9edbe377d0a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/openssl/openssl/pulls/433/commits","review_comments_url":"https://api.github.com/repos/openssl/openssl/pulls/433/comments","review_comment_url":"https://api.github.com/repos/openssl/openssl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openssl/openssl/issues/433/comments","statuses_url":"https://api.github.com/repos/openssl/openssl/statuses/378097710418abeec1a11c1ea56cb09d57af40d2","head":{"label":"mattcaswell:main-async","ref":"main-async","sha":"378097710418abeec1a11c1ea56cb09d57af40d2","user":{"login":"mattcaswell","id":7422273,"avatar_url":"https://avatars.githubusercontent.com/u/7422273?v=3","gravatar_id":"","url":"https://api.github.com/users/mattcaswell","html_url":"https://github.com/mattcaswell","followers_url":"https://api.github.com/users/mattcaswell/followers","following_url":"https://api.github.com/users/mattcaswell/following{/other_user}","gists_url":"https://api.github.com/users/mattcaswell/gists{/gist_id}","starred_url":"https://api.github.com/users/mattcaswell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattcaswell/subscriptions","organizations_url":"https://api.github.com/users/mattcaswell/orgs","repos_url":"https://api.github.com/users/mattcaswell/repos","events_url":"https://api.github.com/users/mattcaswell/events{/privacy}","received_events_url":"https://api.github.com/users/mattcaswell/received_events","type":"User","site_admin":false},"repo":{"id":26978010,"name":"openssl","full_name":"mattcaswell/openssl","owner":{"login":"mattcaswell","id":7422273,"avatar_url":"https://avatars.githubusercontent.com/u/7422273?v=3","gravatar_id":"","url":"https://api.github.com/users/mattcaswell","html_url":"https://github.com/mattcaswell","followers_url":"https://api.github.com/users/mattcaswell/followers","following_url":"https://api.github.com/users/mattcaswell/following{/other_user}","gists_url":"https://api.github.com/users/mattcaswell/gists{/gist_id}","starred_url":"https://api.github.com/users/mattcaswell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattcaswell/subscriptions","organizations_url":"https://api.github.com/users/mattcaswell/orgs","repos_url":"https://api.github.com/users/mattcaswell/repos","events_url":"https://api.github.com/users/mattcaswell/events{/privacy}","received_events_url":"https://api.github.com/users/mattcaswell/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mattcaswell/openssl","description":"","fork":true,"url":"https://api.github.com/repos/mattcaswell/openssl","forks_url":"https://api.github.com/repos/mattcaswell/openssl/forks","keys_url":"https://api.github.com/repos/mattcaswell/openssl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mattcaswell/openssl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mattcaswell/openssl/teams","hooks_url":"https://api.github.com/repos/mattcaswell/openssl/hooks","issue_events_url":"https://api.github.com/repos/mattcaswell/openssl/issues/events{/number}","events_url":"https://api.github.com/repos/mattcaswell/openssl/events","assignees_url":"https://api.github.com/repos/mattcaswell/openssl/assignees{/user}","branches_url":"https://api.github.com/repos/mattcaswell/openssl/branches{/branch}","tags_url":"https://api.github.com/repos/mattcaswell/openssl/tags","blobs_url":"https://api.github.com/repos/mattcaswell/openssl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mattcaswell/openssl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mattcaswell/openssl/git/refs{/sha}","trees_url":"https://api.github.com/repos/mattcaswell/openssl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mattcaswell/openssl/statuses/{sha}","languages_url":"https://api.github.com/repos/mattcaswell/openssl/languages","stargazers_url":"https://api.github.com/repos/mattcaswell/openssl/stargazers","contributors_url":"https://api.github.com/repos/mattcaswell/openssl/contributors","subscribers_url":"https://api.github.com/repos/mattcaswell/openssl/subscribers","subscription_url":"https://api.github.com/repos/mattcaswell/openssl/subscription","commits_url":"https://api.github.com/repos/mattcaswell/openssl/commits{/sha}","git_commits_url":"https://api.github.com/repos/mattcaswell/openssl/git/commits{/sha}","comments_url":"https://api.github.com/repos/mattcaswell/openssl/comments{/number}","issue_comment_url":"https://api.github.com/repos/mattcaswell/openssl/issues/comments{/number}","contents_url":"https://api.github.com/repos/mattcaswell/openssl/contents/{+path}","compare_url":"https://api.github.com/repos/mattcaswell/openssl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mattcaswell/openssl/merges","archive_url":"https://api.github.com/repos/mattcaswell/openssl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mattcaswell/openssl/downloads","issues_url":"https://api.github.com/repos/mattcaswell/openssl/issues{/number}","pulls_url":"https://api.github.com/repos/mattcaswell/openssl/pulls{/number}","milestones_url":"https://api.github.com/repos/mattcaswell/openssl/milestones{/number}","notifications_url":"https://api.github.com/repos/mattcaswell/openssl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mattcaswell/openssl/labels{/name}","releases_url":"https://api.github.com/repos/mattcaswell/openssl/releases{/id}","created_at":"2014-11-21T21:09:59Z","updated_at":"2015-10-07T10:21:06Z","pushed_at":"2015-10-11T16:02:48Z","git_url":"git://github.com/mattcaswell/openssl.git","ssh_url":"git@github.com:mattcaswell/openssl.git","clone_url":"https://github.com/mattcaswell/openssl.git","svn_url":"https://github.com/mattcaswell/openssl","homepage":null,"size":69731,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"openssl:master","ref":"master","sha":"71a64af3312d4dfdff2597a979868d2bdd7e3642","user":{"login":"openssl","id":3279138,"avatar_url":"https://avatars.githubusercontent.com/u/3279138?v=3","gravatar_id":"","url":"https://api.github.com/users/openssl","html_url":"https://github.com/openssl","followers_url":"https://api.github.com/users/openssl/followers","following_url":"https://api.github.com/users/openssl/following{/other_user}","gists_url":"https://api.github.com/users/openssl/gists{/gist_id}","starred_url":"https://api.github.com/users/openssl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openssl/subscriptions","organizations_url":"https://api.github.com/users/openssl/orgs","repos_url":"https://api.github.com/users/openssl/repos","events_url":"https://api.github.com/users/openssl/events{/privacy}","received_events_url":"https://api.github.com/users/openssl/received_events","type":"Organization","site_admin":false},"repo":{"id":7634677,"name":"openssl","full_name":"openssl/openssl","owner":{"login":"openssl","id":3279138,"avatar_url":"https://avatars.githubusercontent.com/u/3279138?v=3","gravatar_id":"","url":"https://api.github.com/users/openssl","html_url":"https://github.com/openssl","followers_url":"https://api.github.com/users/openssl/followers","following_url":"https://api.github.com/users/openssl/following{/other_user}","gists_url":"https://api.github.com/users/openssl/gists{/gist_id}","starred_url":"https://api.github.com/users/openssl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openssl/subscriptions","organizations_url":"https://api.github.com/users/openssl/orgs","repos_url":"https://api.github.com/users/openssl/repos","events_url":"https://api.github.com/users/openssl/events{/privacy}","received_events_url":"https://api.github.com/users/openssl/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openssl/openssl","description":"","fork":false,"url":"https://api.github.com/repos/openssl/openssl","forks_url":"https://api.github.com/repos/openssl/openssl/forks","keys_url":"https://api.github.com/repos/openssl/openssl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openssl/openssl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openssl/openssl/teams","hooks_url":"https://api.github.com/repos/openssl/openssl/hooks","issue_events_url":"https://api.github.com/repos/openssl/openssl/issues/events{/number}","events_url":"https://api.github.com/repos/openssl/openssl/events","assignees_url":"https://api.github.com/repos/openssl/openssl/assignees{/user}","branches_url":"https://api.github.com/repos/openssl/openssl/branches{/branch}","tags_url":"https://api.github.com/repos/openssl/openssl/tags","blobs_url":"https://api.github.com/repos/openssl/openssl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openssl/openssl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openssl/openssl/git/refs{/sha}","trees_url":"https://api.github.com/repos/openssl/openssl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openssl/openssl/statuses/{sha}","languages_url":"https://api.github.com/repos/openssl/openssl/languages","stargazers_url":"https://api.github.com/repos/openssl/openssl/stargazers","contributors_url":"https://api.github.com/repos/openssl/openssl/contributors","subscribers_url":"https://api.github.com/repos/openssl/openssl/subscribers","subscription_url":"https://api.github.com/repos/openssl/openssl/subscription","commits_url":"https://api.github.com/repos/openssl/openssl/commits{/sha}","git_commits_url":"https://api.github.com/repos/openssl/openssl/git/commits{/sha}","comments_url":"https://api.github.com/repos/openssl/openssl/comments{/number}","issue_comment_url":"https://api.github.com/repos/openssl/openssl/issues/comments{/number}","contents_url":"https://api.github.com/repos/openssl/openssl/contents/{+path}","compare_url":"https://api.github.com/repos/openssl/openssl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openssl/openssl/merges","archive_url":"https://api.github.com/repos/openssl/openssl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openssl/openssl/downloads","issues_url":"https://api.github.com/repos/openssl/openssl/issues{/number}","pulls_url":"https://api.github.com/repos/openssl/openssl/pulls{/number}","milestones_url":"https://api.github.com/repos/openssl/openssl/milestones{/number}","notifications_url":"https://api.github.com/repos/openssl/openssl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openssl/openssl/labels{/name}","releases_url":"https://api.github.com/repos/openssl/openssl/releases{/id}","created_at":"2013-01-15T22:34:48Z","updated_at":"2015-10-12T01:08:43Z","pushed_at":"2015-10-11T19:38:30Z","git_url":"git://github.com/openssl/openssl.git","ssh_url":"git@github.com:openssl/openssl.git","clone_url":"https://github.com/openssl/openssl.git","svn_url":"https://github.com/openssl/openssl","homepage":null,"size":104919,"stargazers_count":1500,"watchers_count":1500,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":922,"mirror_url":null,"open_issues_count":138,"forks":922,"open_issues":138,"watchers":1500,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openssl/openssl/pulls/433"},"html":{"href":"https://github.com/openssl/openssl/pull/433"},"issue":{"href":"https://api.github.com/repos/openssl/openssl/issues/433"},"comments":{"href":"https://api.github.com/repos/openssl/openssl/issues/433/comments"},"review_comments":{"href":"https://api.github.com/repos/openssl/openssl/pulls/433/comments"},"review_comment":{"href":"https://api.github.com/repos/openssl/openssl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openssl/openssl/pulls/433/commits"},"statuses":{"href":"https://api.github.com/repos/openssl/openssl/statuses/378097710418abeec1a11c1ea56cb09d57af40d2"}}}}