{"action":"created","comment":{"url":"https://api.github.com/repos/openssl/openssl/pulls/comments/202514225","pull_request_review_id":137237449,"id":202514225,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMjUxNDIyNQ==","diff_hunk":"@@ -737,4 +680,275 @@ int ec_GF2m_simple_field_div(const EC_GROUP *group, BIGNUM *r,\n     return BN_GF2m_mod_div(r, a, b, group->field, ctx);\n }\n \n+/*-\n+ * Lopez-Dahab ladder, pre step.\n+ * See e.g. \"Guide to ECC\" Alg 3.40.\n+ * Modified to blind s and r independently.\n+ * s:= p, r := 2p\n+ */\n+static\n+int ec_GF2m_simple_ladder_pre(const EC_GROUP *group,\n+                              EC_POINT *r, EC_POINT *s,\n+                              EC_POINT *p, BN_CTX *ctx)\n+{\n+    /* if p is not affine, something is wrong */\n+    if (p->Z_is_one == 0)\n+        return 0;\n+\n+    /* s blinding: make sure lambda (s->Z here) is not zero */\n+    do {\n+        if (!BN_priv_rand(s->Z, BN_num_bits(group->field) - 1,\n+                          BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) {\n+            ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_PRE, ERR_R_BN_LIB);\n+            return 0;\n+        }\n+    } while (BN_is_zero(s->Z));\n+\n+    /* if field_encode defined convert between representations */\n+    if ((group->meth->field_encode != NULL\n+         && !group->meth->field_encode(group, s->Z, s->Z, ctx))\n+        || !group->meth->field_mul(group, s->X, p->X, s->Z, ctx))\n+        return 0;\n+\n+    /* r blinding: make sure lambda (r->Y here for storage) is not zero */\n+    do {\n+        if (!BN_priv_rand(r->Y, BN_num_bits(group->field) - 1,\n+                          BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) {\n+            ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_PRE, ERR_R_BN_LIB);\n+            return 0;\n+        }\n+    } while (BN_is_zero(r->Y));\n+\n+    if ((group->meth->field_encode != NULL\n+         && !group->meth->field_encode(group, r->Y, r->Y, ctx))\n+        || !group->meth->field_sqr(group, r->Z, p->X, ctx)\n+        || !group->meth->field_sqr(group, r->X, r->Z, ctx)\n+        || !BN_GF2m_add(r->X, r->X, group->b)\n+        || !group->meth->field_mul(group, r->Z, r->Z, r->Y, ctx)\n+        || !group->meth->field_mul(group, r->X, r->X, r->Y, ctx))\n+        return 0;\n+\n+    s->Z_is_one = 0;\n+    r->Z_is_one = 0;\n+\n+    return 1;\n+}\n+\n+/*-\n+ * Ladder step: differential addition-and-doubling, mixed Lopez-Dahab coords.\n+ * http://www.hyperelliptic.org/EFD/g12o/auto-code/shortw/xz/ladder/mladd-2003-s.op3\n+ * s := r + s, r := 2r\n+ */\n+static\n+int ec_GF2m_simple_ladder_step(const EC_GROUP *group,\n+                               EC_POINT *r, EC_POINT *s,\n+                               EC_POINT *p, BN_CTX *ctx)\n+{\n+    if (!group->meth->field_mul(group, r->Y, r->Z, s->X, ctx)\n+        || !group->meth->field_mul(group, s->X, r->X, s->Z, ctx)\n+        || !group->meth->field_sqr(group, s->Y, r->Z, ctx)\n+        || !group->meth->field_sqr(group, r->Z, r->X, ctx)\n+        || !BN_GF2m_add(s->Z, r->Y, s->X)\n+        || !group->meth->field_sqr(group, s->Z, s->Z, ctx)\n+        || !group->meth->field_mul(group, s->X, r->Y, s->X, ctx)\n+        || !group->meth->field_mul(group, r->Y, s->Z, p->X, ctx)\n+        || !BN_GF2m_add(s->X, s->X, r->Y)\n+        || !group->meth->field_sqr(group, r->Y, r->Z, ctx)\n+        || !group->meth->field_mul(group, r->Z, r->Z, s->Y, ctx)\n+        || !group->meth->field_sqr(group, s->Y, s->Y, ctx)\n+        || !group->meth->field_mul(group, s->Y, s->Y, group->b, ctx)\n+        || !BN_GF2m_add(r->X, r->Y, s->Y))\n+        return 0;\n+\n+    return 1;\n+}\n+\n+/*-\n+ * Recover affine (x,y) result from Lopez-Dahab r and s, affine p.\n+ * See e.g. \"Fast Multiplication on Elliptic Curves over GF(2**m)\n+ * without Precomputation\" (Lopez and Dahab, CHES 1999),\n+ * Appendix Alg Mxy.\n+ */\n+static\n+int ec_GF2m_simple_ladder_post(const EC_GROUP *group,\n+                               EC_POINT *r, EC_POINT *s,\n+                               EC_POINT *p, BN_CTX *ctx)\n+{\n+    int ret = 0;\n+    BIGNUM *t0, *t1, *t2 = NULL;\n+\n+    if (BN_is_zero(r->Z))\n+        return EC_POINT_set_to_infinity(group, r);\n+\n+    if (BN_is_zero(s->Z)) {\n+        if (!EC_POINT_copy(r, p)\n+            || !EC_POINT_invert(group, r, ctx)) {\n+            ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_POST, ERR_R_EC_LIB);\n+            return 0;\n+        }\n+        return 1;\n+    }\n+\n+    BN_CTX_start(ctx);\n+    t0 = BN_CTX_get(ctx);\n+    t1 = BN_CTX_get(ctx);\n+    t2 = BN_CTX_get(ctx);\n+    if (t2 == NULL) {\n+        ECerr(EC_F_EC_GF2M_SIMPLE_LADDER_POST, ERR_R_MALLOC_FAILURE);\n+        goto err;\n+    }\n+\n+    if (!group->meth->field_mul(group, t0, r->Z, s->Z, ctx)\n+        || !group->meth->field_mul(group, t1, p->X, r->Z, ctx)\n+        || !BN_GF2m_add(t1, r->X, t1)\n+        || !group->meth->field_mul(group, t2, p->X, s->Z, ctx)\n+        || !group->meth->field_mul(group, r->Z, r->X, t2, ctx)\n+        || !BN_GF2m_add(t2, t2, s->X)\n+        || !group->meth->field_mul(group, t1, t1, t2, ctx)\n+        || !group->meth->field_sqr(group, t2, p->X, ctx)\n+        || !BN_GF2m_add(t2, p->Y, t2)\n+        || !group->meth->field_mul(group, t2, t2, t0, ctx)\n+        || !BN_GF2m_add(t1, t2, t1)\n+        || !group->meth->field_mul(group, t2, p->X, t0, ctx)\n+        || !BN_GF2m_mod_inv(t2, t2, group->field, ctx)\n+        || !group->meth->field_mul(group, t1, t1, t2, ctx)\n+        || !group->meth->field_mul(group, r->X, r->Z, t2, ctx)\n+        || !BN_GF2m_add(t2, p->X, r->X)\n+        || !group->meth->field_mul(group, t2, t2, t1, ctx)\n+        || !BN_GF2m_add(r->Y, p->Y, t2)\n+        || !BN_one(r->Z))\n+        goto err;\n+\n+    r->Z_is_one = 1;\n+\n+    /* GF(2^m) field elements should always have BIGNUM::neg = 0 */\n+    BN_set_negative(r->X, 0);\n+    BN_set_negative(r->Y, 0);\n+\n+    ret = 1;\n+\n+ err:\n+    BN_CTX_end(ctx);\n+    return ret;\n+}\n+\n+static\n+int ec_GF2m_simple_points_mul(const EC_GROUP *group, EC_POINT *r,\n+                              const BIGNUM *scalar, size_t num,\n+                              const EC_POINT *points[],\n+                              const BIGNUM *scalars[],\n+                              BN_CTX *ctx)\n+{\n+    int ret = 0;\n+    EC_POINT *t = NULL;\n+\n+    /*-\n+     * We limit use of the ladder only to the following cases:\n+     * - r := scalar * G\n+     *   Fixed point mul: scalar != NULL && num == 0;\n+     * - r := scalars[0] * points[0]\n+     *   Variable point mul: scalar == NULL && num == 1;\n+     * - r := scalar * G + scalars[0] * points[0]\n+     *   used, e.g., in ECDSA verification: scalar != NULL && num == 1\n+     *\n+     * In any other case (num > 1) we use the default wNAF implementation.\n+     *\n+     * We also let the default implementation handle degenerate cases like group\n+     * order or cofactor set to 0.\n+     */\n+    if (num > 1 || BN_is_zero(group->order) || BN_is_zero(group->cofactor))\n+        return ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx);","path":"crypto/ec/ec2_smpl.c","position":245,"original_position":245,"commit_id":"99ae74e029a9a1d42d561c2cecbb471f2809c651","original_commit_id":"99ae74e029a9a1d42d561c2cecbb471f2809c651","user":{"login":"dot-asm","id":9038069,"node_id":"MDQ6VXNlcjkwMzgwNjk=","avatar_url":"https://avatars2.githubusercontent.com/u/9038069?v=4","gravatar_id":"","url":"https://api.github.com/users/dot-asm","html_url":"https://github.com/dot-asm","followers_url":"https://api.github.com/users/dot-asm/followers","following_url":"https://api.github.com/users/dot-asm/following{/other_user}","gists_url":"https://api.github.com/users/dot-asm/gists{/gist_id}","starred_url":"https://api.github.com/users/dot-asm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dot-asm/subscriptions","organizations_url":"https://api.github.com/users/dot-asm/orgs","repos_url":"https://api.github.com/users/dot-asm/repos","events_url":"https://api.github.com/users/dot-asm/events{/privacy}","received_events_url":"https://api.github.com/users/dot-asm/received_events","type":"User","site_admin":false},"body":"> the problem with that is that for other implementations ec_scalar_mul_ladder can be slower\r\n\r\nFair enough. Then how about\r\n```\r\nif (scalar == NULL || num != 1 || order == 0 || cofactor == 0)\r\n    return ec_wNAF_mul()\r\n/* scalar != NULL && num == 1 is faster with ec_scalar_mul_ladder here [and now] */\r\n...\r\n```\r\nJust keep in mind that this is side note, so \"how about\" is really just a question, it's not a suggestion. Point is not larger than order != 0 && cofactor !=0 case in ec_wNAF_mul being partial duplicate of the code below this line. [Off topic, this kind of asks for question if ec_wNAF_mul is actually suitable name.]","created_at":"2018-07-14T12:50:26Z","updated_at":"2018-07-14T12:50:26Z","html_url":"https://github.com/openssl/openssl/pull/6690#discussion_r202514225","pull_request_url":"https://api.github.com/repos/openssl/openssl/pulls/6690","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/openssl/openssl/pulls/comments/202514225"},"html":{"href":"https://github.com/openssl/openssl/pull/6690#discussion_r202514225"},"pull_request":{"href":"https://api.github.com/repos/openssl/openssl/pulls/6690"}},"in_reply_to_id":202512042},"pull_request":{"url":"https://api.github.com/repos/openssl/openssl/pulls/6690","id":200516748,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAwNTE2NzQ4","html_url":"https://github.com/openssl/openssl/pull/6690","diff_url":"https://github.com/openssl/openssl/pull/6690.diff","patch_url":"https://github.com/openssl/openssl/pull/6690.patch","issue_url":"https://api.github.com/repos/openssl/openssl/issues/6690","number":6690,"state":"open","locked":false,"title":"EC2m LD ladder","user":{"login":"romen","id":338418,"node_id":"MDQ6VXNlcjMzODQxOA==","avatar_url":"https://avatars3.githubusercontent.com/u/338418?v=4","gravatar_id":"","url":"https://api.github.com/users/romen","html_url":"https://github.com/romen","followers_url":"https://api.github.com/users/romen/followers","following_url":"https://api.github.com/users/romen/following{/other_user}","gists_url":"https://api.github.com/users/romen/gists{/gist_id}","starred_url":"https://api.github.com/users/romen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/romen/subscriptions","organizations_url":"https://api.github.com/users/romen/orgs","repos_url":"https://api.github.com/users/romen/repos","events_url":"https://api.github.com/users/romen/events{/privacy}","received_events_url":"https://api.github.com/users/romen/received_events","type":"User","site_admin":false},"body":"# TL;DR\r\n\r\nPR #6009 and #6070 unified the code path for EC point multiplication for prime and binary curves, introducing several SCA defenses.\r\nFor binary curves the impact on performance of the security improvements was very high (as reported in some GitHub issues, e.g., #6396 ).\r\n\r\nThis PR aims at improving the existing `ec_mul_consttime` (now renamed to a more fitting `ec_scalar_mul_ladder`) function introducing hooks that an `EC_METHOD` could use to provide specialized, and faster, implementations.\r\n\r\nWe then provide such a specialized implementation that applies to binary curves, bringing the performance of cryptosystems built on top of such curves reasonably close to the performance level of `1.1.1-pre3` (before most of the new SCA countermeasures were applied).\r\n\r\nIn most instances (see the detailed table below) the new implementation is more than 10x times faster than current master.\r\n\r\nThe new implementation is still (reasonably) slower than `1.1.1-pre3`, but:\r\n-  latest master includes other changes to the GF2 arithmetic not immediately related to this PR (e.g., 0dae8baf , b336ce57 , ... );\r\n-  latest master includes also other SCA countermeasures which have an impact on performance (see, e.g., #6664 );\r\n-  `1.1.1-pre3` is leaky in, e.g., bit length for keygen and derive;\r\n-  `1.1.1-pre3` has no bug attack or DPA mitigations.\r\n\r\nThis PR only affects binary curves, but the scaffold introduced by the first commit opens the way for improving in a similar way also prime curves, which also suffered a slowdown as a consequence of the recent SCA hardening process, although minor in comparison to the effect on binary curves.\r\n\r\nCo-authored by @sohhas and @bbbrumley .\r\n\r\n# Benchmark table\r\n\r\nThe following table presents the CPU cycles average computed over 1000 runs per operation.\r\n\r\n*The benchmarks were executed on Intel Core i7-6700 CPU, running at 3.40GHz, with Turbo Boost disabled, no frequency scaling and on a single core reserved only for the execution of the benchmark, while the rest of the system was mostly idle.*\r\n\r\n| Curve/Operation  |        `pre3`         |       `master`       |      `LD_ladder`     |     `LD` / `pre3`    |    `LD` / `master`   |\r\n| ---------------- | --------------------: | -------------------: | -------------------: | -------------------: | -------------------: |\r\n|  **sect163r2**   |                       |                      |                      |                      |                      |\r\n| evp_pkey_keygen  |               675 105 |            7 415 437 |              809 969 |                 1.20 |                 0.11 |\r\n| evp_pkey_derive  |               647 086 |            7 396 699 |              791 018 |                 1.22 |                 0.11 |\r\n| evp_digestsign   |               716 298 |            7 586 516 |              914 920 |                 1.28 |                 0.12 |\r\n| evp_digestverify |             1 331 206 |            5 370 424 |            1 638 221 |                 1.23 |                 0.31 |\r\n|  **sect233r1**   |                       |                      |                      |                      |                      |\r\n| evp_pkey_keygen  |               863 484 |           14 307 333 |              980 921 |                 1.14 |                 0.07 |\r\n| evp_pkey_derive  |               835 200 |           14 266 140 |              973 475 |                 1.17 |                 0.07 |\r\n| evp_digestsign   |               944 166 |           14 435 245 |            1 155 727 |                 1.22 |                 0.08 |\r\n| evp_digestverify |             1 736 499 |           10 185 112 |            2 016 280 |                 1.16 |                 0.20 |\r\n|  **sect283r1**   |                       |                      |                      |                      |                      |\r\n| evp_pkey_keygen  |             1 513 133 |           22 023 374 |            1 742 583 |                 1.15 |                 0.08 |\r\n| evp_pkey_derive  |             1 479 988 |           21 978 168 |            1 732 546 |                 1.17 |                 0.08 |\r\n| evp_digestsign   |             1 625 851 |           22 238 791 |            1 972 981 |                 1.21 |                 0.09 |\r\n| evp_digestverify |             3 054 693 |           15 508 890 |            3 592 322 |                 1.18 |                 0.23 |\r\n|  **sect571r1**   |                       |                      |                      |                      |                      |\r\n| evp_pkey_keygen  |             5 601 491 |          106 207 308 |            6 328 737 |                 1.13 |                 0.06 |\r\n| evp_pkey_derive  |             5 525 044 |          106 119 035 |            6 320 248 |                 1.14 |                 0.06 |\r\n| evp_digestsign   |             6 014 458 |          106 691 078 |            7 118 188 |                 1.18 |                 0.07 |\r\n| evp_digestverify |            11 368 181 |           73 156 913 |           13 180 169 |                 1.16 |                 0.18 |\r\n\r\n\r\n# Commits breakout\r\n\r\n## Remove stale SM2 error codes\r\n\r\nRun `make update ERROR_REBUILD=-rebuild` to remove some stale error codes for SM2 (which is now using its own submodule for error codes, i.e., `SM2_*`).\r\n\r\nI filtered out copyright bumps for other unmodified headers.\r\n\r\n## EC point multiplication: add `ladder` scaffold for specialized Montgomery ladder implementations\r\n\r\nPR #6009 and #6070 replaced the default EC point multiplication path for prime and binary curves with a unified Montgomery ladder implementation with various timing attack defenses (for the common paths when a secret scalar is feed to the point multiplication).\r\nThe newly introduced default implementation directly used `EC_POINT_add`/`dbl` in the main loop.\r\n\r\nThe scaffolding introduced by this commit allows `EC_METHOD`s to define a specialized `ladder_step` function to improve performances by taking advantage of efficient formulas for differential addition-and-doubling and different coordinate systems.\r\n\r\n- `ladder_pre` is executed before the main loop of the ladder: by default it copies the input point `P` into `S`, and doubles it into `R`.\r\n  Specialized implementations could, e.g., use this hook to transition to different coordinate systems before copying and doubling;\r\n- `ladder_step` is the core of the Montgomery ladder loop: by default it computes `S := R+S; R := 2R;`, but specific implementations could, e.g., implement a more efficient formula for differential addition-and-doubling;\r\n- `ladder_post` is executed after the Montgomery ladder loop: by default it's a noop, but specialized implementations could, e.g., use this hook to transition back from the coordinate system used for optimizing the differential addition-and-doubling or recover the y coordinate of the result point.\r\n\r\nThis commit also renames `ec_mul_consttime` to `ec_scalar_mul_ladder`, as it better corresponds to what this function does: nothing can be truly said about the constant-timeness of the overall execution of this function, given that the underlying operations are not necessarily constant-time themselves.\r\nWhat this implementation ensures is that the same fixed sequence of operations is executed for each scalar multiplication (for a given `EC_GROUP`), with no dependency on the value of the input scalar.\r\n\r\n## [test] test some important ladder corner cases and catch corner cases better and earlier\r\n\r\n*Self explicative, you might consider squashing this commit with the previous one; I decided to keep it separate as it is technically independent from any other change in this PR and because it was authored by @bbbrumley alone.*\r\n\r\n## EC2M Lopez-Dahab ladder implementation\r\n\r\nThis commit uses the new ladder scaffold to implement a specialized ladder step based on differential addition-and-doubling in mixed Lopez-Dahab projective coordinates, modified to independently blind the operands.\r\n\r\nThe arithmetic in `ladder_pre`, `ladder_step` and `ladder_post` is auto generated with tooling:\r\n- see, e.g., \"Guide to ECC\" Alg 3.40 for reference about the `ladder_pre` implementation;\r\n- see https://www.hyperelliptic.org/EFD/g12o/auto-code/shortw/xz/ladder/mladd-2003-s.op3 for the differential addition-and-doubling formulas implemented in `ladder_step`;\r\n- see, e.g., \"Fast Multiplication on Elliptic Curves over GF(2**m) without Precomputation\" (Lopez and Dahab, CHES 1999) Appendix Alg Mxy for the `ladder_post` implementation to recover the `(x,y)` result in affine coordinates.\r\n\r\n## EC2M Lopez-Dahab ladder: use it also for ECDSA verify\r\n\r\nBy default `ec_scalar_mul_ladder` (which uses the Lopez-Dahab ladder implementation) is used only for (`k * Generator`) or (`k * VariablePoint`).\r\nECDSA verification uses (`a * Generator + b * VariablePoint`): this commit forces the use of `ec_scalar_mul_ladder` also for the ECDSA verification path, while using the default wNAF implementation for any other case.\r\n\r\n*With this commit `ec_scalar_mul_ladder` loses the static attribute, and is added to ec_lcl.h so EC_METHODs can directly use it.*\r\n\r\nWhile working on a new custom `EC_POINTs_mul` implementation, I realized that many checks (e.g. all the points being compatible with the given `EC_GROUP`, creating a temporary `BN_CTX` if `ctx == NULL`, check for the corner case `scalar == NULL && num == 0`) were duplicated again and again in every single implementation (and actually some implementations lacked some of the tests).\r\nI thought that it makes way more sense for those checks that are independent from the actual implementation and should always be done, to be moved in the `EC_POINTs_mul` wrapper: so this commit also includes these changes.\r\n\r\n*Again this is technically independent from the parent commit, but you might consider squashing it with the parent: without this ECDSA verification using binary curves does not benefit from the performance boost brought by the new implementation.*\r\n\r\n# Checklist\r\n- [x] documentation is added or updated\r\n- [x] tests are added or updated\r\n- [x] make commits atomic (running `make update`) once we receive feedback\r\n- [x] rename `ec_mul_consttime` to `ec_scalar_mul_ladder`\r\n- [x] rebase and squash\r\n- [x] add `group->order` and `group->cofactor` checks in `ec_scalar_mul_ladder`\r\n- [x] get feedback on the \"Remove stale SM2 error codes\" commit","created_at":"2018-07-10T20:39:32Z","updated_at":"2018-07-14T12:50:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4eadb76e0f6fa74439575917f1e926d0b2dbeffa","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/openssl/openssl/milestones/9","html_url":"https://github.com/openssl/openssl/milestone/9","labels_url":"https://api.github.com/repos/openssl/openssl/milestones/9/labels","id":2145708,"node_id":"MDk6TWlsZXN0b25lMjE0NTcwOA==","number":9,"title":"1.1.1","description":"","creator":{"login":"levitte","id":698918,"node_id":"MDQ6VXNlcjY5ODkxOA==","avatar_url":"https://avatars1.githubusercontent.com/u/698918?v=4","gravatar_id":"","url":"https://api.github.com/users/levitte","html_url":"https://github.com/levitte","followers_url":"https://api.github.com/users/levitte/followers","following_url":"https://api.github.com/users/levitte/following{/other_user}","gists_url":"https://api.github.com/users/levitte/gists{/gist_id}","starred_url":"https://api.github.com/users/levitte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/levitte/subscriptions","organizations_url":"https://api.github.com/users/levitte/orgs","repos_url":"https://api.github.com/users/levitte/repos","events_url":"https://api.github.com/users/levitte/events{/privacy}","received_events_url":"https://api.github.com/users/levitte/received_events","type":"User","site_admin":false},"open_issues":23,"closed_issues":374,"state":"open","created_at":"2016-11-19T09:18:52Z","updated_at":"2018-07-14T10:23:53Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/openssl/openssl/pulls/6690/commits","review_comments_url":"https://api.github.com/repos/openssl/openssl/pulls/6690/comments","review_comment_url":"https://api.github.com/repos/openssl/openssl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openssl/openssl/issues/6690/comments","statuses_url":"https://api.github.com/repos/openssl/openssl/statuses/99ae74e029a9a1d42d561c2cecbb471f2809c651","head":{"label":"romen:nt_ec2m_smpl_ladder","ref":"nt_ec2m_smpl_ladder","sha":"99ae74e029a9a1d42d561c2cecbb471f2809c651","user":{"login":"romen","id":338418,"node_id":"MDQ6VXNlcjMzODQxOA==","avatar_url":"https://avatars3.githubusercontent.com/u/338418?v=4","gravatar_id":"","url":"https://api.github.com/users/romen","html_url":"https://github.com/romen","followers_url":"https://api.github.com/users/romen/followers","following_url":"https://api.github.com/users/romen/following{/other_user}","gists_url":"https://api.github.com/users/romen/gists{/gist_id}","starred_url":"https://api.github.com/users/romen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/romen/subscriptions","organizations_url":"https://api.github.com/users/romen/orgs","repos_url":"https://api.github.com/users/romen/repos","events_url":"https://api.github.com/users/romen/events{/privacy}","received_events_url":"https://api.github.com/users/romen/received_events","type":"User","site_admin":false},"repo":{"id":130825508,"node_id":"MDEwOlJlcG9zaXRvcnkxMzA4MjU1MDg=","name":"openssl","full_name":"romen/openssl","owner":{"login":"romen","id":338418,"node_id":"MDQ6VXNlcjMzODQxOA==","avatar_url":"https://avatars3.githubusercontent.com/u/338418?v=4","gravatar_id":"","url":"https://api.github.com/users/romen","html_url":"https://github.com/romen","followers_url":"https://api.github.com/users/romen/followers","following_url":"https://api.github.com/users/romen/following{/other_user}","gists_url":"https://api.github.com/users/romen/gists{/gist_id}","starred_url":"https://api.github.com/users/romen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/romen/subscriptions","organizations_url":"https://api.github.com/users/romen/orgs","repos_url":"https://api.github.com/users/romen/repos","events_url":"https://api.github.com/users/romen/events{/privacy}","received_events_url":"https://api.github.com/users/romen/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/romen/openssl","description":"TLS/SSL and crypto library","fork":true,"url":"https://api.github.com/repos/romen/openssl","forks_url":"https://api.github.com/repos/romen/openssl/forks","keys_url":"https://api.github.com/repos/romen/openssl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/romen/openssl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/romen/openssl/teams","hooks_url":"https://api.github.com/repos/romen/openssl/hooks","issue_events_url":"https://api.github.com/repos/romen/openssl/issues/events{/number}","events_url":"https://api.github.com/repos/romen/openssl/events","assignees_url":"https://api.github.com/repos/romen/openssl/assignees{/user}","branches_url":"https://api.github.com/repos/romen/openssl/branches{/branch}","tags_url":"https://api.github.com/repos/romen/openssl/tags","blobs_url":"https://api.github.com/repos/romen/openssl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/romen/openssl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/romen/openssl/git/refs{/sha}","trees_url":"https://api.github.com/repos/romen/openssl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/romen/openssl/statuses/{sha}","languages_url":"https://api.github.com/repos/romen/openssl/languages","stargazers_url":"https://api.github.com/repos/romen/openssl/stargazers","contributors_url":"https://api.github.com/repos/romen/openssl/contributors","subscribers_url":"https://api.github.com/repos/romen/openssl/subscribers","subscription_url":"https://api.github.com/repos/romen/openssl/subscription","commits_url":"https://api.github.com/repos/romen/openssl/commits{/sha}","git_commits_url":"https://api.github.com/repos/romen/openssl/git/commits{/sha}","comments_url":"https://api.github.com/repos/romen/openssl/comments{/number}","issue_comment_url":"https://api.github.com/repos/romen/openssl/issues/comments{/number}","contents_url":"https://api.github.com/repos/romen/openssl/contents/{+path}","compare_url":"https://api.github.com/repos/romen/openssl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/romen/openssl/merges","archive_url":"https://api.github.com/repos/romen/openssl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/romen/openssl/downloads","issues_url":"https://api.github.com/repos/romen/openssl/issues{/number}","pulls_url":"https://api.github.com/repos/romen/openssl/pulls{/number}","milestones_url":"https://api.github.com/repos/romen/openssl/milestones{/number}","notifications_url":"https://api.github.com/repos/romen/openssl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/romen/openssl/labels{/name}","releases_url":"https://api.github.com/repos/romen/openssl/releases{/id}","deployments_url":"https://api.github.com/repos/romen/openssl/deployments","created_at":"2018-04-24T08:56:29Z","updated_at":"2018-06-19T10:24:12Z","pushed_at":"2018-07-14T08:04:04Z","git_url":"git://github.com/romen/openssl.git","ssh_url":"git@github.com:romen/openssl.git","clone_url":"https://github.com/romen/openssl.git","svn_url":"https://github.com/romen/openssl","homepage":"https://www.openssl.org","size":150578,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openssl:master","ref":"master","sha":"1e839545803107b230a8177875de5994f85984de","user":{"login":"openssl","id":3279138,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMyNzkxMzg=","avatar_url":"https://avatars2.githubusercontent.com/u/3279138?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnk3NjM0Njc3","name":"openssl","full_name":"openssl/openssl","owner":{"login":"openssl","id":3279138,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMyNzkxMzg=","avatar_url":"https://avatars2.githubusercontent.com/u/3279138?v=4","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":"TLS/SSL and crypto library","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}","deployments_url":"https://api.github.com/repos/openssl/openssl/deployments","created_at":"2013-01-15T22:34:48Z","updated_at":"2018-07-14T12:44:31Z","pushed_at":"2018-07-14T11:55:25Z","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":"https://www.openssl.org","size":150804,"stargazers_count":7564,"watchers_count":7564,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3602,"mirror_url":null,"archived":false,"open_issues_count":414,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":3602,"open_issues":414,"watchers":7564,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openssl/openssl/pulls/6690"},"html":{"href":"https://github.com/openssl/openssl/pull/6690"},"issue":{"href":"https://api.github.com/repos/openssl/openssl/issues/6690"},"comments":{"href":"https://api.github.com/repos/openssl/openssl/issues/6690/comments"},"review_comments":{"href":"https://api.github.com/repos/openssl/openssl/pulls/6690/comments"},"review_comment":{"href":"https://api.github.com/repos/openssl/openssl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openssl/openssl/pulls/6690/commits"},"statuses":{"href":"https://api.github.com/repos/openssl/openssl/statuses/99ae74e029a9a1d42d561c2cecbb471f2809c651"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"dot-asm"}}