{"action":"created","comment":{"url":"https://api.github.com/repos/fentec-project/gofe/pulls/comments/239431359","pull_request_review_id":182201114,"id":239431359,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzOTQzMTM1OQ==","diff_hunk":"@@ -0,0 +1,158 @@\n+package abe\n+\n+import (\n+\t\"math/big\"\n+\t\"testing\"\n+\n+\t\"github.com/cloudflare/bn256\"\n+\t\"github.com/fentec-project/gofe/data\"\n+\t\"github.com/fentec-project/gofe/sample\"\n+\t\"github.com/stretchr/testify/assert\"\n+)\n+\n+func TestAbe(t *testing.T) {\n+\t// create a new ABE struct with the universe of l possible\n+\t// attributes (attributes are denoted by the integers in [0, l)\n+\tl := 10\n+\ta := newAbe(l)\n+\n+\t// generate a a pubic and a secret key for the scheme\n+\tpubKey, sk, err := a.GenerateMasterKeys()\n+\tif err != nil {\n+\t\tt.Fatalf(\"Failed to genrate master keys: %v\", err)\n+\t}\n+\n+\t// create a random message to be encrypted, for now\n+\t// this is an element of an elliptic curve\n+\tsampler := sample.NewUniform(a.Params.p)\n+\texponent, err := sampler.Sample()\n+\tif err != nil {\n+\t\tt.Fatalf(\"Failed to generate random values: %v\", err)\n+\t}\n+\tmsg := new(bn256.GT).ScalarBaseMult(exponent)\n+\n+\t// define a set of attributes (a subset of the universe of attributes)\n+\t// that will later be used in the decryption policy of the message\n+\tgamma := []int{0, 1, 2, 4}\n+\n+\t// encrypt the message\n+\tcipher, err := a.Encrypt(msg, gamma, pubKey)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Failed to encrypt: %v\", err)\n+\t}\n+\n+\t// create a msp struct out of a boolean expression  representing the\n+\t// policy specifying which attributes are needed to decrypt the ciphertext\n+\tmsp, err := BooleanToMsp(\"(1 OR 4) AND (2 OR (0 AND 1))\", a.Params.p)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Failed to generate the policy: %v\", err)\n+\t}\n+\n+\t// generate keys for decryption that correspond to provided msp struct,\n+\t// i.e. a vector of keys, for each row in the msp matrix one key, having\n+\t// the property that a subset of keys can decrypt a message iff the\n+\t// corresponding rows span the vector of ones (which is equivalent to\n+\t// corresponding attributes satisfy the boolean expression)\n+\tkeys, err := a.KeyGen(msp, sk)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Failed to generate keys: %v\", err)\n+\t}\n+\n+\t// test if error is returned when a bad Msp struct is given\n+\temptyMsp := &Msp{mat: make(data.Matrix, 0), rowToAttrib: make([]int, 0)}\n+\t_, err = a.KeyGen(emptyMsp, sk)\n+\tassert.Error(t, err)\n+\n+\t// produce a set of keys that are given to an entity with a set\n+\t// of attributes in ownedAttrib\n+\townedAttrib := []int{1, 2}\n+\tabeKey := a.DelagateKeys(keys, msp, ownedAttrib)\n+\n+\t// decrypt the ciphertext with the set of delegated keys\n+\tmsgCheck, err := a.Decrypt(cipher, abeKey)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Failed to decrypt: %v\", err)\n+\t}\n+\tassert.Equal(t, msg, msgCheck)\n+\n+\t// produce a set of keys that are given to an entity with a set\n+\t// of insufficient attributes in ownedAttribInsuff\n+\townedAttribInsuff := []int{4, 0}\n+\tabeKeyInsuff := a.DelagateKeys(keys, msp, ownedAttribInsuff)\n+\n+\t// try to decrypt the ciphertext with the set of delegated keys\n+\tmsgCheck, err = a.Decrypt(cipher, abeKeyInsuff)\n+\tassert.Error(t, err)\n+}\n+\n+func TestBooleanToMsp(t *testing.T) {\n+\t// create as msp struct out of a boolean expression\n+\tp := big.NewInt(7)\n+\tmsp, err := BooleanToMsp(\"1 AND (((6 OR 7) AND (8 OR 9)) OR ((2 AND 3) OR (4 AND 5)))\", p)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Error while processing a boolean expression: %v\", err)\n+\t}\n+\n+\t// check if having attributes 1, 7 and 9 satisfies the expression, i.e. entries 0, 2, 4\n+\t// of a msp matrix span vector [1, 1,..., 1], using Gaussian elimination\n+\tv := make(data.Vector, len(msp.mat[0]))\n+\tfor i := 0; i < len(v); i++ {\n+\t\tv[i] = big.NewInt(1)\n+\t}\n+\tm := make(data.Matrix, 3)\n+\tm[0] = msp.mat[0]\n+\tm[1] = msp.mat[2]\n+\tm[2] = msp.mat[4]\n+\n+\tx, err := gaussianElimination(m.Transpose(), v, p)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Error finding a vector: %v\", err)\n+\t}\n+\tassert.NotNil(t, x)\n+\n+\t// check if an error is generated if the boolean expression is not in a correct form\n+\t_, err = BooleanToMsp(\"1 AND ((6 OR 7) AND (8 OR 9)) OR ((2 AND 3) OR (4 AND 5)))\", p)\n+\tassert.Error(t, err)\n+\n+}\n+\n+func TestGaussianElimintaion(t *testing.T) {\n+\t// create instances mat, xTest and v for which mat * xTest = v\n+\t// as a matrix vector multiplication over Z_p\n+\n+\tp := big.NewInt(17)\n+\tsampler := sample.NewUniform(p)\n+\tmat, err := data.NewRandomMatrix(100, 50, sampler)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Error during matrix generation: %v\", err)\n+\t}\n+\n+\txTest, err := data.NewRandomVector(50, sampler)\n+\tif err != nil {\n+\t\tt.Fatalf(\"Error during vector generation: %v\", err)\n+\t}\n+\n+\tv, err := mat.MulVec(xTest)\n+\tv = v.Mod(p)\n+\n+\t// test the Gaussian elimination algorithm that given v and mat\n+\t// finds x such that mat * x = v\n+\tx, err := gaussianElimination(mat, v, p)\n+\n+\t// test if the obtained x is correct\n+\tvCheck, err := mat.MulVec(x)","path":"abe/abe_test.go","position":143,"original_position":143,"commit_id":"e2b89073c6993a9db93020fab61adfc525bcd88f","original_commit_id":"e2b89073c6993a9db93020fab61adfc525bcd88f","user":{"login":"janhartman","id":15076960,"node_id":"MDQ6VXNlcjE1MDc2OTYw","avatar_url":"https://avatars1.githubusercontent.com/u/15076960?v=4","gravatar_id":"","url":"https://api.github.com/users/janhartman","html_url":"https://github.com/janhartman","followers_url":"https://api.github.com/users/janhartman/followers","following_url":"https://api.github.com/users/janhartman/following{/other_user}","gists_url":"https://api.github.com/users/janhartman/gists{/gist_id}","starred_url":"https://api.github.com/users/janhartman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janhartman/subscriptions","organizations_url":"https://api.github.com/users/janhartman/orgs","repos_url":"https://api.github.com/users/janhartman/repos","events_url":"https://api.github.com/users/janhartman/events{/privacy}","received_events_url":"https://api.github.com/users/janhartman/received_events","type":"User","site_admin":false},"body":"Check for errors.","created_at":"2018-12-06T12:16:57Z","updated_at":"2018-12-06T12:54:15Z","html_url":"https://github.com/fentec-project/gofe/pull/10#discussion_r239431359","pull_request_url":"https://api.github.com/repos/fentec-project/gofe/pulls/10","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/fentec-project/gofe/pulls/comments/239431359"},"html":{"href":"https://github.com/fentec-project/gofe/pull/10#discussion_r239431359"},"pull_request":{"href":"https://api.github.com/repos/fentec-project/gofe/pulls/10"}}},"pull_request":{"url":"https://api.github.com/repos/fentec-project/gofe/pulls/10","id":236115882,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM2MTE1ODgy","html_url":"https://github.com/fentec-project/gofe/pull/10","diff_url":"https://github.com/fentec-project/gofe/pull/10.diff","patch_url":"https://github.com/fentec-project/gofe/pull/10.patch","issue_url":"https://api.github.com/repos/fentec-project/gofe/issues/10","number":10,"state":"open","locked":false,"title":"An ABE scheme","user":{"login":"tilenmarc","id":29094770,"node_id":"MDQ6VXNlcjI5MDk0Nzcw","avatar_url":"https://avatars1.githubusercontent.com/u/29094770?v=4","gravatar_id":"","url":"https://api.github.com/users/tilenmarc","html_url":"https://github.com/tilenmarc","followers_url":"https://api.github.com/users/tilenmarc/followers","following_url":"https://api.github.com/users/tilenmarc/following{/other_user}","gists_url":"https://api.github.com/users/tilenmarc/gists{/gist_id}","starred_url":"https://api.github.com/users/tilenmarc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tilenmarc/subscriptions","organizations_url":"https://api.github.com/users/tilenmarc/orgs","repos_url":"https://api.github.com/users/tilenmarc/repos","events_url":"https://api.github.com/users/tilenmarc/events{/privacy}","received_events_url":"https://api.github.com/users/tilenmarc/received_events","type":"User","site_admin":false},"body":"ABE schemes provide a functionality that an entity can decrypt a ciphertext if and only if he or she possesses sufficient set of attributes.\r\nThis PR implements a key policy (KP) ABE scheme presented in [this paper](https://eprint.iacr.org/2006/309.pdf). It is based on a monotone span programs (MSP) providing a policy for the decryption. It includes the following functionalities:\r\n- encryption of a message with only specifying which set of attributes will be important for decryption policy\r\n- a policy convertor that transforms a boolean formula expressing the policy which attributes are needed for the decryption into an equivalent MSP structure\r\n- key derivation that given given a MSP structure creates a set of keys corresponding to attributes\r\n- key delegation that delegates the above keys to entities with some attributes\r\n- decryption that based on given keys decrypts or denies the user\r\n\r\nAs a part of the decryption process a helping function solving a matrix vector equation Ax = v is implemented using Gaussian elimination.","created_at":"2018-12-05T10:13:06Z","updated_at":"2018-12-06T12:54:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8add2aed60a7bc69c51674474e6ff3f4a51734bc","assignee":{"login":"janhartman","id":15076960,"node_id":"MDQ6VXNlcjE1MDc2OTYw","avatar_url":"https://avatars1.githubusercontent.com/u/15076960?v=4","gravatar_id":"","url":"https://api.github.com/users/janhartman","html_url":"https://github.com/janhartman","followers_url":"https://api.github.com/users/janhartman/followers","following_url":"https://api.github.com/users/janhartman/following{/other_user}","gists_url":"https://api.github.com/users/janhartman/gists{/gist_id}","starred_url":"https://api.github.com/users/janhartman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janhartman/subscriptions","organizations_url":"https://api.github.com/users/janhartman/orgs","repos_url":"https://api.github.com/users/janhartman/repos","events_url":"https://api.github.com/users/janhartman/events{/privacy}","received_events_url":"https://api.github.com/users/janhartman/received_events","type":"User","site_admin":false},"assignees":[{"login":"janhartman","id":15076960,"node_id":"MDQ6VXNlcjE1MDc2OTYw","avatar_url":"https://avatars1.githubusercontent.com/u/15076960?v=4","gravatar_id":"","url":"https://api.github.com/users/janhartman","html_url":"https://github.com/janhartman","followers_url":"https://api.github.com/users/janhartman/followers","following_url":"https://api.github.com/users/janhartman/following{/other_user}","gists_url":"https://api.github.com/users/janhartman/gists{/gist_id}","starred_url":"https://api.github.com/users/janhartman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janhartman/subscriptions","organizations_url":"https://api.github.com/users/janhartman/orgs","repos_url":"https://api.github.com/users/janhartman/repos","events_url":"https://api.github.com/users/janhartman/events{/privacy}","received_events_url":"https://api.github.com/users/janhartman/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/fentec-project/gofe/pulls/10/commits","review_comments_url":"https://api.github.com/repos/fentec-project/gofe/pulls/10/comments","review_comment_url":"https://api.github.com/repos/fentec-project/gofe/pulls/comments{/number}","comments_url":"https://api.github.com/repos/fentec-project/gofe/issues/10/comments","statuses_url":"https://api.github.com/repos/fentec-project/gofe/statuses/e2b89073c6993a9db93020fab61adfc525bcd88f","head":{"label":"tilenmarc:ABE","ref":"ABE","sha":"e2b89073c6993a9db93020fab61adfc525bcd88f","user":{"login":"tilenmarc","id":29094770,"node_id":"MDQ6VXNlcjI5MDk0Nzcw","avatar_url":"https://avatars1.githubusercontent.com/u/29094770?v=4","gravatar_id":"","url":"https://api.github.com/users/tilenmarc","html_url":"https://github.com/tilenmarc","followers_url":"https://api.github.com/users/tilenmarc/followers","following_url":"https://api.github.com/users/tilenmarc/following{/other_user}","gists_url":"https://api.github.com/users/tilenmarc/gists{/gist_id}","starred_url":"https://api.github.com/users/tilenmarc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tilenmarc/subscriptions","organizations_url":"https://api.github.com/users/tilenmarc/orgs","repos_url":"https://api.github.com/users/tilenmarc/repos","events_url":"https://api.github.com/users/tilenmarc/events{/privacy}","received_events_url":"https://api.github.com/users/tilenmarc/received_events","type":"User","site_admin":false},"repo":{"id":145816590,"node_id":"MDEwOlJlcG9zaXRvcnkxNDU4MTY1OTA=","name":"gofe","full_name":"tilenmarc/gofe","private":false,"owner":{"login":"tilenmarc","id":29094770,"node_id":"MDQ6VXNlcjI5MDk0Nzcw","avatar_url":"https://avatars1.githubusercontent.com/u/29094770?v=4","gravatar_id":"","url":"https://api.github.com/users/tilenmarc","html_url":"https://github.com/tilenmarc","followers_url":"https://api.github.com/users/tilenmarc/followers","following_url":"https://api.github.com/users/tilenmarc/following{/other_user}","gists_url":"https://api.github.com/users/tilenmarc/gists{/gist_id}","starred_url":"https://api.github.com/users/tilenmarc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tilenmarc/subscriptions","organizations_url":"https://api.github.com/users/tilenmarc/orgs","repos_url":"https://api.github.com/users/tilenmarc/repos","events_url":"https://api.github.com/users/tilenmarc/events{/privacy}","received_events_url":"https://api.github.com/users/tilenmarc/received_events","type":"User","site_admin":false},"html_url":"https://github.com/tilenmarc/gofe","description":"Functional encryption library in Go","fork":true,"url":"https://api.github.com/repos/tilenmarc/gofe","forks_url":"https://api.github.com/repos/tilenmarc/gofe/forks","keys_url":"https://api.github.com/repos/tilenmarc/gofe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tilenmarc/gofe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tilenmarc/gofe/teams","hooks_url":"https://api.github.com/repos/tilenmarc/gofe/hooks","issue_events_url":"https://api.github.com/repos/tilenmarc/gofe/issues/events{/number}","events_url":"https://api.github.com/repos/tilenmarc/gofe/events","assignees_url":"https://api.github.com/repos/tilenmarc/gofe/assignees{/user}","branches_url":"https://api.github.com/repos/tilenmarc/gofe/branches{/branch}","tags_url":"https://api.github.com/repos/tilenmarc/gofe/tags","blobs_url":"https://api.github.com/repos/tilenmarc/gofe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tilenmarc/gofe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tilenmarc/gofe/git/refs{/sha}","trees_url":"https://api.github.com/repos/tilenmarc/gofe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tilenmarc/gofe/statuses/{sha}","languages_url":"https://api.github.com/repos/tilenmarc/gofe/languages","stargazers_url":"https://api.github.com/repos/tilenmarc/gofe/stargazers","contributors_url":"https://api.github.com/repos/tilenmarc/gofe/contributors","subscribers_url":"https://api.github.com/repos/tilenmarc/gofe/subscribers","subscription_url":"https://api.github.com/repos/tilenmarc/gofe/subscription","commits_url":"https://api.github.com/repos/tilenmarc/gofe/commits{/sha}","git_commits_url":"https://api.github.com/repos/tilenmarc/gofe/git/commits{/sha}","comments_url":"https://api.github.com/repos/tilenmarc/gofe/comments{/number}","issue_comment_url":"https://api.github.com/repos/tilenmarc/gofe/issues/comments{/number}","contents_url":"https://api.github.com/repos/tilenmarc/gofe/contents/{+path}","compare_url":"https://api.github.com/repos/tilenmarc/gofe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tilenmarc/gofe/merges","archive_url":"https://api.github.com/repos/tilenmarc/gofe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tilenmarc/gofe/downloads","issues_url":"https://api.github.com/repos/tilenmarc/gofe/issues{/number}","pulls_url":"https://api.github.com/repos/tilenmarc/gofe/pulls{/number}","milestones_url":"https://api.github.com/repos/tilenmarc/gofe/milestones{/number}","notifications_url":"https://api.github.com/repos/tilenmarc/gofe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tilenmarc/gofe/labels{/name}","releases_url":"https://api.github.com/repos/tilenmarc/gofe/releases{/id}","deployments_url":"https://api.github.com/repos/tilenmarc/gofe/deployments","created_at":"2018-08-23T07:21:50Z","updated_at":"2018-12-05T09:29:10Z","pushed_at":"2018-12-06T08:35:29Z","git_url":"git://github.com/tilenmarc/gofe.git","ssh_url":"git@github.com:tilenmarc/gofe.git","clone_url":"https://github.com/tilenmarc/gofe.git","svn_url":"https://github.com/tilenmarc/gofe","homepage":null,"size":178,"stargazers_count":0,"watchers_count":0,"language":"Go","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":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"fentec-project:master","ref":"master","sha":"81e32e1aa2195ffc74c4ae8461498347a901b689","user":{"login":"fentec-project","id":42601814,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQyNjAxODE0","avatar_url":"https://avatars1.githubusercontent.com/u/42601814?v=4","gravatar_id":"","url":"https://api.github.com/users/fentec-project","html_url":"https://github.com/fentec-project","followers_url":"https://api.github.com/users/fentec-project/followers","following_url":"https://api.github.com/users/fentec-project/following{/other_user}","gists_url":"https://api.github.com/users/fentec-project/gists{/gist_id}","starred_url":"https://api.github.com/users/fentec-project/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fentec-project/subscriptions","organizations_url":"https://api.github.com/users/fentec-project/orgs","repos_url":"https://api.github.com/users/fentec-project/repos","events_url":"https://api.github.com/users/fentec-project/events{/privacy}","received_events_url":"https://api.github.com/users/fentec-project/received_events","type":"Organization","site_admin":false},"repo":{"id":145681945,"node_id":"MDEwOlJlcG9zaXRvcnkxNDU2ODE5NDU=","name":"gofe","full_name":"fentec-project/gofe","private":false,"owner":{"login":"fentec-project","id":42601814,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQyNjAxODE0","avatar_url":"https://avatars1.githubusercontent.com/u/42601814?v=4","gravatar_id":"","url":"https://api.github.com/users/fentec-project","html_url":"https://github.com/fentec-project","followers_url":"https://api.github.com/users/fentec-project/followers","following_url":"https://api.github.com/users/fentec-project/following{/other_user}","gists_url":"https://api.github.com/users/fentec-project/gists{/gist_id}","starred_url":"https://api.github.com/users/fentec-project/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fentec-project/subscriptions","organizations_url":"https://api.github.com/users/fentec-project/orgs","repos_url":"https://api.github.com/users/fentec-project/repos","events_url":"https://api.github.com/users/fentec-project/events{/privacy}","received_events_url":"https://api.github.com/users/fentec-project/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/fentec-project/gofe","description":"Functional encryption library in Go","fork":false,"url":"https://api.github.com/repos/fentec-project/gofe","forks_url":"https://api.github.com/repos/fentec-project/gofe/forks","keys_url":"https://api.github.com/repos/fentec-project/gofe/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fentec-project/gofe/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fentec-project/gofe/teams","hooks_url":"https://api.github.com/repos/fentec-project/gofe/hooks","issue_events_url":"https://api.github.com/repos/fentec-project/gofe/issues/events{/number}","events_url":"https://api.github.com/repos/fentec-project/gofe/events","assignees_url":"https://api.github.com/repos/fentec-project/gofe/assignees{/user}","branches_url":"https://api.github.com/repos/fentec-project/gofe/branches{/branch}","tags_url":"https://api.github.com/repos/fentec-project/gofe/tags","blobs_url":"https://api.github.com/repos/fentec-project/gofe/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fentec-project/gofe/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fentec-project/gofe/git/refs{/sha}","trees_url":"https://api.github.com/repos/fentec-project/gofe/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fentec-project/gofe/statuses/{sha}","languages_url":"https://api.github.com/repos/fentec-project/gofe/languages","stargazers_url":"https://api.github.com/repos/fentec-project/gofe/stargazers","contributors_url":"https://api.github.com/repos/fentec-project/gofe/contributors","subscribers_url":"https://api.github.com/repos/fentec-project/gofe/subscribers","subscription_url":"https://api.github.com/repos/fentec-project/gofe/subscription","commits_url":"https://api.github.com/repos/fentec-project/gofe/commits{/sha}","git_commits_url":"https://api.github.com/repos/fentec-project/gofe/git/commits{/sha}","comments_url":"https://api.github.com/repos/fentec-project/gofe/comments{/number}","issue_comment_url":"https://api.github.com/repos/fentec-project/gofe/issues/comments{/number}","contents_url":"https://api.github.com/repos/fentec-project/gofe/contents/{+path}","compare_url":"https://api.github.com/repos/fentec-project/gofe/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fentec-project/gofe/merges","archive_url":"https://api.github.com/repos/fentec-project/gofe/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fentec-project/gofe/downloads","issues_url":"https://api.github.com/repos/fentec-project/gofe/issues{/number}","pulls_url":"https://api.github.com/repos/fentec-project/gofe/pulls{/number}","milestones_url":"https://api.github.com/repos/fentec-project/gofe/milestones{/number}","notifications_url":"https://api.github.com/repos/fentec-project/gofe/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fentec-project/gofe/labels{/name}","releases_url":"https://api.github.com/repos/fentec-project/gofe/releases{/id}","deployments_url":"https://api.github.com/repos/fentec-project/gofe/deployments","created_at":"2018-08-22T08:48:21Z","updated_at":"2018-12-04T10:34:15Z","pushed_at":"2018-12-05T10:24:14Z","git_url":"git://github.com/fentec-project/gofe.git","ssh_url":"git@github.com:fentec-project/gofe.git","clone_url":"https://github.com/fentec-project/gofe.git","svn_url":"https://github.com/fentec-project/gofe","homepage":null,"size":88,"stargazers_count":17,"watchers_count":17,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":5,"open_issues":1,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/fentec-project/gofe/pulls/10"},"html":{"href":"https://github.com/fentec-project/gofe/pull/10"},"issue":{"href":"https://api.github.com/repos/fentec-project/gofe/issues/10"},"comments":{"href":"https://api.github.com/repos/fentec-project/gofe/issues/10/comments"},"review_comments":{"href":"https://api.github.com/repos/fentec-project/gofe/pulls/10/comments"},"review_comment":{"href":"https://api.github.com/repos/fentec-project/gofe/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/fentec-project/gofe/pulls/10/commits"},"statuses":{"href":"https://api.github.com/repos/fentec-project/gofe/statuses/e2b89073c6993a9db93020fab61adfc525bcd88f"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"janhartman"}}