{"action":"created","comment":{"url":"https://api.github.com/repos/kaaproject/kaa/pulls/comments/71925947","id":71925947,"diff_hunk":"@@ -0,0 +1,417 @@\n+/*\n+ * Copyright 2014-2016 CyberVision, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *      http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+#include <stdbool.h>\n+#include <stddef.h>\n+#include <stdint.h>\n+#include <sys/stat.h>\n+#include <string.h>\n+#include <utilities/kaa_mem.h>\n+#include <platform/ext_key_utils.h>\n+#include <mbedtls/pk.h>\n+#include <mbedtls/entropy.h>\n+#include <mbedtls/ctr_drbg.h>\n+#include <mbedtls/md.h>\n+\n+#include <kaa_rsa_key_gen.h>\n+\n+#define KAA_SESSION_KEY_LENGTH         16\n+#define ENC_SESSION_KEY_LENGTH         256\n+#define KAA_SIGNATURE_LENGTH           256\n+#define AES_ECB_ENCRYPTION_CHUNCK_SIZE 16\n+#define KAA_RSA_PUBLIC_KEY_LENGTH_MAX  294\n+#define KAA_SHA1_PUB_LEN               20\n+#define KAA_SHA1_PUB_BASE64_LEN        28\n+\n+#define KAA_PRIVATE_KEY_STORAGE \"private.key\"\n+#define KAA_PUBLIC_KEY_STORAGE \"public.key\"\n+\n+/**\n+ * Contains Endpoint keys.\n+ *\n+ * The main purpose of the structure is\n+ * caching calculated keys.\n+ */\n+\n+typedef struct {\n+    uint8_t session_key[KAA_SESSION_KEY_LENGTH];\n+    uint8_t encrypted_session_key[ENC_SESSION_KEY_LENGTH];\n+    uint8_t signature[KAA_SIGNATURE_LENGTH];\n+    size_t  encrypted_session_key_length;\n+    size_t  session_key_length;\n+} endpoint_key_utils_t;\n+\n+/* Endpoint's RSA Keys */\n+static endpoint_key_utils_t keys;\n+static mbedtls_pk_context pk_context_;\n+static mbedtls_pk_context pk_pub_context;\n+\n+/* TODO(KAA-1089) */\n+__attribute__((weak))\n+void ext_get_endpoint_public_key(uint8_t **buffer, size_t *buffer_size)\n+{\n+    if (!buffer || !buffer_size) {\n+        return;\n+    }\n+    static int key_length;\n+    static int initialization = false;\n+    static uint8_t buff[KAA_RSA_PUBLIC_KEY_LENGTH_MAX];\n+    if (!initialization)\n+    {\n+        key_length = mbedtls_pk_write_pubkey_der(&pk_pub_context, buff, sizeof(buff));\n+        if (key_length < 0) {\n+            return;\n+\t}\n+        initialization = true;\n+    }\n+    *buffer = buff;\n+    *buffer_size = key_length;\n+}\n+\n+static int rsa_encrypt(mbedtls_pk_context *pk, const uint8_t *input, size_t input_len, uint8_t *output)\n+{\n+    int ret = 0;\n+\n+    mbedtls_entropy_context entropy;\n+    mbedtls_ctr_drbg_context ctr_drbg;\n+    const uint8_t pers[] = \"key_gen\";\n+\n+    mbedtls_ctr_drbg_init(&ctr_drbg);\n+    mbedtls_entropy_init(&entropy);\n+\n+    ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,\n+            pers, sizeof(pers) - 1);\n+    if (!ret) {\n+        ret = mbedtls_rsa_rsaes_pkcs1_v15_encrypt(mbedtls_pk_rsa(*pk), mbedtls_ctr_drbg_random, &ctr_drbg,\n+                MBEDTLS_RSA_PUBLIC, input_len, input, output);\n+    }\n+\n+    mbedtls_ctr_drbg_free(&ctr_drbg);\n+    mbedtls_entropy_free(&entropy);\n+\n+    return ret;\n+}\n+\n+static kaa_error_t set_rsa_public_key(mbedtls_pk_context *pk, const uint8_t *key, size_t key_size)\n+{\n+    if (!pk || !key || !key_size) {\n+        return KAA_ERR_BADPARAM;\n+    }\n+\n+    if (mbedtls_pk_parse_public_key(pk, key, key_size)!= 0) {\n+        return KAA_ERR_INVALID_PUB_KEY;\n+    }\n+\n+    return KAA_ERR_NONE;\n+}\n+\n+static kaa_error_t aes_encrypt_decrypt(int mode, const uint8_t *input, size_t input_size,\n+        uint8_t *output, const uint8_t *key)\n+{\n+    if ((input_size % 16) != 0 || !input) {\n+        return KAA_ERR_BADPARAM;\n+    }\n+\n+    if (mode != MBEDTLS_AES_ENCRYPT && mode != MBEDTLS_AES_DECRYPT) {\n+        return KAA_ERR_BADPARAM;\n+    }\n+\n+    static bool initialized = false;\n+    static mbedtls_aes_context aes_ctx;\n+\n+    if (!initialized) {\n+        mbedtls_aes_init(&aes_ctx);\n+        initialized = true;\n+    }\n+\n+    if (mode == MBEDTLS_AES_ENCRYPT) {\n+        mbedtls_aes_setkey_enc(&aes_ctx, key, KAA_SESSION_KEY_LENGTH * 8);\n+        mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_ENCRYPT, input, output);\n+    } else if (mode == MBEDTLS_AES_DECRYPT) {\n+        mbedtls_aes_setkey_dec(&aes_ctx, key, KAA_SESSION_KEY_LENGTH * 8);\n+        mbedtls_aes_crypt_ecb(&aes_ctx, MBEDTLS_AES_DECRYPT, input, output);\n+    }\n+\n+    return KAA_ERR_NONE;\n+}\n+\n+static int init_aes_key(unsigned char *key, size_t bytes)\n+{\n+    mbedtls_ctr_drbg_context ctr_drbg;\n+    mbedtls_entropy_context entropy;\n+\n+    const uint8_t pers[] = \"aes_generate_key\";\n+    int ret;\n+\n+    mbedtls_entropy_init(&entropy);\n+    mbedtls_ctr_drbg_init(&ctr_drbg);\n+\n+    if ((ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy,\n+            pers, sizeof(pers) - 1)) == 0) {\n+        ret = mbedtls_ctr_drbg_random(&ctr_drbg, key, bytes);\n+    }\n+\n+    mbedtls_ctr_drbg_free(&ctr_drbg);\n+    mbedtls_entropy_free(&entropy);\n+\n+    return ret;\n+}\n+\n+/* Performs initialization of the keys */\n+kaa_error_t kaa_init_keys(void)\n+{\n+    /* Initialization should be performed only once */\n+    static bool initialized = false;\n+    if (!initialized) {\n+        /* Generate session key */\n+        if (init_aes_key(keys.session_key, KAA_SESSION_KEY_LENGTH)) {\n+            return KAA_ERR_BADDATA;\n+        }\n+        keys.session_key_length = KAA_SESSION_KEY_LENGTH;\n+        if (mbedtls_pk_parse_keyfile(&pk_context_, KAA_PRIVATE_KEY_STORAGE, NULL)) {\n+#ifdef KAA_RUNTIME_KEY_GENERATION\n+            if (rsa_genkey(&pk_context_)) {\n+                return -1;\n+            }\n+#else\n+            return KAA_ERR_BADDATA;\n+#endif\n+        }\n+         if (mbedtls_pk_parse_public_keyfile(&pk_pub_context, KAA_PUBLIC_KEY_STORAGE)) {\n+#ifdef KAA_RUNTIME_KEY_GENERATION\n+\t\tpk_pub_context = pk_context_;\n+#else\n+            return KAA_ERR_BADDATA;\n+#endif\n+        }\n+        initialized = true;\n+    }\n+\n+    return KAA_ERR_NONE;\n+}\n+\n+void  kaa_deinit_keys(void)\n+{\n+    mbedtls_pk_free(&pk_context_);\n+}\n+\n+void ext_get_endpoint_session_key(uint8_t **buffer, size_t *buffer_size)\n+{\n+    if (!buffer || !buffer_size) {\n+        return;\n+    }\n+    *buffer = keys.session_key;\n+    *buffer_size = keys.session_key_length;\n+}\n+\n+kaa_error_t ext_encrypt_data(const uint8_t *input, size_t payload_size, uint8_t *output)\n+{\n+    if (!input || !payload_size || !output) {\n+        return KAA_ERR_BADPARAM;\n+    }\n+\n+    /* Adding PKCS7 padding */\n+    size_t enc_data_size = ext_get_encrypted_data_size(payload_size);\n+    uint8_t padding = enc_data_size - payload_size;\n+    memset(output + payload_size, padding, padding);\n+\n+    /* Process the buffer chunk by chunk */\n+    while (enc_data_size >= KAA_SESSION_KEY_LENGTH) {\n+        if (aes_encrypt_decrypt(MBEDTLS_AES_ENCRYPT, input,","path":"client/client-multi/client-c/src/kaa/platform-impl/posix/key_utils.c","position":183,"original_position":233,"commit_id":"062247a02b33659b3fdb21a41a520c7cc031e05b","original_commit_id":"73b075dd06b5bec72cbca353fbf1f6c8e80eb6c1","user":{"login":"forGGe","id":5261821,"avatar_url":"https://avatars.githubusercontent.com/u/5261821?v=3","gravatar_id":"","url":"https://api.github.com/users/forGGe","html_url":"https://github.com/forGGe","followers_url":"https://api.github.com/users/forGGe/followers","following_url":"https://api.github.com/users/forGGe/following{/other_user}","gists_url":"https://api.github.com/users/forGGe/gists{/gist_id}","starred_url":"https://api.github.com/users/forGGe/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/forGGe/subscriptions","organizations_url":"https://api.github.com/users/forGGe/orgs","repos_url":"https://api.github.com/users/forGGe/repos","events_url":"https://api.github.com/users/forGGe/events{/privacy}","received_events_url":"https://api.github.com/users/forGGe/received_events","type":"User","site_admin":false},"body":"Comment no longer valid","created_at":"2016-07-22T18:40:01Z","updated_at":"2016-07-22T18:40:01Z","html_url":"https://github.com/kaaproject/kaa/pull/851#discussion_r71925947","pull_request_url":"https://api.github.com/repos/kaaproject/kaa/pulls/851","_links":{"self":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/comments/71925947"},"html":{"href":"https://github.com/kaaproject/kaa/pull/851#discussion_r71925947"},"pull_request":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/851"}}},"pull_request":{"url":"https://api.github.com/repos/kaaproject/kaa/pulls/851","id":76644682,"html_url":"https://github.com/kaaproject/kaa/pull/851","diff_url":"https://github.com/kaaproject/kaa/pull/851.diff","patch_url":"https://github.com/kaaproject/kaa/pull/851.patch","issue_url":"https://api.github.com/repos/kaaproject/kaa/issues/851","number":851,"state":"open","locked":false,"title":"KAA-1233 Client authentication key pair generation build parameter","user":{"login":"Dubland","id":10281806,"avatar_url":"https://avatars.githubusercontent.com/u/10281806?v=3","gravatar_id":"","url":"https://api.github.com/users/Dubland","html_url":"https://github.com/Dubland","followers_url":"https://api.github.com/users/Dubland/followers","following_url":"https://api.github.com/users/Dubland/following{/other_user}","gists_url":"https://api.github.com/users/Dubland/gists{/gist_id}","starred_url":"https://api.github.com/users/Dubland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Dubland/subscriptions","organizations_url":"https://api.github.com/users/Dubland/orgs","repos_url":"https://api.github.com/users/Dubland/repos","events_url":"https://api.github.com/users/Dubland/events{/privacy}","received_events_url":"https://api.github.com/users/Dubland/received_events","type":"User","site_admin":false},"body":"//cc @RostakaGmfun @forGGe ","created_at":"2016-07-07T18:39:45Z","updated_at":"2016-07-22T18:40:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e92790df76b1c9a7c6c383548cae9eccce952085","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/kaaproject/kaa/pulls/851/commits","review_comments_url":"https://api.github.com/repos/kaaproject/kaa/pulls/851/comments","review_comment_url":"https://api.github.com/repos/kaaproject/kaa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kaaproject/kaa/issues/851/comments","statuses_url":"https://api.github.com/repos/kaaproject/kaa/statuses/062247a02b33659b3fdb21a41a520c7cc031e05b","head":{"label":"Dubland:KAA-1233","ref":"KAA-1233","sha":"062247a02b33659b3fdb21a41a520c7cc031e05b","user":{"login":"Dubland","id":10281806,"avatar_url":"https://avatars.githubusercontent.com/u/10281806?v=3","gravatar_id":"","url":"https://api.github.com/users/Dubland","html_url":"https://github.com/Dubland","followers_url":"https://api.github.com/users/Dubland/followers","following_url":"https://api.github.com/users/Dubland/following{/other_user}","gists_url":"https://api.github.com/users/Dubland/gists{/gist_id}","starred_url":"https://api.github.com/users/Dubland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Dubland/subscriptions","organizations_url":"https://api.github.com/users/Dubland/orgs","repos_url":"https://api.github.com/users/Dubland/repos","events_url":"https://api.github.com/users/Dubland/events{/privacy}","received_events_url":"https://api.github.com/users/Dubland/received_events","type":"User","site_admin":false},"repo":{"id":48445570,"name":"kaa","full_name":"Dubland/kaa","owner":{"login":"Dubland","id":10281806,"avatar_url":"https://avatars.githubusercontent.com/u/10281806?v=3","gravatar_id":"","url":"https://api.github.com/users/Dubland","html_url":"https://github.com/Dubland","followers_url":"https://api.github.com/users/Dubland/followers","following_url":"https://api.github.com/users/Dubland/following{/other_user}","gists_url":"https://api.github.com/users/Dubland/gists{/gist_id}","starred_url":"https://api.github.com/users/Dubland/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Dubland/subscriptions","organizations_url":"https://api.github.com/users/Dubland/orgs","repos_url":"https://api.github.com/users/Dubland/repos","events_url":"https://api.github.com/users/Dubland/events{/privacy}","received_events_url":"https://api.github.com/users/Dubland/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Dubland/kaa","description":"Kaa open-source middleware platform for building, managing, and integrating connected products with the Internet of Everything.","fork":true,"url":"https://api.github.com/repos/Dubland/kaa","forks_url":"https://api.github.com/repos/Dubland/kaa/forks","keys_url":"https://api.github.com/repos/Dubland/kaa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Dubland/kaa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Dubland/kaa/teams","hooks_url":"https://api.github.com/repos/Dubland/kaa/hooks","issue_events_url":"https://api.github.com/repos/Dubland/kaa/issues/events{/number}","events_url":"https://api.github.com/repos/Dubland/kaa/events","assignees_url":"https://api.github.com/repos/Dubland/kaa/assignees{/user}","branches_url":"https://api.github.com/repos/Dubland/kaa/branches{/branch}","tags_url":"https://api.github.com/repos/Dubland/kaa/tags","blobs_url":"https://api.github.com/repos/Dubland/kaa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Dubland/kaa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Dubland/kaa/git/refs{/sha}","trees_url":"https://api.github.com/repos/Dubland/kaa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Dubland/kaa/statuses/{sha}","languages_url":"https://api.github.com/repos/Dubland/kaa/languages","stargazers_url":"https://api.github.com/repos/Dubland/kaa/stargazers","contributors_url":"https://api.github.com/repos/Dubland/kaa/contributors","subscribers_url":"https://api.github.com/repos/Dubland/kaa/subscribers","subscription_url":"https://api.github.com/repos/Dubland/kaa/subscription","commits_url":"https://api.github.com/repos/Dubland/kaa/commits{/sha}","git_commits_url":"https://api.github.com/repos/Dubland/kaa/git/commits{/sha}","comments_url":"https://api.github.com/repos/Dubland/kaa/comments{/number}","issue_comment_url":"https://api.github.com/repos/Dubland/kaa/issues/comments{/number}","contents_url":"https://api.github.com/repos/Dubland/kaa/contents/{+path}","compare_url":"https://api.github.com/repos/Dubland/kaa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Dubland/kaa/merges","archive_url":"https://api.github.com/repos/Dubland/kaa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Dubland/kaa/downloads","issues_url":"https://api.github.com/repos/Dubland/kaa/issues{/number}","pulls_url":"https://api.github.com/repos/Dubland/kaa/pulls{/number}","milestones_url":"https://api.github.com/repos/Dubland/kaa/milestones{/number}","notifications_url":"https://api.github.com/repos/Dubland/kaa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Dubland/kaa/labels{/name}","releases_url":"https://api.github.com/repos/Dubland/kaa/releases{/id}","deployments_url":"https://api.github.com/repos/Dubland/kaa/deployments","created_at":"2015-12-22T17:37:34Z","updated_at":"2016-03-31T16:08:30Z","pushed_at":"2016-07-22T14:03:19Z","git_url":"git://github.com/Dubland/kaa.git","ssh_url":"git@github.com:Dubland/kaa.git","clone_url":"https://github.com/Dubland/kaa.git","svn_url":"https://github.com/Dubland/kaa","homepage":"http://www.kaaproject.org","size":245051,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kaaproject:develop","ref":"develop","sha":"69d653bb1576e98c920e457cdb2b152ee2475ab2","user":{"login":"kaaproject","id":6984613,"avatar_url":"https://avatars.githubusercontent.com/u/6984613?v=3","gravatar_id":"","url":"https://api.github.com/users/kaaproject","html_url":"https://github.com/kaaproject","followers_url":"https://api.github.com/users/kaaproject/followers","following_url":"https://api.github.com/users/kaaproject/following{/other_user}","gists_url":"https://api.github.com/users/kaaproject/gists{/gist_id}","starred_url":"https://api.github.com/users/kaaproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaaproject/subscriptions","organizations_url":"https://api.github.com/users/kaaproject/orgs","repos_url":"https://api.github.com/users/kaaproject/repos","events_url":"https://api.github.com/users/kaaproject/events{/privacy}","received_events_url":"https://api.github.com/users/kaaproject/received_events","type":"Organization","site_admin":false},"repo":{"id":17839346,"name":"kaa","full_name":"kaaproject/kaa","owner":{"login":"kaaproject","id":6984613,"avatar_url":"https://avatars.githubusercontent.com/u/6984613?v=3","gravatar_id":"","url":"https://api.github.com/users/kaaproject","html_url":"https://github.com/kaaproject","followers_url":"https://api.github.com/users/kaaproject/followers","following_url":"https://api.github.com/users/kaaproject/following{/other_user}","gists_url":"https://api.github.com/users/kaaproject/gists{/gist_id}","starred_url":"https://api.github.com/users/kaaproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaaproject/subscriptions","organizations_url":"https://api.github.com/users/kaaproject/orgs","repos_url":"https://api.github.com/users/kaaproject/repos","events_url":"https://api.github.com/users/kaaproject/events{/privacy}","received_events_url":"https://api.github.com/users/kaaproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kaaproject/kaa","description":"Kaa open-source middleware platform for building, managing, and integrating connected products with the Internet of Everything.","fork":false,"url":"https://api.github.com/repos/kaaproject/kaa","forks_url":"https://api.github.com/repos/kaaproject/kaa/forks","keys_url":"https://api.github.com/repos/kaaproject/kaa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kaaproject/kaa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kaaproject/kaa/teams","hooks_url":"https://api.github.com/repos/kaaproject/kaa/hooks","issue_events_url":"https://api.github.com/repos/kaaproject/kaa/issues/events{/number}","events_url":"https://api.github.com/repos/kaaproject/kaa/events","assignees_url":"https://api.github.com/repos/kaaproject/kaa/assignees{/user}","branches_url":"https://api.github.com/repos/kaaproject/kaa/branches{/branch}","tags_url":"https://api.github.com/repos/kaaproject/kaa/tags","blobs_url":"https://api.github.com/repos/kaaproject/kaa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kaaproject/kaa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kaaproject/kaa/git/refs{/sha}","trees_url":"https://api.github.com/repos/kaaproject/kaa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kaaproject/kaa/statuses/{sha}","languages_url":"https://api.github.com/repos/kaaproject/kaa/languages","stargazers_url":"https://api.github.com/repos/kaaproject/kaa/stargazers","contributors_url":"https://api.github.com/repos/kaaproject/kaa/contributors","subscribers_url":"https://api.github.com/repos/kaaproject/kaa/subscribers","subscription_url":"https://api.github.com/repos/kaaproject/kaa/subscription","commits_url":"https://api.github.com/repos/kaaproject/kaa/commits{/sha}","git_commits_url":"https://api.github.com/repos/kaaproject/kaa/git/commits{/sha}","comments_url":"https://api.github.com/repos/kaaproject/kaa/comments{/number}","issue_comment_url":"https://api.github.com/repos/kaaproject/kaa/issues/comments{/number}","contents_url":"https://api.github.com/repos/kaaproject/kaa/contents/{+path}","compare_url":"https://api.github.com/repos/kaaproject/kaa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kaaproject/kaa/merges","archive_url":"https://api.github.com/repos/kaaproject/kaa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kaaproject/kaa/downloads","issues_url":"https://api.github.com/repos/kaaproject/kaa/issues{/number}","pulls_url":"https://api.github.com/repos/kaaproject/kaa/pulls{/number}","milestones_url":"https://api.github.com/repos/kaaproject/kaa/milestones{/number}","notifications_url":"https://api.github.com/repos/kaaproject/kaa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kaaproject/kaa/labels{/name}","releases_url":"https://api.github.com/repos/kaaproject/kaa/releases{/id}","deployments_url":"https://api.github.com/repos/kaaproject/kaa/deployments","created_at":"2014-03-17T18:48:31Z","updated_at":"2016-07-21T13:29:59Z","pushed_at":"2016-07-22T18:33:31Z","git_url":"git://github.com/kaaproject/kaa.git","ssh_url":"git@github.com:kaaproject/kaa.git","clone_url":"https://github.com/kaaproject/kaa.git","svn_url":"https://github.com/kaaproject/kaa","homepage":"http://www.kaaproject.org","size":148102,"stargazers_count":334,"watchers_count":334,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":127,"mirror_url":null,"open_issues_count":27,"forks":127,"open_issues":27,"watchers":334,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/851"},"html":{"href":"https://github.com/kaaproject/kaa/pull/851"},"issue":{"href":"https://api.github.com/repos/kaaproject/kaa/issues/851"},"comments":{"href":"https://api.github.com/repos/kaaproject/kaa/issues/851/comments"},"review_comments":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/851/comments"},"review_comment":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/851/commits"},"statuses":{"href":"https://api.github.com/repos/kaaproject/kaa/statuses/062247a02b33659b3fdb21a41a520c7cc031e05b"}}}}
{"actor":{"display_login":"forGGe"}}