{"action":"created","comment":{"url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/comments/211708959","pull_request_review_id":148188297,"id":211708959,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTcwODk1OQ==","diff_hunk":"@@ -3426,6 +3426,41 @@ static int ssl_hs_is_proper_fragment( mbedtls_ssl_context *ssl )\n     }\n     return( 0 );\n }\n+\n+static uint32_t ssl_get_hs_frag_len( mbedtls_ssl_context *ssl )\n+{\n+    return( ( ssl->in_msg[9] << 16  ) |\n+            ( ssl->in_msg[10] << 8  ) |\n+              ssl->in_msg[11] );\n+}\n+\n+static uint32_t ssl_get_hs_frag_off( mbedtls_ssl_context *ssl )\n+{\n+    return( ( ssl->in_msg[6] << 16 ) |\n+            ( ssl->in_msg[7] << 8  ) |\n+              ssl->in_msg[8] );\n+}\n+\n+static int ssl_check_hs_header( mbedtls_ssl_context *ssl )\n+{\n+    uint32_t msg_len, frag_off, frag_len;\n+\n+    msg_len  = ssl_get_hs_total_len( ssl );\n+    frag_off = ssl_get_hs_frag_off( ssl );\n+    frag_len = ssl_get_hs_frag_len( ssl );\n+\n+    if( frag_off > msg_len )\n+        return( -1 );","path":"library/ssl_tls.c","position":738,"original_position":28,"commit_id":"903ee3d363099bb19cd5461c156969b2c55893af","original_commit_id":"44650b7a7448460d07d02172285151f9a650c746","user":{"login":"AndrzejKurek","id":29195988,"node_id":"MDQ6VXNlcjI5MTk1OTg4","avatar_url":"https://avatars0.githubusercontent.com/u/29195988?v=4","gravatar_id":"","url":"https://api.github.com/users/AndrzejKurek","html_url":"https://github.com/AndrzejKurek","followers_url":"https://api.github.com/users/AndrzejKurek/followers","following_url":"https://api.github.com/users/AndrzejKurek/following{/other_user}","gists_url":"https://api.github.com/users/AndrzejKurek/gists{/gist_id}","starred_url":"https://api.github.com/users/AndrzejKurek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AndrzejKurek/subscriptions","organizations_url":"https://api.github.com/users/AndrzejKurek/orgs","repos_url":"https://api.github.com/users/AndrzejKurek/repos","events_url":"https://api.github.com/users/AndrzejKurek/events{/privacy}","received_events_url":"https://api.github.com/users/AndrzejKurek/received_events","type":"User","site_admin":false},"body":"I'm always a fan of having different error codes for different situations, but I understand that it may be irrelevant here, as they will be treated in the same way.","created_at":"2018-08-21T18:19:59Z","updated_at":"2018-08-21T18:19:59Z","html_url":"https://github.com/ARMmbed/mbedtls/pull/1951#discussion_r211708959","pull_request_url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/comments/211708959"},"html":{"href":"https://github.com/ARMmbed/mbedtls/pull/1951#discussion_r211708959"},"pull_request":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951"}}},"pull_request":{"url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951","id":208588748,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA4NTg4NzQ4","html_url":"https://github.com/ARMmbed/mbedtls/pull/1951","diff_url":"https://github.com/ARMmbed/mbedtls/pull/1951.diff","patch_url":"https://github.com/ARMmbed/mbedtls/pull/1951.patch","issue_url":"https://api.github.com/repos/ARMmbed/mbedtls/issues/1951","number":1951,"state":"open","locked":false,"title":"Add support for message reordering","user":{"login":"hanno-arm","id":26892988,"node_id":"MDQ6VXNlcjI2ODkyOTg4","avatar_url":"https://avatars1.githubusercontent.com/u/26892988?v=4","gravatar_id":"","url":"https://api.github.com/users/hanno-arm","html_url":"https://github.com/hanno-arm","followers_url":"https://api.github.com/users/hanno-arm/followers","following_url":"https://api.github.com/users/hanno-arm/following{/other_user}","gists_url":"https://api.github.com/users/hanno-arm/gists{/gist_id}","starred_url":"https://api.github.com/users/hanno-arm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hanno-arm/subscriptions","organizations_url":"https://api.github.com/users/hanno-arm/orgs","repos_url":"https://api.github.com/users/hanno-arm/repos","events_url":"https://api.github.com/users/hanno-arm/events{/privacy}","received_events_url":"https://api.github.com/users/hanno-arm/received_events","type":"User","site_admin":false},"body":"### Overview\r\n\r\n This PR adds support for buffering and reordering of handshake messages in DTLS.\r\n\r\n__Relation to fragmentation (#1939) and datagram packing (#1918):__ This PR is based on top of #1939 and #1918 - not because there is a functional dependency, but because #1939 and #1918 are likely to be merged first, and basing message reordering on top of them hopefully allows us to catch potential problems earlier.\r\n\r\n__Configuration extension:__ As suggested by @mpg, this commit introduces a new compile-time option `MBEDTLS_SSL_DTLS_MAX_BUFFERING` which limits the cumulative size of heap allocated buffers used for the purpose of message reassembly and buffering.\r\n\r\n__API change / extension:__ None compared to #1918 + #1939. The signature of the public function `mbedtls_ssl_read_record()` has changed, but it is declared in `ssl_internal.h` and hence not meant to be used directly.\r\n\r\n__ABI change:__ None compared to #1918 + #1939: The structure `mbedtls_ssl_handshake_params` has changed, but it is internal.\r\n\r\n### Architecture\r\n\r\n__Goal:__ Improve DTLS handshake efficiency by buffering out-of-order messages.\r\n\r\n__Approach:__ There are three different kinds of out-of-order messages that need to be considered separately: \r\n1. Out-of-order handshake messages, i.e. handshake messages from the correct epoch which have a handshake sequence number larger than the expected one.\r\n2. Out-of-order ChangeCipherSpec messages, i.e. CCS messages that are received earlier than expected.\r\n3. Out-of-order handshake records from future epochs, i.e. encrypted `Finished` messages received prior to receiving the preceding `ChangeCipherSpec`, and hence prior to switching to the new incoming transform.\r\n\r\nIn all cases, the previous code returned `MBEDTLS_ERR_SSL_INVALID_RECORD` or `MBEDTLS_ERR_SSL_CONTINUE_PROCESSING` from `mbedtls_ssl_read_record_layer()` resp. `mbedtls_ssl_handle_message_type()` leading to the respective record / message to be silently ignored.\r\n\r\nThis PR slightly modifies this approach in the following way:\r\n- A new error code `MBEDTLS_ERR_SSL_EARLY_MESSAGE` is returned instead which signals that the record resp. message might be considered for buffering. If this error code is seen in `mbedtls_ssl_read_record()` (the caller for both `mbedtls_ssl_read_record_layer()` and `mbedtls_ssl_handle_message_type()`) it calls buffering functions `ssl_buffer_message()` resp. `ssl_buffer_future_record()` which may or may not make a copy of the message / record. These functions should never fail - they return `0` regardless of whether the message / record was buffered or not - and after they have been called, the error code is remapped to the old `MBEDTLS_ERR_SSL_CONTINUE_PROCESSING` resp. `MBEDTLS_ERR_SSL_INVALID_RECORD` leading to message processing to continue as usual, considering more messages within the same record, or more records within the same datagram. \r\n- When `mbedtls_ssl_read_record()` is called and no datagram is currently being processed, then functions `load_buffered_message()` and `load_buffered_record()` are called to check if a message or a record has been buffered that has become relevant by now (that is, we have backed up the HS message for the next expected sequence number, or we expect a CCS and have already seen it in the current flight, or we have buffered a record from the next epoch and have switched the epoch by now). On success, these functions shall copy the buffered message / record into the (empty!) input buffer, so that processing can continue as if they had been just been received from the network.\r\n\r\nSome more details for the various cases:\r\n1. Every handshake message which is either a proper fragment of the next expected handshake message, or part of a future handshake message, is backed up in a new sub-structure within `mbedtls_ssl_handshake_params` which can hold up to a fixed number of handshake messages. Future handshake messages can be reassembled in the same way as the next expected handshake message, and in fact the old code from `ssl_reassemble_dtls_handshake()` has mostly been moved to the new function `ssl_buffer_message()` which can now reassemble both the current and future handshake messages. In particular, handshake fragments of the next expected handshake message are treated as messages that are to be buffered, and it is only when the entire current datagram has been processed that they are considered to be forwarded to the user. This is different from previous behavior: Whenever a handshake message was fully reassembled, the full message was copied back into the input buffer, shifting further records within the same datagram to the back of the buffer. If there was not enough space for these records, or if there were more handshake messages within the current record, the reassembly would fail. This limitation goes away with the present PR since the reassembled message is considered for delivery to the handshake logic layer only once the last incoming datagram has been fully processed. This removes the code previously used for shifting records within the current datagram, as well as the potential failure in case there is not enough space; on the other hand, it comes at the cost of buffering the remaining messages within the current datagram.\r\n2. Out-of-Order CCS messages are remembered for the duration of a flight by setting a field `seen_ccs` within the new buffering sub-structure of `mbedtl_ssl_handshake_params`. When `ssl_load_buffered_message()` is called and the state is `SERVER_CCS` or `CLIENT_CCS` and `seen_ccs` is set, the function will synthesize a CCS record.\r\n3. If `mbedtls_ssl_read_record_layer()` backs up at most one record from the next epoch within the new buffering sub-structure, and `ssl_load_future_record()` loads it as soon as the epoch has been changed. If multiple future records are received, all but the first one are silently dropped. This should be sufficient for the intended use case where we want to buffer the encrypted `Finished` message in case we receive it prior to processing the preceding `ChangeCipherSpec`.\r\n","created_at":"2018-08-15T15:01:35Z","updated_at":"2018-08-21T18:19:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"35ad36c2484b7e3566fb8494fe2d118039e05729","assignee":null,"assignees":[],"requested_reviewers":[{"login":"sbutcher-arm","id":8195775,"node_id":"MDQ6VXNlcjgxOTU3NzU=","avatar_url":"https://avatars1.githubusercontent.com/u/8195775?v=4","gravatar_id":"","url":"https://api.github.com/users/sbutcher-arm","html_url":"https://github.com/sbutcher-arm","followers_url":"https://api.github.com/users/sbutcher-arm/followers","following_url":"https://api.github.com/users/sbutcher-arm/following{/other_user}","gists_url":"https://api.github.com/users/sbutcher-arm/gists{/gist_id}","starred_url":"https://api.github.com/users/sbutcher-arm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbutcher-arm/subscriptions","organizations_url":"https://api.github.com/users/sbutcher-arm/orgs","repos_url":"https://api.github.com/users/sbutcher-arm/repos","events_url":"https://api.github.com/users/sbutcher-arm/events{/privacy}","received_events_url":"https://api.github.com/users/sbutcher-arm/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":937147638,"node_id":"MDU6TGFiZWw5MzcxNDc2Mzg=","url":"https://api.github.com/repos/ARMmbed/mbedtls/labels/component:%20TLS","name":"component: TLS","color":"CEE3F6","default":false},{"id":19280386,"node_id":"MDU6TGFiZWwxOTI4MDM4Ng==","url":"https://api.github.com/repos/ARMmbed/mbedtls/labels/enhancement","name":"enhancement","color":"84b6eb","default":true},{"id":408190313,"node_id":"MDU6TGFiZWw0MDgxOTAzMTM=","url":"https://api.github.com/repos/ARMmbed/mbedtls/labels/mbed%20TLS%20team","name":"mbed TLS team","color":"66e0ff","default":false},{"id":685773676,"node_id":"MDU6TGFiZWw2ODU3NzM2NzY=","url":"https://api.github.com/repos/ARMmbed/mbedtls/labels/needs%20design%20approval","name":"needs design approval","color":"5319e7","default":false},{"id":705358813,"node_id":"MDU6TGFiZWw3MDUzNTg4MTM=","url":"https://api.github.com/repos/ARMmbed/mbedtls/labels/needs%20review","name":"needs review","color":"fbca04","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951/commits","review_comments_url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951/comments","review_comment_url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ARMmbed/mbedtls/issues/1951/comments","statuses_url":"https://api.github.com/repos/ARMmbed/mbedtls/statuses/903ee3d363099bb19cd5461c156969b2c55893af","head":{"label":"hanno-arm:message_reordering","ref":"message_reordering","sha":"903ee3d363099bb19cd5461c156969b2c55893af","user":{"login":"hanno-arm","id":26892988,"node_id":"MDQ6VXNlcjI2ODkyOTg4","avatar_url":"https://avatars1.githubusercontent.com/u/26892988?v=4","gravatar_id":"","url":"https://api.github.com/users/hanno-arm","html_url":"https://github.com/hanno-arm","followers_url":"https://api.github.com/users/hanno-arm/followers","following_url":"https://api.github.com/users/hanno-arm/following{/other_user}","gists_url":"https://api.github.com/users/hanno-arm/gists{/gist_id}","starred_url":"https://api.github.com/users/hanno-arm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hanno-arm/subscriptions","organizations_url":"https://api.github.com/users/hanno-arm/orgs","repos_url":"https://api.github.com/users/hanno-arm/repos","events_url":"https://api.github.com/users/hanno-arm/events{/privacy}","received_events_url":"https://api.github.com/users/hanno-arm/received_events","type":"User","site_admin":false},"repo":{"id":87815731,"node_id":"MDEwOlJlcG9zaXRvcnk4NzgxNTczMQ==","name":"mbedtls","full_name":"hanno-arm/mbedtls","owner":{"login":"hanno-arm","id":26892988,"node_id":"MDQ6VXNlcjI2ODkyOTg4","avatar_url":"https://avatars1.githubusercontent.com/u/26892988?v=4","gravatar_id":"","url":"https://api.github.com/users/hanno-arm","html_url":"https://github.com/hanno-arm","followers_url":"https://api.github.com/users/hanno-arm/followers","following_url":"https://api.github.com/users/hanno-arm/following{/other_user}","gists_url":"https://api.github.com/users/hanno-arm/gists{/gist_id}","starred_url":"https://api.github.com/users/hanno-arm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hanno-arm/subscriptions","organizations_url":"https://api.github.com/users/hanno-arm/orgs","repos_url":"https://api.github.com/users/hanno-arm/repos","events_url":"https://api.github.com/users/hanno-arm/events{/privacy}","received_events_url":"https://api.github.com/users/hanno-arm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hanno-arm/mbedtls","description":"An open source, portable, easy to use, readable and flexible SSL library","fork":true,"url":"https://api.github.com/repos/hanno-arm/mbedtls","forks_url":"https://api.github.com/repos/hanno-arm/mbedtls/forks","keys_url":"https://api.github.com/repos/hanno-arm/mbedtls/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hanno-arm/mbedtls/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hanno-arm/mbedtls/teams","hooks_url":"https://api.github.com/repos/hanno-arm/mbedtls/hooks","issue_events_url":"https://api.github.com/repos/hanno-arm/mbedtls/issues/events{/number}","events_url":"https://api.github.com/repos/hanno-arm/mbedtls/events","assignees_url":"https://api.github.com/repos/hanno-arm/mbedtls/assignees{/user}","branches_url":"https://api.github.com/repos/hanno-arm/mbedtls/branches{/branch}","tags_url":"https://api.github.com/repos/hanno-arm/mbedtls/tags","blobs_url":"https://api.github.com/repos/hanno-arm/mbedtls/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hanno-arm/mbedtls/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hanno-arm/mbedtls/git/refs{/sha}","trees_url":"https://api.github.com/repos/hanno-arm/mbedtls/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hanno-arm/mbedtls/statuses/{sha}","languages_url":"https://api.github.com/repos/hanno-arm/mbedtls/languages","stargazers_url":"https://api.github.com/repos/hanno-arm/mbedtls/stargazers","contributors_url":"https://api.github.com/repos/hanno-arm/mbedtls/contributors","subscribers_url":"https://api.github.com/repos/hanno-arm/mbedtls/subscribers","subscription_url":"https://api.github.com/repos/hanno-arm/mbedtls/subscription","commits_url":"https://api.github.com/repos/hanno-arm/mbedtls/commits{/sha}","git_commits_url":"https://api.github.com/repos/hanno-arm/mbedtls/git/commits{/sha}","comments_url":"https://api.github.com/repos/hanno-arm/mbedtls/comments{/number}","issue_comment_url":"https://api.github.com/repos/hanno-arm/mbedtls/issues/comments{/number}","contents_url":"https://api.github.com/repos/hanno-arm/mbedtls/contents/{+path}","compare_url":"https://api.github.com/repos/hanno-arm/mbedtls/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hanno-arm/mbedtls/merges","archive_url":"https://api.github.com/repos/hanno-arm/mbedtls/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hanno-arm/mbedtls/downloads","issues_url":"https://api.github.com/repos/hanno-arm/mbedtls/issues{/number}","pulls_url":"https://api.github.com/repos/hanno-arm/mbedtls/pulls{/number}","milestones_url":"https://api.github.com/repos/hanno-arm/mbedtls/milestones{/number}","notifications_url":"https://api.github.com/repos/hanno-arm/mbedtls/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hanno-arm/mbedtls/labels{/name}","releases_url":"https://api.github.com/repos/hanno-arm/mbedtls/releases{/id}","deployments_url":"https://api.github.com/repos/hanno-arm/mbedtls/deployments","created_at":"2017-04-10T13:44:55Z","updated_at":"2017-04-10T13:45:00Z","pushed_at":"2018-08-21T16:53:49Z","git_url":"git://github.com/hanno-arm/mbedtls.git","ssh_url":"git@github.com:hanno-arm/mbedtls.git","clone_url":"https://github.com/hanno-arm/mbedtls.git","svn_url":"https://github.com/hanno-arm/mbedtls","homepage":"https://tls.mbed.org","size":31522,"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":"development"}},"base":{"label":"ARMmbed:development","ref":"development","sha":"aa9f3fd6b143d86294e2626e8a91fd9ebbd87348","user":{"login":"ARMmbed","id":8916057,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg5MTYwNTc=","avatar_url":"https://avatars3.githubusercontent.com/u/8916057?v=4","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"repo":{"id":6687936,"node_id":"MDEwOlJlcG9zaXRvcnk2Njg3OTM2","name":"mbedtls","full_name":"ARMmbed/mbedtls","owner":{"login":"ARMmbed","id":8916057,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg5MTYwNTc=","avatar_url":"https://avatars3.githubusercontent.com/u/8916057?v=4","gravatar_id":"","url":"https://api.github.com/users/ARMmbed","html_url":"https://github.com/ARMmbed","followers_url":"https://api.github.com/users/ARMmbed/followers","following_url":"https://api.github.com/users/ARMmbed/following{/other_user}","gists_url":"https://api.github.com/users/ARMmbed/gists{/gist_id}","starred_url":"https://api.github.com/users/ARMmbed/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ARMmbed/subscriptions","organizations_url":"https://api.github.com/users/ARMmbed/orgs","repos_url":"https://api.github.com/users/ARMmbed/repos","events_url":"https://api.github.com/users/ARMmbed/events{/privacy}","received_events_url":"https://api.github.com/users/ARMmbed/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ARMmbed/mbedtls","description":"An open source, portable, easy to use, readable and flexible SSL library","fork":false,"url":"https://api.github.com/repos/ARMmbed/mbedtls","forks_url":"https://api.github.com/repos/ARMmbed/mbedtls/forks","keys_url":"https://api.github.com/repos/ARMmbed/mbedtls/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ARMmbed/mbedtls/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ARMmbed/mbedtls/teams","hooks_url":"https://api.github.com/repos/ARMmbed/mbedtls/hooks","issue_events_url":"https://api.github.com/repos/ARMmbed/mbedtls/issues/events{/number}","events_url":"https://api.github.com/repos/ARMmbed/mbedtls/events","assignees_url":"https://api.github.com/repos/ARMmbed/mbedtls/assignees{/user}","branches_url":"https://api.github.com/repos/ARMmbed/mbedtls/branches{/branch}","tags_url":"https://api.github.com/repos/ARMmbed/mbedtls/tags","blobs_url":"https://api.github.com/repos/ARMmbed/mbedtls/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ARMmbed/mbedtls/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ARMmbed/mbedtls/git/refs{/sha}","trees_url":"https://api.github.com/repos/ARMmbed/mbedtls/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ARMmbed/mbedtls/statuses/{sha}","languages_url":"https://api.github.com/repos/ARMmbed/mbedtls/languages","stargazers_url":"https://api.github.com/repos/ARMmbed/mbedtls/stargazers","contributors_url":"https://api.github.com/repos/ARMmbed/mbedtls/contributors","subscribers_url":"https://api.github.com/repos/ARMmbed/mbedtls/subscribers","subscription_url":"https://api.github.com/repos/ARMmbed/mbedtls/subscription","commits_url":"https://api.github.com/repos/ARMmbed/mbedtls/commits{/sha}","git_commits_url":"https://api.github.com/repos/ARMmbed/mbedtls/git/commits{/sha}","comments_url":"https://api.github.com/repos/ARMmbed/mbedtls/comments{/number}","issue_comment_url":"https://api.github.com/repos/ARMmbed/mbedtls/issues/comments{/number}","contents_url":"https://api.github.com/repos/ARMmbed/mbedtls/contents/{+path}","compare_url":"https://api.github.com/repos/ARMmbed/mbedtls/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ARMmbed/mbedtls/merges","archive_url":"https://api.github.com/repos/ARMmbed/mbedtls/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ARMmbed/mbedtls/downloads","issues_url":"https://api.github.com/repos/ARMmbed/mbedtls/issues{/number}","pulls_url":"https://api.github.com/repos/ARMmbed/mbedtls/pulls{/number}","milestones_url":"https://api.github.com/repos/ARMmbed/mbedtls/milestones{/number}","notifications_url":"https://api.github.com/repos/ARMmbed/mbedtls/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ARMmbed/mbedtls/labels{/name}","releases_url":"https://api.github.com/repos/ARMmbed/mbedtls/releases{/id}","deployments_url":"https://api.github.com/repos/ARMmbed/mbedtls/deployments","created_at":"2012-11-14T13:13:13Z","updated_at":"2018-08-21T14:17:30Z","pushed_at":"2018-08-21T16:55:29Z","git_url":"git://github.com/ARMmbed/mbedtls.git","ssh_url":"git@github.com:ARMmbed/mbedtls.git","clone_url":"https://github.com/ARMmbed/mbedtls.git","svn_url":"https://github.com/ARMmbed/mbedtls","homepage":"https://tls.mbed.org","size":30157,"stargazers_count":1497,"watchers_count":1497,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":912,"mirror_url":null,"archived":false,"open_issues_count":518,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":912,"open_issues":518,"watchers":1497,"default_branch":"development"}},"_links":{"self":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951"},"html":{"href":"https://github.com/ARMmbed/mbedtls/pull/1951"},"issue":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/issues/1951"},"comments":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/issues/1951/comments"},"review_comments":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951/comments"},"review_comment":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/pulls/1951/commits"},"statuses":{"href":"https://api.github.com/repos/ARMmbed/mbedtls/statuses/903ee3d363099bb19cd5461c156969b2c55893af"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"AndrzejKurek"}}