{"action":"created","comment":{"url":"https://api.github.com/repos/stefanberger/libtpms/pulls/comments/287509641","pull_request_review_id":241926845,"id":287509641,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI4NzUwOTY0MQ==","diff_hunk":"@@ -458,6 +461,262 @@ CryptSymmetricDecrypt(\n \t}\n     return TPM_RC_SUCCESS;\n }\n+\n+// libtpms added begin\n+#else\n+\n+#if ALG_TDES && ALG_CTR\n+// Emulated TDES Counter mode since OpenSSL does not implement it\n+static void TDES_CTR(const BYTE *key,            // IN\n+                     INT32       keySizeInBits,  // IN\n+                     INT32       dSize,          // IN\n+                     const BYTE *dIn,            // IN\n+                     BYTE       *iv,             // IN\n+                     BYTE       *dOut,           // OUT\n+                     INT16       blockSize       // IN\n+                     )\n+{\n+    tpmCryptKeySchedule_t   keySchedule;\n+    int                     i;\n+    BYTE                    tmp[MAX_SYM_BLOCK_SIZE];\n+    BYTE                   *pT;\n+\n+    TDES_set_encrypt_key(key, keySizeInBits,\n+                         (tpmKeyScheduleTDES *)&keySchedule.TDES);\n+\n+    for(; dSize > 0; dSize -= blockSize)\n+\t{\n+\t    // Encrypt the current value of the IV(counter)\n+\t    TDES_encrypt(iv, tmp, (tpmKeyScheduleTDES *)&keySchedule.TDES);\n+\t    //increment the counter (counter is big-endian so start at end)\n+\t    for(i = blockSize - 1; i >= 0; i--)\n+\t\tif((iv[i] += 1) != 0)\n+\t\t    break;\n+\t    // XOR the encrypted counter value with input and put into output\n+\t    pT = tmp;\n+\t    for(i = (dSize < blockSize) ? dSize : blockSize; i > 0; i--)\n+\t\t*dOut++ = *dIn++ ^ *pT++;\n+\t}\n+}\n+#endif\n+\n+/* 10.2.20.5 Symmetric Encryption */\n+/* This function performs symmetric encryption based on the mode. */\n+/* Error Returns Meaning */\n+/* TPM_RC_SIZE dSize is not a multiple of the block size for an algorithm that requires it */\n+/* TPM_RC_FAILURE Fatal error */\n+LIB_EXPORT TPM_RC\n+CryptSymmetricEncrypt(\n+\t\t      BYTE                *dOut,          // OUT:\n+\t\t      TPM_ALG_ID           algorithm,     // IN: the symmetric algorithm\n+\t\t      UINT16               keySizeInBits, // IN: key size in bits\n+\t\t      const BYTE          *key,           // IN: key buffer. The size of this buffer\n+\t\t      //     in bytes is (keySizeInBits + 7) / 8\n+\t\t      TPM2B_IV            *ivInOut,       // IN/OUT: IV for decryption.\n+\t\t      TPM_ALG_ID           mode,          // IN: Mode to use\n+\t\t      INT32                dSize,         // IN: data size (may need to be a\n+\t\t      //     multiple of the blockSize)\n+\t\t      const BYTE          *dIn            // IN: data buffer\n+\t\t      )\n+{\n+    INT16                blockSize;\n+    BYTE                *iv;\n+    BYTE                 defaultIv[MAX_SYM_BLOCK_SIZE] = {0};\n+    evpfunc              evpfn;\n+    EVP_CIPHER_CTX      *ctx = NULL;\n+    int                  outlen1, outlen2;\n+    BYTE                *pOut = dOut;\n+    BYTE                *buffer = NULL; // for in-place encryption\n+    UINT32               buffersize = 0;\n+    BYTE                 keyToUse[MAX_SYM_KEY_BYTES];\n+    UINT16               keyToUseLen = (UINT16)sizeof(keyToUse);\n+    TPM_RC               retVal = TPM_RC_SUCCESS;\n+\n+    pAssert(dOut != NULL && key != NULL && dIn != NULL);\n+    if(dSize == 0)\n+\treturn TPM_RC_SUCCESS;\n+    TEST(algorithm);\n+    blockSize = CryptGetSymmetricBlockSize(algorithm, keySizeInBits);\n+    if(blockSize == 0)\n+\treturn TPM_RC_FAILURE;\n+    // If the iv is provided, then it is expected to be block sized. In some cases,\n+    // the caller is providing an array of 0's that is equal to [MAX_SYM_BLOCK_SIZE]\n+    // with no knowledge of the actual block size. This function will set it.\n+    if((ivInOut != NULL) && (mode != ALG_ECB_VALUE))\n+\t{\n+\t    ivInOut->t.size = blockSize;\n+\t    iv = ivInOut->t.buffer;\n+\t}\n+    else\n+\tiv = defaultIv;\n+\n+    switch (mode)\n+        {\n+          case ALG_ECB_VALUE:\n+          case ALG_CBC_VALUE:\n+\t    // For ECB & CBC the data size must be an even multiple of the\n+\t    // cipher block size\n+\t    if((dSize % blockSize) != 0)\n+\t\treturn TPM_RC_SIZE;\n+        }\n+\n+    evpfn = GetEVPCipher(algorithm, keySizeInBits, mode, key,\n+                         keyToUse, &keyToUseLen);\n+    if (evpfn == NULL)\n+        return TPM_RC_FAILURE;\n+\n+    if (dIn == dOut) {\n+        // in-place encryption; we use a temp buffer\n+        buffersize = TPM2_ROUNDUP(dSize, blockSize);\n+        buffer = malloc(buffersize);\n+        if (buffer == NULL)\n+            ERROR_RETURN(TPM_RC_FAILURE);\n+\n+        pOut = buffer;\n+    }\n+\n+#if ALG_TDES && ALG_CTR\n+    if (algorithm == TPM_ALG_TDES && mode == ALG_CTR_VALUE) {\n+        TDES_CTR(keyToUse, keyToUseLen * 8, dSize, dIn, iv, pOut, blockSize);\n+        if (pOut != dOut)\n+            memcpy(dOut, pOut, dSize);\n+        ERROR_RETURN(TPM_RC_SUCCESS);\n+    }\n+#endif\n+\n+    ctx = EVP_CIPHER_CTX_new();\n+    if (!ctx)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    if (EVP_EncryptInit_ex(ctx, evpfn(), NULL, keyToUse, iv) != 1)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_NO_PADDING);\n+    if (EVP_EncryptUpdate(ctx, pOut, &outlen1, dIn, dSize) != 1)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_NO_PADDING);\n+    if (EVP_EncryptFinal_ex(ctx, pOut + outlen1, &outlen2) != 1)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    pAssert(dSize >= outlen1 + outlen2);\n+\n+    if (pOut != dOut)\n+        memcpy(dOut, pOut, outlen1 + outlen2);\n+\n+ Exit:\n+    clear_and_free(buffer, buffersize);\n+    EVP_CIPHER_CTX_free(ctx);\n+\n+    return retVal;\n+}\n+\n+/* 10.2.20.5.1 CryptSymmetricDecrypt() */\n+/* This function performs symmetric decryption based on the mode. */\n+/* Error Returns Meaning */\n+/* TPM_RC_FAILURE A fatal error */\n+/* TPM_RCS_SIZE dSize is not a multiple of the block size for an algorithm that requires it */\n+LIB_EXPORT TPM_RC\n+CryptSymmetricDecrypt(\n+\t\t      BYTE                *dOut,          // OUT: decrypted data\n+\t\t      TPM_ALG_ID           algorithm,     // IN: the symmetric algorithm\n+\t\t      UINT16               keySizeInBits, // IN: key size in bits\n+\t\t      const BYTE          *key,           // IN: key buffer. The size of this buffer\n+\t\t      //     in bytes is (keySizeInBits + 7) / 8\n+\t\t      TPM2B_IV            *ivInOut,       // IN/OUT: IV for decryption.\n+\t\t      TPM_ALG_ID           mode,          // IN: Mode to use\n+\t\t      INT32                dSize,         // IN: data size (may need to be a\n+\t\t      //     multiple of the blockSize)\n+\t\t      const BYTE          *dIn            // IN: data buffer\n+\t\t      )\n+{\n+    INT16                blockSize;\n+    BYTE                *iv;\n+    BYTE                 defaultIv[MAX_SYM_BLOCK_SIZE] = {0};\n+    evpfunc              evpfn;\n+    EVP_CIPHER_CTX      *ctx = NULL;\n+    int                  outlen1, outlen2;\n+    BYTE                *pOut = dOut;\n+    BYTE                *buffer = NULL;\n+    UINT32               buffersize = 0;\n+    BYTE                 keyToUse[MAX_SYM_KEY_BYTES];\n+    UINT16               keyToUseLen = (UINT16)sizeof(keyToUse);\n+    TPM_RC               retVal = TPM_RC_SUCCESS;\n+\n+    // These are used but the compiler can't tell because they are initialized\n+    // in case statements and it can't tell if they are always initialized\n+    // when needed, so... Comment these out if the compiler can tell or doesn't\n+    // care that these are initialized before use.\n+    pAssert(dOut != NULL && key != NULL && dIn != NULL);\n+    if(dSize == 0)\n+\treturn TPM_RC_SUCCESS;\n+    TEST(algorithm);\n+    blockSize = CryptGetSymmetricBlockSize(algorithm, keySizeInBits);\n+    if(blockSize == 0)\n+\treturn TPM_RC_FAILURE;\n+    // If the iv is provided, then it is expected to be block sized. In some cases,\n+    // the caller is providing an array of 0's that is equal to [MAX_SYM_BLOCK_SIZE]\n+    // with no knowledge of the actual block size. This function will set it.\n+    if((ivInOut != NULL) && (mode != ALG_ECB_VALUE))\n+\t{\n+\t    ivInOut->t.size = blockSize;\n+\t    iv = ivInOut->t.buffer;\n+\t}\n+    else\n+\tiv = defaultIv;\n+\n+    evpfn = GetEVPCipher(algorithm, keySizeInBits, mode, key,\n+                         keyToUse, &keyToUseLen);\n+    if (evpfn ==  NULL)\n+        return TPM_RC_FAILURE;\n+\n+    if (dIn == dOut) {\n+        // in-place encryption; we use a temp buffer\n+        buffersize = TPM2_ROUNDUP(dSize, blockSize);\n+        buffer = malloc(buffersize);\n+        if (buffer == NULL)\n+            ERROR_RETURN(TPM_RC_FAILURE);\n+        pOut = buffer;\n+    }\n+\n+#if ALG_TDES && ALG_CTR\n+    if (algorithm == TPM_ALG_TDES && mode == ALG_CTR_VALUE) {\n+        TDES_CTR(keyToUse, keyToUseLen * 8, dSize, dIn, iv, pOut, blockSize);\n+        if (pOut != dOut)\n+            memcpy(dOut, pOut, dSize);\n+        ERROR_RETURN(TPM_RC_SUCCESS);\n+    }\n+#endif\n+\n+    ctx = EVP_CIPHER_CTX_new();\n+    if (!ctx)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    if (EVP_DecryptInit_ex(ctx, evpfn(), NULL, keyToUse, iv) != 1)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_NO_PADDING);\n+    if (EVP_DecryptUpdate(ctx, pOut, &outlen1, dIn, dSize) != 1)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_NO_PADDING);\n+    if (EVP_DecryptFinal(ctx, pOut + outlen1, &outlen2) != 1)\n+        ERROR_RETURN(TPM_RC_FAILURE);\n+\n+    pAssert(dSize >= outlen1 + outlen2);","path":"src/tpm2/crypto/openssl/CryptSym.c","position":263,"original_position":263,"commit_id":"e7f33c52e22f715d341d0620f85d44d987599bdc","original_commit_id":"e7f33c52e22f715d341d0620f85d44d987599bdc","user":{"login":"simo5","id":8332609,"node_id":"MDQ6VXNlcjgzMzI2MDk=","avatar_url":"https://avatars2.githubusercontent.com/u/8332609?v=4","gravatar_id":"","url":"https://api.github.com/users/simo5","html_url":"https://github.com/simo5","followers_url":"https://api.github.com/users/simo5/followers","following_url":"https://api.github.com/users/simo5/following{/other_user}","gists_url":"https://api.github.com/users/simo5/gists{/gist_id}","starred_url":"https://api.github.com/users/simo5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/simo5/subscriptions","organizations_url":"https://api.github.com/users/simo5/orgs","repos_url":"https://api.github.com/users/simo5/repos","events_url":"https://api.github.com/users/simo5/events{/privacy}","received_events_url":"https://api.github.com/users/simo5/received_events","type":"User","site_admin":false},"body":"same as for encryption, too late here","created_at":"2019-05-24T20:44:22Z","updated_at":"2019-05-24T20:55:36Z","html_url":"https://github.com/stefanberger/libtpms/pull/61#discussion_r287509641","pull_request_url":"https://api.github.com/repos/stefanberger/libtpms/pulls/61","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/stefanberger/libtpms/pulls/comments/287509641"},"html":{"href":"https://github.com/stefanberger/libtpms/pull/61#discussion_r287509641"},"pull_request":{"href":"https://api.github.com/repos/stefanberger/libtpms/pulls/61"}}},"pull_request":{"url":"https://api.github.com/repos/stefanberger/libtpms/pulls/61","id":282103480,"node_id":"MDExOlB1bGxSZXF1ZXN0MjgyMTAzNDgw","html_url":"https://github.com/stefanberger/libtpms/pull/61","diff_url":"https://github.com/stefanberger/libtpms/pull/61.diff","patch_url":"https://github.com/stefanberger/libtpms/pull/61.patch","issue_url":"https://api.github.com/repos/stefanberger/libtpms/issues/61","number":61,"state":"open","locked":false,"title":"Have the TPM 2 code use OpenSSL's symmetric cipher functions for AES and TDES.","user":{"login":"stefanberger","id":1873348,"node_id":"MDQ6VXNlcjE4NzMzNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1873348?v=4","gravatar_id":"","url":"https://api.github.com/users/stefanberger","html_url":"https://github.com/stefanberger","followers_url":"https://api.github.com/users/stefanberger/followers","following_url":"https://api.github.com/users/stefanberger/following{/other_user}","gists_url":"https://api.github.com/users/stefanberger/gists{/gist_id}","starred_url":"https://api.github.com/users/stefanberger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stefanberger/subscriptions","organizations_url":"https://api.github.com/users/stefanberger/orgs","repos_url":"https://api.github.com/users/stefanberger/repos","events_url":"https://api.github.com/users/stefanberger/events{/privacy}","received_events_url":"https://api.github.com/users/stefanberger/received_events","type":"User","site_admin":false},"body":"This set of patches adds an implementation for using OpenSSL's symmetric cipher functions (EVP) for AES and TDES. We leave the original code around, which again can be activate by setting USE_OPENSSL_FUNCTIONS to 'NO'.","created_at":"2019-05-24T17:43:34Z","updated_at":"2019-05-24T20:55:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bf8de08219f23e0d51d17e0686421187ae6d4a90","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/stefanberger/libtpms/pulls/61/commits","review_comments_url":"https://api.github.com/repos/stefanberger/libtpms/pulls/61/comments","review_comment_url":"https://api.github.com/repos/stefanberger/libtpms/pulls/comments{/number}","comments_url":"https://api.github.com/repos/stefanberger/libtpms/issues/61/comments","statuses_url":"https://api.github.com/repos/stefanberger/libtpms/statuses/e7f33c52e22f715d341d0620f85d44d987599bdc","head":{"label":"stefanberger:master.next","ref":"master.next","sha":"e7f33c52e22f715d341d0620f85d44d987599bdc","user":{"login":"stefanberger","id":1873348,"node_id":"MDQ6VXNlcjE4NzMzNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1873348?v=4","gravatar_id":"","url":"https://api.github.com/users/stefanberger","html_url":"https://github.com/stefanberger","followers_url":"https://api.github.com/users/stefanberger/followers","following_url":"https://api.github.com/users/stefanberger/following{/other_user}","gists_url":"https://api.github.com/users/stefanberger/gists{/gist_id}","starred_url":"https://api.github.com/users/stefanberger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stefanberger/subscriptions","organizations_url":"https://api.github.com/users/stefanberger/orgs","repos_url":"https://api.github.com/users/stefanberger/repos","events_url":"https://api.github.com/users/stefanberger/events{/privacy}","received_events_url":"https://api.github.com/users/stefanberger/received_events","type":"User","site_admin":false},"repo":{"id":14027648,"node_id":"MDEwOlJlcG9zaXRvcnkxNDAyNzY0OA==","name":"libtpms","full_name":"stefanberger/libtpms","private":false,"owner":{"login":"stefanberger","id":1873348,"node_id":"MDQ6VXNlcjE4NzMzNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1873348?v=4","gravatar_id":"","url":"https://api.github.com/users/stefanberger","html_url":"https://github.com/stefanberger","followers_url":"https://api.github.com/users/stefanberger/followers","following_url":"https://api.github.com/users/stefanberger/following{/other_user}","gists_url":"https://api.github.com/users/stefanberger/gists{/gist_id}","starred_url":"https://api.github.com/users/stefanberger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stefanberger/subscriptions","organizations_url":"https://api.github.com/users/stefanberger/orgs","repos_url":"https://api.github.com/users/stefanberger/repos","events_url":"https://api.github.com/users/stefanberger/events{/privacy}","received_events_url":"https://api.github.com/users/stefanberger/received_events","type":"User","site_admin":false},"html_url":"https://github.com/stefanberger/libtpms","description":"The libtpms library provides software emulation of a Trusted Platform Module (TPM 1.2 and TPM 2.0)","fork":false,"url":"https://api.github.com/repos/stefanberger/libtpms","forks_url":"https://api.github.com/repos/stefanberger/libtpms/forks","keys_url":"https://api.github.com/repos/stefanberger/libtpms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stefanberger/libtpms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stefanberger/libtpms/teams","hooks_url":"https://api.github.com/repos/stefanberger/libtpms/hooks","issue_events_url":"https://api.github.com/repos/stefanberger/libtpms/issues/events{/number}","events_url":"https://api.github.com/repos/stefanberger/libtpms/events","assignees_url":"https://api.github.com/repos/stefanberger/libtpms/assignees{/user}","branches_url":"https://api.github.com/repos/stefanberger/libtpms/branches{/branch}","tags_url":"https://api.github.com/repos/stefanberger/libtpms/tags","blobs_url":"https://api.github.com/repos/stefanberger/libtpms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stefanberger/libtpms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stefanberger/libtpms/git/refs{/sha}","trees_url":"https://api.github.com/repos/stefanberger/libtpms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stefanberger/libtpms/statuses/{sha}","languages_url":"https://api.github.com/repos/stefanberger/libtpms/languages","stargazers_url":"https://api.github.com/repos/stefanberger/libtpms/stargazers","contributors_url":"https://api.github.com/repos/stefanberger/libtpms/contributors","subscribers_url":"https://api.github.com/repos/stefanberger/libtpms/subscribers","subscription_url":"https://api.github.com/repos/stefanberger/libtpms/subscription","commits_url":"https://api.github.com/repos/stefanberger/libtpms/commits{/sha}","git_commits_url":"https://api.github.com/repos/stefanberger/libtpms/git/commits{/sha}","comments_url":"https://api.github.com/repos/stefanberger/libtpms/comments{/number}","issue_comment_url":"https://api.github.com/repos/stefanberger/libtpms/issues/comments{/number}","contents_url":"https://api.github.com/repos/stefanberger/libtpms/contents/{+path}","compare_url":"https://api.github.com/repos/stefanberger/libtpms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stefanberger/libtpms/merges","archive_url":"https://api.github.com/repos/stefanberger/libtpms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stefanberger/libtpms/downloads","issues_url":"https://api.github.com/repos/stefanberger/libtpms/issues{/number}","pulls_url":"https://api.github.com/repos/stefanberger/libtpms/pulls{/number}","milestones_url":"https://api.github.com/repos/stefanberger/libtpms/milestones{/number}","notifications_url":"https://api.github.com/repos/stefanberger/libtpms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stefanberger/libtpms/labels{/name}","releases_url":"https://api.github.com/repos/stefanberger/libtpms/releases{/id}","deployments_url":"https://api.github.com/repos/stefanberger/libtpms/deployments","created_at":"2013-10-31T20:31:32Z","updated_at":"2019-05-24T16:59:13Z","pushed_at":"2019-05-24T17:43:35Z","git_url":"git://github.com/stefanberger/libtpms.git","ssh_url":"git@github.com:stefanberger/libtpms.git","clone_url":"https://github.com/stefanberger/libtpms.git","svn_url":"https://github.com/stefanberger/libtpms","homepage":"","size":3131,"stargazers_count":35,"watchers_count":35,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":27,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":3,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":27,"open_issues":3,"watchers":35,"default_branch":"master"}},"base":{"label":"stefanberger:master","ref":"master","sha":"7e6473b9380db97fd62c8a09ec176c2bbb5ebdd5","user":{"login":"stefanberger","id":1873348,"node_id":"MDQ6VXNlcjE4NzMzNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1873348?v=4","gravatar_id":"","url":"https://api.github.com/users/stefanberger","html_url":"https://github.com/stefanberger","followers_url":"https://api.github.com/users/stefanberger/followers","following_url":"https://api.github.com/users/stefanberger/following{/other_user}","gists_url":"https://api.github.com/users/stefanberger/gists{/gist_id}","starred_url":"https://api.github.com/users/stefanberger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stefanberger/subscriptions","organizations_url":"https://api.github.com/users/stefanberger/orgs","repos_url":"https://api.github.com/users/stefanberger/repos","events_url":"https://api.github.com/users/stefanberger/events{/privacy}","received_events_url":"https://api.github.com/users/stefanberger/received_events","type":"User","site_admin":false},"repo":{"id":14027648,"node_id":"MDEwOlJlcG9zaXRvcnkxNDAyNzY0OA==","name":"libtpms","full_name":"stefanberger/libtpms","private":false,"owner":{"login":"stefanberger","id":1873348,"node_id":"MDQ6VXNlcjE4NzMzNDg=","avatar_url":"https://avatars3.githubusercontent.com/u/1873348?v=4","gravatar_id":"","url":"https://api.github.com/users/stefanberger","html_url":"https://github.com/stefanberger","followers_url":"https://api.github.com/users/stefanberger/followers","following_url":"https://api.github.com/users/stefanberger/following{/other_user}","gists_url":"https://api.github.com/users/stefanberger/gists{/gist_id}","starred_url":"https://api.github.com/users/stefanberger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stefanberger/subscriptions","organizations_url":"https://api.github.com/users/stefanberger/orgs","repos_url":"https://api.github.com/users/stefanberger/repos","events_url":"https://api.github.com/users/stefanberger/events{/privacy}","received_events_url":"https://api.github.com/users/stefanberger/received_events","type":"User","site_admin":false},"html_url":"https://github.com/stefanberger/libtpms","description":"The libtpms library provides software emulation of a Trusted Platform Module (TPM 1.2 and TPM 2.0)","fork":false,"url":"https://api.github.com/repos/stefanberger/libtpms","forks_url":"https://api.github.com/repos/stefanberger/libtpms/forks","keys_url":"https://api.github.com/repos/stefanberger/libtpms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stefanberger/libtpms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stefanberger/libtpms/teams","hooks_url":"https://api.github.com/repos/stefanberger/libtpms/hooks","issue_events_url":"https://api.github.com/repos/stefanberger/libtpms/issues/events{/number}","events_url":"https://api.github.com/repos/stefanberger/libtpms/events","assignees_url":"https://api.github.com/repos/stefanberger/libtpms/assignees{/user}","branches_url":"https://api.github.com/repos/stefanberger/libtpms/branches{/branch}","tags_url":"https://api.github.com/repos/stefanberger/libtpms/tags","blobs_url":"https://api.github.com/repos/stefanberger/libtpms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stefanberger/libtpms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stefanberger/libtpms/git/refs{/sha}","trees_url":"https://api.github.com/repos/stefanberger/libtpms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stefanberger/libtpms/statuses/{sha}","languages_url":"https://api.github.com/repos/stefanberger/libtpms/languages","stargazers_url":"https://api.github.com/repos/stefanberger/libtpms/stargazers","contributors_url":"https://api.github.com/repos/stefanberger/libtpms/contributors","subscribers_url":"https://api.github.com/repos/stefanberger/libtpms/subscribers","subscription_url":"https://api.github.com/repos/stefanberger/libtpms/subscription","commits_url":"https://api.github.com/repos/stefanberger/libtpms/commits{/sha}","git_commits_url":"https://api.github.com/repos/stefanberger/libtpms/git/commits{/sha}","comments_url":"https://api.github.com/repos/stefanberger/libtpms/comments{/number}","issue_comment_url":"https://api.github.com/repos/stefanberger/libtpms/issues/comments{/number}","contents_url":"https://api.github.com/repos/stefanberger/libtpms/contents/{+path}","compare_url":"https://api.github.com/repos/stefanberger/libtpms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stefanberger/libtpms/merges","archive_url":"https://api.github.com/repos/stefanberger/libtpms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stefanberger/libtpms/downloads","issues_url":"https://api.github.com/repos/stefanberger/libtpms/issues{/number}","pulls_url":"https://api.github.com/repos/stefanberger/libtpms/pulls{/number}","milestones_url":"https://api.github.com/repos/stefanberger/libtpms/milestones{/number}","notifications_url":"https://api.github.com/repos/stefanberger/libtpms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stefanberger/libtpms/labels{/name}","releases_url":"https://api.github.com/repos/stefanberger/libtpms/releases{/id}","deployments_url":"https://api.github.com/repos/stefanberger/libtpms/deployments","created_at":"2013-10-31T20:31:32Z","updated_at":"2019-05-24T16:59:13Z","pushed_at":"2019-05-24T17:43:35Z","git_url":"git://github.com/stefanberger/libtpms.git","ssh_url":"git@github.com:stefanberger/libtpms.git","clone_url":"https://github.com/stefanberger/libtpms.git","svn_url":"https://github.com/stefanberger/libtpms","homepage":"","size":3131,"stargazers_count":35,"watchers_count":35,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":27,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":3,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":27,"open_issues":3,"watchers":35,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/stefanberger/libtpms/pulls/61"},"html":{"href":"https://github.com/stefanberger/libtpms/pull/61"},"issue":{"href":"https://api.github.com/repos/stefanberger/libtpms/issues/61"},"comments":{"href":"https://api.github.com/repos/stefanberger/libtpms/issues/61/comments"},"review_comments":{"href":"https://api.github.com/repos/stefanberger/libtpms/pulls/61/comments"},"review_comment":{"href":"https://api.github.com/repos/stefanberger/libtpms/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/stefanberger/libtpms/pulls/61/commits"},"statuses":{"href":"https://api.github.com/repos/stefanberger/libtpms/statuses/e7f33c52e22f715d341d0620f85d44d987599bdc"}},"author_association":"OWNER"}}
{"actor":{"display_login":"simo5"}}