{"action":"created","comment":{"url":"https://api.github.com/repos/openssl/openssl/pulls/comments/231869906","pull_request_review_id":172934259,"id":231869906,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMTg2OTkwNg==","diff_hunk":"@@ -117,18 +117,21 @@ int ssl3_setup_write_buffer(SSL *s, size_t numwpipes, size_t len)\n         }\n \n         if (thiswb->buf == NULL) {\n-            p = OPENSSL_malloc(len);\n-            if (p == NULL) {\n-                s->rlayer.numwpipes = currpipe;\n-                /*\n-                 * We've got a malloc failure, and we're still initialising\n-                 * buffers. We assume we're so doomed that we won't even be able\n-                 * to send an alert.\n-                 */\n-                SSLfatal(s, SSL_AD_NO_ALERT,\n-                         SSL_F_SSL3_SETUP_WRITE_BUFFER, ERR_R_MALLOC_FAILURE);\n-                return 0;\n-            }\n+            if (!s->wbio || (s->wbio && !BIO_get_ktls(s->wbio))) {","path":"ssl/record/ssl3_buffer.c","position":16,"original_position":16,"commit_id":"01d6805af63743f6d8a69620e62f276350d893a3","original_commit_id":"01d6805af63743f6d8a69620e62f276350d893a3","user":{"login":"borisPis","id":12531216,"node_id":"MDQ6VXNlcjEyNTMxMjE2","avatar_url":"https://avatars1.githubusercontent.com/u/12531216?v=4","gravatar_id":"","url":"https://api.github.com/users/borisPis","html_url":"https://github.com/borisPis","followers_url":"https://api.github.com/users/borisPis/followers","following_url":"https://api.github.com/users/borisPis/following{/other_user}","gists_url":"https://api.github.com/users/borisPis/gists{/gist_id}","starred_url":"https://api.github.com/users/borisPis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/borisPis/subscriptions","organizations_url":"https://api.github.com/users/borisPis/orgs","repos_url":"https://api.github.com/users/borisPis/repos","events_url":"https://api.github.com/users/borisPis/events{/privacy}","received_events_url":"https://api.github.com/users/borisPis/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2018-11-08T12:33:35Z","updated_at":"2018-11-08T12:33:35Z","html_url":"https://github.com/openssl/openssl/pull/5253#discussion_r231869906","pull_request_url":"https://api.github.com/repos/openssl/openssl/pulls/5253","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/openssl/openssl/pulls/comments/231869906"},"html":{"href":"https://github.com/openssl/openssl/pull/5253#discussion_r231869906"},"pull_request":{"href":"https://api.github.com/repos/openssl/openssl/pulls/5253"}},"in_reply_to_id":231573564},"pull_request":{"url":"https://api.github.com/repos/openssl/openssl/pulls/5253","id":167003876,"node_id":"MDExOlB1bGxSZXF1ZXN0MTY3MDAzODc2","html_url":"https://github.com/openssl/openssl/pull/5253","diff_url":"https://github.com/openssl/openssl/pull/5253.diff","patch_url":"https://github.com/openssl/openssl/pull/5253.patch","issue_url":"https://api.github.com/repos/openssl/openssl/issues/5253","number":5253,"state":"open","locked":false,"title":"Kernel TLS socket API","user":{"login":"borisPis","id":12531216,"node_id":"MDQ6VXNlcjEyNTMxMjE2","avatar_url":"https://avatars1.githubusercontent.com/u/12531216?v=4","gravatar_id":"","url":"https://api.github.com/users/borisPis","html_url":"https://github.com/borisPis","followers_url":"https://api.github.com/users/borisPis/followers","following_url":"https://api.github.com/users/borisPis/following{/other_user}","gists_url":"https://api.github.com/users/borisPis/gists{/gist_id}","starred_url":"https://api.github.com/users/borisPis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/borisPis/subscriptions","organizations_url":"https://api.github.com/users/borisPis/orgs","repos_url":"https://api.github.com/users/borisPis/repos","events_url":"https://api.github.com/users/borisPis/events{/privacy}","received_events_url":"https://api.github.com/users/borisPis/received_events","type":"User","site_admin":false},"body":"I would like to introduce you to the new kernel API for TLS transmit-side data-path available since Linux 4.13. \r\n\r\nPlacing the data-path of TLS in the kernel has several advantages. First, an efficient TLS sendfile system call implementation is possible with such a socket. Second, data from userspace could be encrypted when passing the user-kernel boundary, reducing the overhead of existing implementations that require at least encrypting the data and then copying from user to kernel.\r\nThird, TLS **data-path** crypto offload to hardware requires a kernel infrastructure for the TLS data-path.\r\n\r\nTo sum up, a new kernel socket option is introduced to add support for the data-path of TLS and it will soon be common in operating systems.\r\n\r\nThe user API is as follows: (also see [[1]](https://github.com/torvalds/linux/blob/master/Documentation/networking/tls.txt))\r\n\r\nCreating a TLS connection\r\n-------------------------\r\nFirst create a new TCP socket and set the TLS ULP.\r\n\r\n```\r\n  sock = socket(AF_INET, SOCK_STREAM, 0);\r\n  setsockopt(sock, SOL_TCP, TCP_ULP, \"tls\", sizeof(\"tls\"));\r\n```\r\n\r\nSetting the TLS ULP allows us to set/get TLS socket options. \r\nCurrently only the symmetric encryption is handled in the kernel. Patch 3 sets the TLS ULP in BIO_new_socket(int fd, int close_flag) and Patch 5 sets it in the SSL_set_fd functions.\r\n\r\nAll the parameters required to move the data-path to the kernel are available after processing the change cipher state message during the handshake.\r\nPatch 5 adds code similar to the one below in tls1_change_cipher_state.\r\n\r\nThere is a separate socket option for moving the transmit and the receive into the kernel. Current code, supports only the transmit side, TLS1.2 and AES-GCM128. In the future, this will be extended to the receive side and TLS1.3.\r\n\r\nBelow is the code that sets the socket option which moves the transmit data-path into the kernel. Patch 1 adds a new internal header internal/ktls.h that implements the new socket options required. It also provides the necessary stub functions for fallback to the OpenSSL data-path when ktls is not supported by the kernel. It is possible to disable ktls using the no-ktls config option added in Patch 2.\r\n\r\n```\r\n /* From linux/tls.h */\r\n struct tls_crypto_info {\r\n         unsigned short version;\r\n         unsigned short cipher_type;\r\n };\r\n\r\n  struct tls12_crypto_info_aes_gcm_128 {\r\n          struct tls_crypto_info info;\r\n          unsigned char iv[TLS_CIPHER_AES_GCM_128_IV_SIZE];\r\n          unsigned char key[TLS_CIPHER_AES_GCM_128_KEY_SIZE];\r\n          unsigned char salt[TLS_CIPHER_AES_GCM_128_SALT_SIZE];\r\n          unsigned char rec_seq[TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE];\r\n  };\r\n\r\n  struct tls12_crypto_info_aes_gcm_128 crypto_info;\r\n\r\n  crypto_info.info.version = TLS_1_2_VERSION;\r\n  crypto_info.info.cipher_type = TLS_CIPHER_AES_GCM_128;\r\n  memcpy(crypto_info.iv, iv_write, TLS_CIPHER_AES_GCM_128_IV_SIZE);\r\n  memcpy(crypto_info.rec_seq, seq_number_write, TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE);\r\n  memcpy(crypto_info.key, cipher_key_write, TLS_CIPHER_AES_GCM_128_KEY_SIZE);\r\n  memcpy(crypto_info.salt, implicit_iv_write, TLS_CIPHER_AES_GCM_128_SALT_SIZE);\r\n\r\n  setsockopt(sock, SOL_TLS, TLS_TX, &crypto_info, sizeof(crypto_info));\r\n```\r\n\r\nSending TLS application data\r\n----------------------------\r\n\r\nAfter setting the TLS_TX socket option all application data sent over this socket is encrypted using TLS using the parameters provided in the socket option and encapsulated in TLS application data records.\r\n\r\nFor example, an application can send an encrypted hello world application data record as follows:\r\n\r\n```\r\n  const char *msg = \"hello world\\n\";\r\n  send(sock, msg, strlen(msg));\r\n\r\n```\r\nsend() data is directly encrypted from the userspace buffer provided to the encrypted kernel send buffer if possible.\r\n\r\nThe sendfile system call will send the file's data over TLS records of maximum length (2^14). Currently, it is not possible to control the fragment length through the API, but such an option could be added in the future.  \r\n\r\n```\r\n  file = open(filename, O_RDONLY);\r\n  fstat(file, &stat);\r\n  sendfile(sock, file, &offset, stat.st_size);\r\n```\r\n\r\nTLS records are created and sent after each send() call, unless MSG_MORE is passed.  MSG_MORE will delay creation of a record until MSG_MORE is not passed, or the maximum record size is reached or an alert record needs to be sent.\r\n\r\nThe kernel will need to allocate a buffer for the encrypted data.\r\nThis buffer is allocated at the time send() is called, such that either the entire send() call will return -ENOMEM (or block waiting for memory), or the encryption will always succeed.  If send() returns -ENOMEM and some data was left on the socket buffer from a previous call using MSG_MORE, the MSG_MORE data is left on the socket buffer.\r\n\r\nSend TLS control messages\r\n-------------------------\r\n\r\nOther than application data, TLS has control messages such as alert messages (record type 21) and handshake messages (record type 22), etc. These messages can be sent over the socket by providing the TLS record type via a CMSG.\r\nPatch 3 calls the following function (in ktls.h) that sends @data of @length bytes using a record of type @record_type.\r\n```\r\n/* send TLS control message using record_type */\r\n  static int klts_send_ctrl_message(int sock, unsigned char record_type,\r\n                                  void *data, size_t length)\r\n  {\r\n        struct msghdr msg = {0};\r\n        int cmsg_len = sizeof(record_type);\r\n        struct cmsghdr *cmsg;\r\n        char buf[CMSG_SPACE(cmsg_len)];\r\n        struct iovec msg_iov;   /* Vector of data to send/receive into.  */\r\n\r\n        msg.msg_control = buf;\r\n        msg.msg_controllen = sizeof(buf);\r\n        cmsg = CMSG_FIRSTHDR(&msg);\r\n        cmsg->cmsg_level = SOL_TLS;\r\n        cmsg->cmsg_type = TLS_SET_RECORD_TYPE;\r\n        cmsg->cmsg_len = CMSG_LEN(cmsg_len);\r\n        *CMSG_DATA(cmsg) = record_type;\r\n        msg.msg_controllen = cmsg->cmsg_len;\r\n\r\n        msg_iov.iov_base = data;\r\n        msg_iov.iov_len = length;\r\n        msg.msg_iov = &msg_iov;\r\n        msg.msg_iovlen = 1;\r\n\r\n        return sendmsg(sock, &msg, 0);\r\n  }\r\n```\r\n\r\nControl message data should be provided unencrypted, and will be encrypted by the kernel. Additionally, each control message must be preceded with a BIO_CTRL_SET_OFFLOAD_TX_CTRL_MSG that specifies the record type of the upcoming message.\r\n\r\nWhen using ktls, OpenSSL doesn't encrypt the payload, thus it doesn't need to copy user provided data. Patch 5 also removes all copies from the OpenSSL data-path, as a side-effect it disables the use the OpenSSL buffer and packet management APIs.\r\n\r\nSome performance analysis of ktls compared to OpenSSL can be found at Dave Watson's paper from netdev1.2 [[2]](https://netdevconf.org/1.2/papers/ktls.pdf). The paper shows how ktls reduces latency and improves CPU utilization. Additionally, ktls enables seamless HW offload of the data-path (like LSO) which further improves both latency and CPU utilization as you can see from my talk at netdev 2.2 [[3]](https://www.netdevconf.org/2.2/papers/pismenny-tlscrypto-talk.pdf) where we show x2.6 improvment in CPU utilization compared to vanilla OpenSSL.\r\n\r\nAt a high level, the kernel TLS ULP is a replacement for the record layer of a userspace TLS library.\r\n\r\nReferences:\r\n[1] - https://github.com/torvalds/linux/blob/master/Documentation/networking/tls.txt\r\n[2] - https://netdevconf.org/1.2/papers/ktls.pdf\r\n[3] - https://www.netdevconf.org/2.2/papers/pismenny-tlscrypto-talk.pdf\r\n\r\n##### Changes from the RFC pull request\r\n- Submitted CLAs\r\n- Rebased changes over master\r\n- Added a new configuration option to disable ktls\r\n- Remove the netinet/tcp.h hack","created_at":"2018-02-04T10:23:55Z","updated_at":"2018-11-08T12:33:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"61476f19fe89124cf43f3c92217f0803113eb4c7","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":482066405,"node_id":"MDU6TGFiZWw0ODIwNjY0MDU=","url":"https://api.github.com/repos/openssl/openssl/labels/after%201.1.1","name":"after 1.1.1","color":"bfdadc","default":false}],"milestone":{"url":"https://api.github.com/repos/openssl/openssl/milestones/11","html_url":"https://github.com/openssl/openssl/milestone/11","labels_url":"https://api.github.com/repos/openssl/openssl/milestones/11/labels","id":3024154,"node_id":"MDk6TWlsZXN0b25lMzAyNDE1NA==","number":11,"title":"Post 1.1.1","description":"","creator":{"login":"kaduk","id":1894506,"node_id":"MDQ6VXNlcjE4OTQ1MDY=","avatar_url":"https://avatars1.githubusercontent.com/u/1894506?v=4","gravatar_id":"","url":"https://api.github.com/users/kaduk","html_url":"https://github.com/kaduk","followers_url":"https://api.github.com/users/kaduk/followers","following_url":"https://api.github.com/users/kaduk/following{/other_user}","gists_url":"https://api.github.com/users/kaduk/gists{/gist_id}","starred_url":"https://api.github.com/users/kaduk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaduk/subscriptions","organizations_url":"https://api.github.com/users/kaduk/orgs","repos_url":"https://api.github.com/users/kaduk/repos","events_url":"https://api.github.com/users/kaduk/events{/privacy}","received_events_url":"https://api.github.com/users/kaduk/received_events","type":"User","site_admin":false},"open_issues":236,"closed_issues":54,"state":"open","created_at":"2018-01-09T21:08:23Z","updated_at":"2018-10-27T04:15:40Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/openssl/openssl/pulls/5253/commits","review_comments_url":"https://api.github.com/repos/openssl/openssl/pulls/5253/comments","review_comment_url":"https://api.github.com/repos/openssl/openssl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openssl/openssl/issues/5253/comments","statuses_url":"https://api.github.com/repos/openssl/openssl/statuses/01d6805af63743f6d8a69620e62f276350d893a3","head":{"label":"Mellanox:tls_tx2","ref":"tls_tx2","sha":"01d6805af63743f6d8a69620e62f276350d893a3","user":{"login":"Mellanox","id":5813145,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU4MTMxNDU=","avatar_url":"https://avatars3.githubusercontent.com/u/5813145?v=4","gravatar_id":"","url":"https://api.github.com/users/Mellanox","html_url":"https://github.com/Mellanox","followers_url":"https://api.github.com/users/Mellanox/followers","following_url":"https://api.github.com/users/Mellanox/following{/other_user}","gists_url":"https://api.github.com/users/Mellanox/gists{/gist_id}","starred_url":"https://api.github.com/users/Mellanox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mellanox/subscriptions","organizations_url":"https://api.github.com/users/Mellanox/orgs","repos_url":"https://api.github.com/users/Mellanox/repos","events_url":"https://api.github.com/users/Mellanox/events{/privacy}","received_events_url":"https://api.github.com/users/Mellanox/received_events","type":"Organization","site_admin":false},"repo":{"id":93664480,"node_id":"MDEwOlJlcG9zaXRvcnk5MzY2NDQ4MA==","name":"openssl","full_name":"Mellanox/openssl","private":false,"owner":{"login":"Mellanox","id":5813145,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU4MTMxNDU=","avatar_url":"https://avatars3.githubusercontent.com/u/5813145?v=4","gravatar_id":"","url":"https://api.github.com/users/Mellanox","html_url":"https://github.com/Mellanox","followers_url":"https://api.github.com/users/Mellanox/followers","following_url":"https://api.github.com/users/Mellanox/following{/other_user}","gists_url":"https://api.github.com/users/Mellanox/gists{/gist_id}","starred_url":"https://api.github.com/users/Mellanox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mellanox/subscriptions","organizations_url":"https://api.github.com/users/Mellanox/orgs","repos_url":"https://api.github.com/users/Mellanox/repos","events_url":"https://api.github.com/users/Mellanox/events{/privacy}","received_events_url":"https://api.github.com/users/Mellanox/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Mellanox/openssl","description":"TLS/SSL and crypto library","fork":true,"url":"https://api.github.com/repos/Mellanox/openssl","forks_url":"https://api.github.com/repos/Mellanox/openssl/forks","keys_url":"https://api.github.com/repos/Mellanox/openssl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Mellanox/openssl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Mellanox/openssl/teams","hooks_url":"https://api.github.com/repos/Mellanox/openssl/hooks","issue_events_url":"https://api.github.com/repos/Mellanox/openssl/issues/events{/number}","events_url":"https://api.github.com/repos/Mellanox/openssl/events","assignees_url":"https://api.github.com/repos/Mellanox/openssl/assignees{/user}","branches_url":"https://api.github.com/repos/Mellanox/openssl/branches{/branch}","tags_url":"https://api.github.com/repos/Mellanox/openssl/tags","blobs_url":"https://api.github.com/repos/Mellanox/openssl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Mellanox/openssl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Mellanox/openssl/git/refs{/sha}","trees_url":"https://api.github.com/repos/Mellanox/openssl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Mellanox/openssl/statuses/{sha}","languages_url":"https://api.github.com/repos/Mellanox/openssl/languages","stargazers_url":"https://api.github.com/repos/Mellanox/openssl/stargazers","contributors_url":"https://api.github.com/repos/Mellanox/openssl/contributors","subscribers_url":"https://api.github.com/repos/Mellanox/openssl/subscribers","subscription_url":"https://api.github.com/repos/Mellanox/openssl/subscription","commits_url":"https://api.github.com/repos/Mellanox/openssl/commits{/sha}","git_commits_url":"https://api.github.com/repos/Mellanox/openssl/git/commits{/sha}","comments_url":"https://api.github.com/repos/Mellanox/openssl/comments{/number}","issue_comment_url":"https://api.github.com/repos/Mellanox/openssl/issues/comments{/number}","contents_url":"https://api.github.com/repos/Mellanox/openssl/contents/{+path}","compare_url":"https://api.github.com/repos/Mellanox/openssl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Mellanox/openssl/merges","archive_url":"https://api.github.com/repos/Mellanox/openssl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Mellanox/openssl/downloads","issues_url":"https://api.github.com/repos/Mellanox/openssl/issues{/number}","pulls_url":"https://api.github.com/repos/Mellanox/openssl/pulls{/number}","milestones_url":"https://api.github.com/repos/Mellanox/openssl/milestones{/number}","notifications_url":"https://api.github.com/repos/Mellanox/openssl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Mellanox/openssl/labels{/name}","releases_url":"https://api.github.com/repos/Mellanox/openssl/releases{/id}","deployments_url":"https://api.github.com/repos/Mellanox/openssl/deployments","created_at":"2017-06-07T18:02:14Z","updated_at":"2017-06-07T18:02:33Z","pushed_at":"2018-11-01T12:34:11Z","git_url":"git://github.com/Mellanox/openssl.git","ssh_url":"git@github.com:Mellanox/openssl.git","clone_url":"https://github.com/Mellanox/openssl.git","svn_url":"https://github.com/Mellanox/openssl","homepage":"https://www.openssl.org","size":153881,"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":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openssl:master","ref":"master","sha":"54f3e855d48d08e9623a7ced715e263352c95274","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","private":false,"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},"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-11-08T12:13:40Z","pushed_at":"2018-11-08T12:20:11Z","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":159989,"stargazers_count":8627,"watchers_count":8627,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3957,"mirror_url":null,"archived":false,"open_issues_count":577,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":3957,"open_issues":577,"watchers":8627,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openssl/openssl/pulls/5253"},"html":{"href":"https://github.com/openssl/openssl/pull/5253"},"issue":{"href":"https://api.github.com/repos/openssl/openssl/issues/5253"},"comments":{"href":"https://api.github.com/repos/openssl/openssl/issues/5253/comments"},"review_comments":{"href":"https://api.github.com/repos/openssl/openssl/pulls/5253/comments"},"review_comment":{"href":"https://api.github.com/repos/openssl/openssl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openssl/openssl/pulls/5253/commits"},"statuses":{"href":"https://api.github.com/repos/openssl/openssl/statuses/01d6805af63743f6d8a69620e62f276350d893a3"}},"author_association":"NONE"}}
{"actor":{"display_login":"borisPis"}}