GitHub PullRequestReviewCommentEvent at 2014-06-20 16:53:24
Repository: K2
Actor: asacamano
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/google/K2/pulls/comments/14029582","id":14029582,"diff_hunk":"@@ -0,0 +1,209 @@\n+/*\n+ * Copyright 2014 Google Inc. All rights reserved.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except\n+ * in compliance with the License. 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 distributed under the License\n+ * is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\n+ * or implied. See the License for the specific language governing permissions and limitations under\n+ * the License.\n+ */\n+\n+package com.google.k2crypto.keyversions;\n+\n+import static org.junit.Assert.assertEquals;\n+import static org.junit.Assert.assertArrayEquals;\n+\n+import com.google.k2crypto.keyversions.AESKeyVersion;\n+\n+import org.junit.Test;\n+\n+import java.security.InvalidAlgorithmParameterException;\n+import java.security.InvalidKeyException;\n+import java.security.NoSuchAlgorithmException;\n+import java.util.Arrays;\n+\n+import javax.crypto.BadPaddingException;\n+import javax.crypto.IllegalBlockSizeException;\n+import javax.crypto.NoSuchPaddingException;\n+\n+/**\n+ * Tests for AESkeyVersion class\n+ *\n+ * @author John Maheswaran (maheswaran@google.com)\n+ */\n+public class AESKeyVersionTest {\n+  /**\n+   * This tests the encryption and decryption methods of the AESKeyVersion class.\n+   *\n+   * @throws NoSuchAlgorithmException\n+   * @throws InvalidKeyException\n+   * @throws NoSuchPaddingException\n+   * @throws InvalidAlgorithmParameterException\n+   * @throws IllegalBlockSizeException\n+   * @throws BadPaddingException\n+   */\n+  @Test\n+  public void testEncryptDecrypt()\n+      throws NoSuchAlgorithmException,\n+      InvalidKeyException,\n+      NoSuchPaddingException,\n+      InvalidAlgorithmParameterException,\n+      IllegalBlockSizeException,\n+      BadPaddingException {\n+\n+    // create AES key\n+    AESKeyVersion keyVersion = new AESKeyVersion();\n+    // call the method to test encrypting and decrypting strings using this key version\n+    testEncryptDecryptKeyVersion(keyVersion);\n+\n+    // fail(\"Not yet implemented\");\n+\n+  }\n+\n+  /**\n+   * This tests loading a keyVersion matter byte array and using it to encrypt and decrypt a\n+   * message.\n+   *\n+   * @throws NoSuchAlgorithmException\n+   * @throws BadPaddingException\n+   * @throws IllegalBlockSizeException\n+   * @throws InvalidAlgorithmParameterException\n+   * @throws NoSuchPaddingException\n+   * @throws InvalidKeyException\n+   */\n+  @Test\n+  public void testLoadkeyVersionMatter()\n+      throws NoSuchAlgorithmException,\n+      InvalidKeyException,\n+      NoSuchPaddingException,\n+      InvalidAlgorithmParameterException,\n+      IllegalBlockSizeException,\n+      BadPaddingException {\n+    // create AES key\n+    AESKeyVersion key1 = new AESKeyVersion();\n+    // obtain the raw keyVersion matter\n+    byte[] keyVersionMatter = key1.getkeyVersionMatter();\n+    // obtain the raw initialization vector for first key\n+    byte[] initvector = key1.getInitVector();\n+\n+    // create a new keyVersion using the keyVersion matter\n+    AESKeyVersion key2 = new AESKeyVersion(keyVersionMatter, initvector);\n+\n+    // test text string that we will encrypt and then decrypt\n+    String testinput = \"weak\";\n+\n+    // encrypt the test string using FIRST key\n+    byte[] encTxt1 = key1.encryptString(testinput);\n+    // encrypt the test string using SECOND key\n+    byte[] encTxt2 = key2.encryptString(testinput);\n+\n+\n+    // test encrypted messages are the same\n+    assertArrayEquals(encTxt1, encTxt2);\n+\n+    // test that keyVersion 1 decrypts encrypted message 1\n+    assertEquals(testinput, key1.decryptString(encTxt1));\n+    // test that keyVersion 2 decrypts encrypted message 2\n+    assertEquals(testinput, key2.decryptString(encTxt2));\n+    // test that keyVersion 2 decrypts encrypted message 1\n+    assertEquals(testinput, key2.decryptString(encTxt1));\n+    // test that keyVersion 1 decrypts encrypted message 2\n+    assertEquals(testinput, key1.decryptString(encTxt2));\n+\n+  }\n+\n+  /**\n+   * This tests creating an AESKeyVersion using the builder, then using that KeyVersion to encrypt\n+   * and decrypt a message\n+   *\n+   * @throws NoSuchAlgorithmException\n+   * @throws BadPaddingException\n+   * @throws IllegalBlockSizeException\n+   * @throws InvalidAlgorithmParameterException\n+   * @throws NoSuchPaddingException\n+   * @throws InvalidKeyException\n+   */\n+  @Test\n+  public void testAESKeyVersionBuilder()\n+      throws NoSuchAlgorithmException,\n+      InvalidKeyException,\n+      NoSuchPaddingException,\n+      InvalidAlgorithmParameterException,\n+      IllegalBlockSizeException,\n+      BadPaddingException {\n+\n+    // test using the default keyVersion builder\n+    AESKeyVersion keyversion = new AESKeyVersion.AESKeyVersionBuilder().build();\n+    testEncryptDecryptKeyVersion(keyversion);\n+\n+    // ////////////////////////////\n+    // test all keyVersion version length WITHOUT mode\n+    // ////////////////////////////\n+    for (Integer keyVersionLength : new Integer[] {16, 24, 32}) {\n+      // test keyVersion version length of 16 and PKCS5 padding and ECB mode\n+      keyversion = new AESKeyVersion.AESKeyVersionBuilder().keyVersionLength(keyVersionLength)\n+          .padding(\"PKCS5PADDING\").build();\n+      testEncryptDecryptKeyVersion(keyversion);\n+\n+    }\n+\n+    // ////////////////////////////\n+    // test all keyVersion version length and mode combinations\n+    // ////////////////////////////\n+    for (Integer keyVersionLength : new Integer[] {16, 24, 32}) {\n+      for (String mode : new String[] {\"ECB\", \"CBC\", \"OFB\", \"CFB\", \"CTR\"}) {\n+        // test keyVersion version length of 16 and PKCS5 padding and ECB mode\n+        keyversion = new AESKeyVersion.AESKeyVersionBuilder().keyVersionLength(keyVersionLength)\n+            .padding(\"PKCS5PADDING\").mode(mode).build();\n+        testEncryptDecryptKeyVersion(keyversion);\n+      }\n+    }\n+\n+  }\n+\n+  /**\n+   * This is a helper method used by the testAESKeyVersionBuilder test to testthe encryption and\n+   * decryption methods of the AESKeyVersion class using a SPECIFIC KEYVERSION (specified by the\n+   * parameter)\n+   *\n+   * @param keyVersion The AESKeyVersion to use to test encryption and decryption\n+   * @throws InvalidKeyException\n+   * @throws NoSuchAlgorithmException\n+   * @throws NoSuchPaddingException\n+   * @throws InvalidAlgorithmParameterException\n+   * @throws IllegalBlockSizeException\n+   * @throws BadPaddingException\n+   */\n+  public void testEncryptDecryptKeyVersion(AESKeyVersion keyVersion)\n+      throws InvalidKeyException,\n+      NoSuchAlgorithmException,\n+      NoSuchPaddingException,\n+      InvalidAlgorithmParameterException,\n+      IllegalBlockSizeException,\n+      BadPaddingException {\n+\n+    // test text string that we will encrypt and then decrypt\n+    String testinput = \"weak\";\n+    // encrypt the test string\n+    byte[] encTxt = keyVersion.encryptString(testinput);\n+    // decrypt the message\n+    String result = keyVersion.decryptString(encTxt);\n+    // test that the decrypted result is the same as the encryption input\n+    assertEquals(testinput, result);\n+\n+    // empty string test\n+    testinput = \"\";\n+    // encrypt the test string\n+    encTxt = keyVersion.encryptString(testinput);\n+    // decrypt the message\n+    result = keyVersion.decryptString(encTxt);\n+    // test that the decrypted result is the same as the encryption input\n+    assertEquals(testinput, result);\n+\n+","path":"java/src/test/java/com/google/k2crypto/keyversions/AESKeyVersionTest.java","position":207,"original_position":207,"commit_id":"5076599a7ded3c71820459e48fee7d41603c12ac","original_commit_id":"5076599a7ded3c71820459e48fee7d41603c12ac","user":{"login":"asacamano","id":7467288,"avatar_url":"https://avatars.githubusercontent.com/u/7467288?","gravatar_id":"878a176ccb58508340fa1f4446b94f97","url":"https://api.github.com/users/asacamano","html_url":"https://github.com/asacamano","followers_url":"https://api.github.com/users/asacamano/followers","following_url":"https://api.github.com/users/asacamano/following{/other_user}","gists_url":"https://api.github.com/users/asacamano/gists{/gist_id}","starred_url":"https://api.github.com/users/asacamano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asacamano/subscriptions","organizations_url":"https://api.github.com/users/asacamano/orgs","repos_url":"https://api.github.com/users/asacamano/repos","events_url":"https://api.github.com/users/asacamano/events{/privacy}","received_events_url":"https://api.github.com/users/asacamano/received_events","type":"User","site_admin":false},"body":"nit - please remove these blank lines.","created_at":"2014-06-20T16:53:24Z","updated_at":"2014-06-20T16:53:24Z","html_url":"https://github.com/google/K2/pull/9#discussion_r14029582","pull_request_url":"https://api.github.com/repos/google/K2/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/google/K2/pulls/comments/14029582"},"html":{"href":"https://github.com/google/K2/pull/9#discussion_r14029582"},"pull_request":{"href":"https://api.github.com/repos/google/K2/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/google/K2/pulls/9","id":17382908,"html_url":"https://github.com/google/K2/pull/9","diff_url":"https://github.com/google/K2/pull/9.diff","patch_url":"https://github.com/google/K2/pull/9.patch","issue_url":"https://api.github.com/repos/google/K2/issues/9","number":9,"state":"open","title":"Added Key, KeyVersion, SymmetricKey, AESKeyVersion, AESKeyVersionTest, AESKeyVersionBuilder, KeyVersionBuilder","user":{"login":"jmaheswaran","id":7819619,"avatar_url":"https://avatars.githubusercontent.com/u/7819619?","gravatar_id":"62602337ae2adf6e902108740616ccdc","url":"https://api.github.com/users/jmaheswaran","html_url":"https://github.com/jmaheswaran","followers_url":"https://api.github.com/users/jmaheswaran/followers","following_url":"https://api.github.com/users/jmaheswaran/following{/other_user}","gists_url":"https://api.github.com/users/jmaheswaran/gists{/gist_id}","starred_url":"https://api.github.com/users/jmaheswaran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmaheswaran/subscriptions","organizations_url":"https://api.github.com/users/jmaheswaran/orgs","repos_url":"https://api.github.com/users/jmaheswaran/repos","events_url":"https://api.github.com/users/jmaheswaran/events{/privacy}","received_events_url":"https://api.github.com/users/jmaheswaran/received_events","type":"User","site_admin":false},"body":"Added the following Java classes: \r\n\r\n**Key** - represents a single Key in K2, contains a list of KeyVersions\r\n**KeyVersion** - abstract class extended by concrete implementations of KeyVersion (such as AESKeyVersion)\r\n**SymmetricKey** - abstract class to represent symmetric key versions\r\n**AESKeyVersion** - class that extends SymmetricKey and represents an AES key version in K2. Supports encryption and decryption of byte arrays and Strings. Supports creation of new AESKeyVersion as well as loading an AESKeyVersion from byte array representations of the key matter and initialization vector. Supports five different encryption modes (CBC, OFB, CTR, ECB, CFB) and three key sizes (16, 24, 32 bytes).\r\n**KeyVersionBuilder** - abstract class representing how you build a KeyVersion\r\n**AESKeyVersionBuilder** - this is a static inner class in AESKeyVersion, it is a concrete implementation of KeyVersionBuilder. Follows the builder object oriented design pattern to allow you to make a new AESKeyVersion\r\n**AESKeyVersionTest** - JUnit tests for testing encrypting and decrypting using AESKeyVersion. Also tests AESKeyVesion creation using AESKeyVersionBuilder. Tests creation and use of all different key size and mode combinations (3 sizes x 5 modes = 15 combinations).","created_at":"2014-06-19T23:45:07Z","updated_at":"2014-06-20T16:53:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5724111b0841a63f65ed4ac0afd4b05c363bc2d9","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/google/K2/pulls/9/commits","review_comments_url":"https://api.github.com/repos/google/K2/pulls/9/comments","review_comment_url":"https://api.github.com/repos/google/K2/pulls/comments/{number}","comments_url":"https://api.github.com/repos/google/K2/issues/9/comments","statuses_url":"https://api.github.com/repos/google/K2/statuses/5076599a7ded3c71820459e48fee7d41603c12ac","head":{"label":"jmaheswaran:master","ref":"master","sha":"5076599a7ded3c71820459e48fee7d41603c12ac","user":{"login":"jmaheswaran","id":7819619,"avatar_url":"https://avatars.githubusercontent.com/u/7819619?","gravatar_id":"62602337ae2adf6e902108740616ccdc","url":"https://api.github.com/users/jmaheswaran","html_url":"https://github.com/jmaheswaran","followers_url":"https://api.github.com/users/jmaheswaran/followers","following_url":"https://api.github.com/users/jmaheswaran/following{/other_user}","gists_url":"https://api.github.com/users/jmaheswaran/gists{/gist_id}","starred_url":"https://api.github.com/users/jmaheswaran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmaheswaran/subscriptions","organizations_url":"https://api.github.com/users/jmaheswaran/orgs","repos_url":"https://api.github.com/users/jmaheswaran/repos","events_url":"https://api.github.com/users/jmaheswaran/events{/privacy}","received_events_url":"https://api.github.com/users/jmaheswaran/received_events","type":"User","site_admin":false},"repo":{"id":21018863,"name":"K2","full_name":"jmaheswaran/K2","owner":{"login":"jmaheswaran","id":7819619,"avatar_url":"https://avatars.githubusercontent.com/u/7819619?","gravatar_id":"62602337ae2adf6e902108740616ccdc","url":"https://api.github.com/users/jmaheswaran","html_url":"https://github.com/jmaheswaran","followers_url":"https://api.github.com/users/jmaheswaran/followers","following_url":"https://api.github.com/users/jmaheswaran/following{/other_user}","gists_url":"https://api.github.com/users/jmaheswaran/gists{/gist_id}","starred_url":"https://api.github.com/users/jmaheswaran/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmaheswaran/subscriptions","organizations_url":"https://api.github.com/users/jmaheswaran/orgs","repos_url":"https://api.github.com/users/jmaheswaran/repos","events_url":"https://api.github.com/users/jmaheswaran/events{/privacy}","received_events_url":"https://api.github.com/users/jmaheswaran/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jmaheswaran/K2","description":"The home of the future K2 crypto library, a successor to KeyCzar.","fork":true,"url":"https://api.github.com/repos/jmaheswaran/K2","forks_url":"https://api.github.com/repos/jmaheswaran/K2/forks","keys_url":"https://api.github.com/repos/jmaheswaran/K2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jmaheswaran/K2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jmaheswaran/K2/teams","hooks_url":"https://api.github.com/repos/jmaheswaran/K2/hooks","issue_events_url":"https://api.github.com/repos/jmaheswaran/K2/issues/events{/number}","events_url":"https://api.github.com/repos/jmaheswaran/K2/events","assignees_url":"https://api.github.com/repos/jmaheswaran/K2/assignees{/user}","branches_url":"https://api.github.com/repos/jmaheswaran/K2/branches{/branch}","tags_url":"https://api.github.com/repos/jmaheswaran/K2/tags","blobs_url":"https://api.github.com/repos/jmaheswaran/K2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jmaheswaran/K2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jmaheswaran/K2/git/refs{/sha}","trees_url":"https://api.github.com/repos/jmaheswaran/K2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jmaheswaran/K2/statuses/{sha}","languages_url":"https://api.github.com/repos/jmaheswaran/K2/languages","stargazers_url":"https://api.github.com/repos/jmaheswaran/K2/stargazers","contributors_url":"https://api.github.com/repos/jmaheswaran/K2/contributors","subscribers_url":"https://api.github.com/repos/jmaheswaran/K2/subscribers","subscription_url":"https://api.github.com/repos/jmaheswaran/K2/subscription","commits_url":"https://api.github.com/repos/jmaheswaran/K2/commits{/sha}","git_commits_url":"https://api.github.com/repos/jmaheswaran/K2/git/commits{/sha}","comments_url":"https://api.github.com/repos/jmaheswaran/K2/comments{/number}","issue_comment_url":"https://api.github.com/repos/jmaheswaran/K2/issues/comments/{number}","contents_url":"https://api.github.com/repos/jmaheswaran/K2/contents/{+path}","compare_url":"https://api.github.com/repos/jmaheswaran/K2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jmaheswaran/K2/merges","archive_url":"https://api.github.com/repos/jmaheswaran/K2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jmaheswaran/K2/downloads","issues_url":"https://api.github.com/repos/jmaheswaran/K2/issues{/number}","pulls_url":"https://api.github.com/repos/jmaheswaran/K2/pulls{/number}","milestones_url":"https://api.github.com/repos/jmaheswaran/K2/milestones{/number}","notifications_url":"https://api.github.com/repos/jmaheswaran/K2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jmaheswaran/K2/labels{/name}","releases_url":"https://api.github.com/repos/jmaheswaran/K2/releases{/id}","created_at":"2014-06-19T23:19:01Z","updated_at":"2014-06-19T23:45:07Z","pushed_at":"2014-06-19T23:32:55Z","git_url":"git://github.com/jmaheswaran/K2.git","ssh_url":"git@github.com:jmaheswaran/K2.git","clone_url":"https://github.com/jmaheswaran/K2.git","svn_url":"https://github.com/jmaheswaran/K2","homepage":"http://google.github.io/K2/","size":217,"stargazers_count":0,"watchers_count":0,"language":"CSS","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"google:master","ref":"master","sha":"3bdf317aecf04b8ead6c8a599ab2113cb769b1aa","user":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?","gravatar_id":"24ba30616d2a20673f54c2aee36d159e","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":20570214,"name":"K2","full_name":"google/K2","owner":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?","gravatar_id":"24ba30616d2a20673f54c2aee36d159e","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/K2","description":"The home of the future K2 crypto library, a successor to KeyCzar.","fork":false,"url":"https://api.github.com/repos/google/K2","forks_url":"https://api.github.com/repos/google/K2/forks","keys_url":"https://api.github.com/repos/google/K2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/K2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/K2/teams","hooks_url":"https://api.github.com/repos/google/K2/hooks","issue_events_url":"https://api.github.com/repos/google/K2/issues/events{/number}","events_url":"https://api.github.com/repos/google/K2/events","assignees_url":"https://api.github.com/repos/google/K2/assignees{/user}","branches_url":"https://api.github.com/repos/google/K2/branches{/branch}","tags_url":"https://api.github.com/repos/google/K2/tags","blobs_url":"https://api.github.com/repos/google/K2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/K2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/K2/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/K2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/K2/statuses/{sha}","languages_url":"https://api.github.com/repos/google/K2/languages","stargazers_url":"https://api.github.com/repos/google/K2/stargazers","contributors_url":"https://api.github.com/repos/google/K2/contributors","subscribers_url":"https://api.github.com/repos/google/K2/subscribers","subscription_url":"https://api.github.com/repos/google/K2/subscription","commits_url":"https://api.github.com/repos/google/K2/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/K2/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/K2/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/K2/issues/comments/{number}","contents_url":"https://api.github.com/repos/google/K2/contents/{+path}","compare_url":"https://api.github.com/repos/google/K2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/K2/merges","archive_url":"https://api.github.com/repos/google/K2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/K2/downloads","issues_url":"https://api.github.com/repos/google/K2/issues{/number}","pulls_url":"https://api.github.com/repos/google/K2/pulls{/number}","milestones_url":"https://api.github.com/repos/google/K2/milestones{/number}","notifications_url":"https://api.github.com/repos/google/K2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/K2/labels{/name}","releases_url":"https://api.github.com/repos/google/K2/releases{/id}","created_at":"2014-06-06T16:21:09Z","updated_at":"2014-06-20T16:53:21Z","pushed_at":"2014-06-15T18:47:27Z","git_url":"git://github.com/google/K2.git","ssh_url":"git@github.com:google/K2.git","clone_url":"https://github.com/google/K2.git","svn_url":"https://github.com/google/K2","homepage":"http://google.github.io/K2/","size":920,"stargazers_count":10,"watchers_count":10,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":4,"mirror_url":null,"open_issues_count":3,"forks":4,"open_issues":3,"watchers":10,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/K2/pulls/9"},"html":{"href":"https://github.com/google/K2/pull/9"},"issue":{"href":"https://api.github.com/repos/google/K2/issues/9"},"comments":{"href":"https://api.github.com/repos/google/K2/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/google/K2/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/google/K2/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/google/K2/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/google/K2/statuses/5076599a7ded3c71820459e48fee7d41603c12ac"}}}}