{"action":"created","comment":{"url":"https://api.github.com/repos/dedis/cothority/pulls/comments/70580254","id":70580254,"diff_hunk":"@@ -0,0 +1,272 @@\n+// Guard is a service that provides additional password protection by creating a series of guard servers that allow a\n+// Client to further secure their passwords from direct database compromises. The service is hash based and the passwords\n+// never leave the main database, making the guard servers very lightweight. The guard server's are used in both setting and\n+// authenticating passwords.\n+\n+package main\n+\n+import (\n+\t\"os\"\n+\n+\t\"errors\"\n+\n+\t\"crypto/aes\"\n+\t\"crypto/cipher\"\n+\t\"crypto/rand\"\n+\n+\t\"github.com/dedis/cothority/app/lib/config\"\n+\t\"github.com/dedis/cothority/log\"\n+\t\"github.com/dedis/cothority/sda\"\n+\t\"github.com/dedis/cothority/services/guard\"\n+\t\"github.com/dedis/crypto/abstract\"\n+\n+\t\"io/ioutil\"\n+\n+\ts \"github.com/SSSaaS/sssa-golang\"\n+\t\"gopkg.in/codegangsta/cli.v1\"\n+\n+\t\"bytes\"\n+\n+\t\"github.com/dedis/cothority/network\"\n+)\n+\n+// User is a representation of the Users data in the code, and is used to store all relevant information\n+type User struct {\n+\t// Name or UserID\n+\tName []byte\n+\t// Salt used for the password-hash\n+\tSalt []byte\n+\t// Xored keys with hash\n+\tKeys [][]byte\n+\t// Data AEAD-encrypted with key\n+\tData []byte\n+\tIv   []byte\n+}\n+\n+// Database is a structure that stores Cothority(the list of guard servers), and a list of all users within the database\n+type Database struct {\n+\tCothority *sda.Roster\n+\tUsers     []User\n+}\n+\n+var db *Database\n+\n+func main() {\n+\tnetwork.RegisterMessageType(&Database{})\n+\n+\tapp := cli.NewApp()\n+\tapp.Name = \"Guard\"\n+\tapp.Usage = \"Get and print status of all servers of a file.\"\n+\n+\tapp.Flags = []cli.Flag{\n+\t\tcli.StringFlag{\n+\t\t\tName:  \"group, gd\",\n+\t\t\tValue: \"group.toml\",\n+\t\t\tUsage: \"Cothority group definition in `FILE.toml`\",\n+\t\t},\n+\t\tcli.IntFlag{\n+\t\t\tName:  \"debug, d\",\n+\t\t\tValue: 0,\n+\t\t\tUsage: \"debug-level: `integer`: 1 for terse, 5 for maximal\",\n+\t\t},\n+\t}\n+\tapp.Commands = []cli.Command{\n+\t\t{\n+\t\t\tName:    \"setpass\",\n+\t\t\tAliases: []string{\"s\"},\n+\t\t\tUsage:   \"Setup the configuration for the server (interactive)\",\n+\t\t\tAction:  setpass,\n+\t\t},\n+\t\t{\n+\t\t\tName:      \"setup\",\n+\t\t\tAliases:   []string{\"su\"},\n+\t\t\tUsage:     \"Saves the cothority group-toml to the configuration\",\n+\t\t\tArgsUsage: \"Give group definition\",\n+\t\t\tAction:    setup,\n+\t\t},\n+\t\t{\n+\t\t\tName:    \"recover\",\n+\t\t\tAliases: []string{\"r\"},\n+\t\t\tUsage:   \"Gets the password back from the guards\",\n+\t\t\tAction:  get,\n+\t\t},\n+\t}\n+\tapp.Before = func(c *cli.Context) error {\n+\t\tb, err := ioutil.ReadFile(\"config.bin\")\n+\t\tif os.IsNotExist(err) {\n+\t\t\treturn nil\n+\t\t}\n+\t\tlog.ErrFatal(err, \"The config.bin file threw an error\")\n+\t\t_, msg, err := network.UnmarshalRegistered(b)\n+\t\tlog.ErrFatal(err, \"UnmarshalRegistered messeed up\")\n+\t\tvar ok bool\n+\t\tdb, ok = msg.(*Database)\n+\t\tif !ok {\n+\t\t\tlog.Fatal(\"We are not OK\")\n+\t\t}\n+\t\treturn nil\n+\t}\n+\tapp.Run(os.Args)\n+}\n+\n+// readGroup takes a toml file name and reads the file, returning the entities within\n+func readGroup(tomlFileName string) (*sda.Roster, error) {\n+\tlog.Print(\"Reading From File\")\n+\tf, err := os.Open(tomlFileName)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\tel, err := config.ReadGroupToml(f)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\tif len(el.List) <= 0 {\n+\t\treturn nil, errors.New(\"Empty or invalid group file:\" +\n+\t\t\ttomlFileName)\n+\t}\n+\tlog.Lvl3(el)\n+\treturn el, err\n+}\n+\n+func set(c *cli.Context, UID []byte, epoch []byte, password string, userdata []byte) {\n+\tvar mastersalt []byte\n+\tsaltsy := make([]byte, 12)\n+\trand.Read(saltsy)\n+\tmastersalt = saltsy\n+\tk := make([]byte, 32)\n+\trand.Read(k)\n+\t// pwhash is the password hash that will be sent to the guard servers\n+\tpwhash := abstract.Sum(network.Suite, []byte(password), mastersalt)\n+\t// secretkeys is the Shamir Secret share of the keys\n+\tsecretkeys := s.Create(2, len(db.Cothority.List), string(k))\n+\t// salty is a list of salts that will be used to encrypt the pwhash before sending it to the guard, derived from a single\n+\t// master salt\n+\tiv := make([]byte, 16)\n+\trand.Read(iv)\n+\tsalty := saltgen(mastersalt, len(db.Cothority.List))\n+\tresponses := make([][]byte, len(db.Cothority.List))\n+\tkeys := make([][]byte, len(db.Cothority.List))\n+\tfor i, si := range db.Cothority.List {\n+\t\tcl := guard.NewClient()\n+\t\tsendy := abstract.Sum(network.Suite, pwhash, salty[i])\n+\t\trep, err := cl.GetGuard(si, UID, epoch, sendy)\n+\t\tlog.ErrFatal(err)\n+\t\tresponses[i] = rep.Msg\n+\t\tblock, err := aes.NewCipher(responses[i])\n+\t\tif err != nil {\n+\t\t\tpanic(err)\n+\t\t}\n+\t\tlog.Print(\"Block Size: \", block.BlockSize())\n+\t\t// This part is necessary because you need a key to convert the Hash to a stream. The key is not even important because\n+\t\t//all that is required is that the request gives the same output for the same input\n+\t\tstream := cipher.NewCTR(block, iv)\n+\t\tmsg := make([]byte, 88)\n+\t\t//this does not work, as it merely appends zeros at the end, this is still necessary to do an xor during the clients\n+\t\t//password setting and authentication services\n+\t\tlog.Print(\"SecretKey: \", []byte(secretkeys[i]))\n+\t\tlog.Print(\"set xorkey before: \", msg)\n+\t\tstream.XORKeyStream(msg, []byte(secretkeys[i]))\n+\t\tlog.Print(\"set xorkey after: \", msg)\n+\t\tkeys[i] = msg\n+\n+\t}\n+\t// This is the code that seals the user data using the master key and saves it to the db\n+\tblock, _ := aes.NewCipher(k)\n+\taesgcm, _ := cipher.NewGCM(block)\n+\tciphertext := aesgcm.Seal(nil, mastersalt, userdata, nil)\n+\tdb.Users = append(db.Users, User{UID, mastersalt, keys, ciphertext, iv})\n+}\n+\n+// saltgen is a function that generates all the keys and salts given a length and an initial salt\n+func saltgen(salt []byte, count int) [][]byte {\n+\tsalts := make([][]byte, count)\n+\tfor i := 0; i < count; i++ {\n+\t\tsalts[i] = salt\n+\t\tsalt = abstract.Sum(network.Suite, salt)\n+\t}\n+\treturn salts\n+}\n+\n+// setup when you setup the password\n+func setup(c *cli.Context) error {\n+\n+\tgroupToml := c.Args().First()\n+\tlog.Print(\"Setup is working\")\n+\tvar err error\n+\tt, err := readGroup(groupToml)\n+\tdb = &Database{\n+\t\tCothority: t,\n+\t}\n+\tlog.ErrFatal(err)\n+\tb, err := network.MarshalRegisteredType(db)\n+\tlog.ErrFatal(err)\n+\tlog.Print(\"Setup is working\")\n+\terr = ioutil.WriteFile(\"config.bin\", b, 0660)\n+\tlog.ErrFatal(err)\n+\treturn nil\n+}\n+\n+// getuser returns the user that the UID matches\n+func getuser(UID []byte) *User {\n+\tfor _, u := range db.Users {\n+\t\tif bytes.Equal(u.Name, UID) {\n+\t\t\treturn &u\n+\t\t}\n+\t}\n+\t// this is necessary because there needs to be a return at the end but\n+\treturn nil\n+}\n+\n+// getpass contacts the guard servers, then gets the passwords and reconstructs the secret keys\n+func getpass(c *cli.Context, UID []byte, epoch []byte, pass string) {\n+\tif getuser(UID) == nil {\n+\t\tlog.Fatal(\"Wrong username\")\n+\t}\n+\tpwhash := abstract.Sum(network.Suite, []byte(pass), getuser(UID).Salt)\n+\tsalty := saltgen(getuser(UID).Salt, len(db.Cothority.List))\n+\tkeys := make([]string, len(db.Cothority.List))\n+\tfor i, si := range db.Cothority.List {\n+\t\tcl := guard.NewClient()\n+\t\tsendy := abstract.Sum(network.Suite, pwhash, salty[i])\n+\t\trep, err := cl.GetGuard(si, UID, epoch, sendy)\n+\t\tlog.ErrFatal(err)\n+\t\tblock, err := aes.NewCipher(rep.Msg)\n+\t\tstream := cipher.NewCTR(block, getuser(UID).Iv)\n+\t\tmsg := make([]byte, 88)\n+\t\t//this does not work, as it merely appends zeros at the end, this is still necessary to do an xor during the clients\n+\t\t//password setting and authentication services\n+\t\tlog.Print(\"set xorkey before: \", msg)\n+\t\tstream.XORKeyStream(msg, []byte(getuser(UID).Keys[i]))\n+\t\tlog.Print(\"set xorkey after: \", msg)\n+\t\tkeys[i] = string(msg)\n+\t}\n+\tk := s.Combine(keys)\n+\tif len(k) == 0 {\n+\t\tlog.Fatal(\"You entered the wrong password\")\n+\t}\n+\tblock, err := aes.NewCipher([]byte(k))\n+\tlog.ErrFatal(err)\n+\taesgcm, err := cipher.NewGCM(block)\n+\tlog.ErrFatal(err)\n+\tplaintext, err := aesgcm.Open(nil, getuser(UID).Salt, getuser(UID).Data, nil)\n+\tlog.ErrFatal(err)\n+\tlog.Print(string(plaintext))\n+}\n+func setpass(c *cli.Context) error {\n+\tUID := []byte(c.Args().Get(0))\n+\tEpoch := []byte{'E', 'P', 'O', 'C', 'H'}","path":"app/guard/guard.go","position":257,"original_position":257,"commit_id":"60bf7d4b6bf26e68bf2eacbe7a8b84778af1e442","original_commit_id":"60bf7d4b6bf26e68bf2eacbe7a8b84778af1e442","user":{"login":"ineiti","id":1545067,"avatar_url":"https://avatars.githubusercontent.com/u/1545067?v=3","gravatar_id":"","url":"https://api.github.com/users/ineiti","html_url":"https://github.com/ineiti","followers_url":"https://api.github.com/users/ineiti/followers","following_url":"https://api.github.com/users/ineiti/following{/other_user}","gists_url":"https://api.github.com/users/ineiti/gists{/gist_id}","starred_url":"https://api.github.com/users/ineiti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ineiti/subscriptions","organizations_url":"https://api.github.com/users/ineiti/orgs","repos_url":"https://api.github.com/users/ineiti/repos","events_url":"https://api.github.com/users/ineiti/events{/privacy}","received_events_url":"https://api.github.com/users/ineiti/received_events","type":"User","site_admin":false},"body":"`Epoch := []byte(\"EPOCH\")`","created_at":"2016-07-13T07:58:44Z","updated_at":"2016-07-13T07:58:44Z","html_url":"https://github.com/dedis/cothority/pull/472#discussion_r70580254","pull_request_url":"https://api.github.com/repos/dedis/cothority/pulls/472","_links":{"self":{"href":"https://api.github.com/repos/dedis/cothority/pulls/comments/70580254"},"html":{"href":"https://github.com/dedis/cothority/pull/472#discussion_r70580254"},"pull_request":{"href":"https://api.github.com/repos/dedis/cothority/pulls/472"}}},"pull_request":{"url":"https://api.github.com/repos/dedis/cothority/pulls/472","id":77077345,"html_url":"https://github.com/dedis/cothority/pull/472","diff_url":"https://github.com/dedis/cothority/pull/472.diff","patch_url":"https://github.com/dedis/cothority/pull/472.patch","issue_url":"https://api.github.com/repos/dedis/cothority/issues/472","number":472,"state":"open","locked":false,"title":"Cyber pass","user":{"login":"evanv03","id":19937212,"avatar_url":"https://avatars.githubusercontent.com/u/19937212?v=3","gravatar_id":"","url":"https://api.github.com/users/evanv03","html_url":"https://github.com/evanv03","followers_url":"https://api.github.com/users/evanv03/followers","following_url":"https://api.github.com/users/evanv03/following{/other_user}","gists_url":"https://api.github.com/users/evanv03/gists{/gist_id}","starred_url":"https://api.github.com/users/evanv03/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evanv03/subscriptions","organizations_url":"https://api.github.com/users/evanv03/orgs","repos_url":"https://api.github.com/users/evanv03/repos","events_url":"https://api.github.com/users/evanv03/events{/privacy}","received_events_url":"https://api.github.com/users/evanv03/received_events","type":"User","site_admin":false},"body":"This is the Cyberpass pull request","created_at":"2016-07-12T08:07:51Z","updated_at":"2016-07-13T07:58:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"56050b836e79a8f3df38a6bd78eb030f956a66ef","assignee":{"login":"evanv03","id":19937212,"avatar_url":"https://avatars.githubusercontent.com/u/19937212?v=3","gravatar_id":"","url":"https://api.github.com/users/evanv03","html_url":"https://github.com/evanv03","followers_url":"https://api.github.com/users/evanv03/followers","following_url":"https://api.github.com/users/evanv03/following{/other_user}","gists_url":"https://api.github.com/users/evanv03/gists{/gist_id}","starred_url":"https://api.github.com/users/evanv03/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evanv03/subscriptions","organizations_url":"https://api.github.com/users/evanv03/orgs","repos_url":"https://api.github.com/users/evanv03/repos","events_url":"https://api.github.com/users/evanv03/events{/privacy}","received_events_url":"https://api.github.com/users/evanv03/received_events","type":"User","site_admin":false},"assignees":[{"login":"evanv03","id":19937212,"avatar_url":"https://avatars.githubusercontent.com/u/19937212?v=3","gravatar_id":"","url":"https://api.github.com/users/evanv03","html_url":"https://github.com/evanv03","followers_url":"https://api.github.com/users/evanv03/followers","following_url":"https://api.github.com/users/evanv03/following{/other_user}","gists_url":"https://api.github.com/users/evanv03/gists{/gist_id}","starred_url":"https://api.github.com/users/evanv03/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evanv03/subscriptions","organizations_url":"https://api.github.com/users/evanv03/orgs","repos_url":"https://api.github.com/users/evanv03/repos","events_url":"https://api.github.com/users/evanv03/events{/privacy}","received_events_url":"https://api.github.com/users/evanv03/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/dedis/cothority/pulls/472/commits","review_comments_url":"https://api.github.com/repos/dedis/cothority/pulls/472/comments","review_comment_url":"https://api.github.com/repos/dedis/cothority/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dedis/cothority/issues/472/comments","statuses_url":"https://api.github.com/repos/dedis/cothority/statuses/60bf7d4b6bf26e68bf2eacbe7a8b84778af1e442","head":{"label":"dedis:CyberPass","ref":"CyberPass","sha":"60bf7d4b6bf26e68bf2eacbe7a8b84778af1e442","user":{"login":"dedis","id":3638331,"avatar_url":"https://avatars.githubusercontent.com/u/3638331?v=3","gravatar_id":"","url":"https://api.github.com/users/dedis","html_url":"https://github.com/dedis","followers_url":"https://api.github.com/users/dedis/followers","following_url":"https://api.github.com/users/dedis/following{/other_user}","gists_url":"https://api.github.com/users/dedis/gists{/gist_id}","starred_url":"https://api.github.com/users/dedis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dedis/subscriptions","organizations_url":"https://api.github.com/users/dedis/orgs","repos_url":"https://api.github.com/users/dedis/repos","events_url":"https://api.github.com/users/dedis/events{/privacy}","received_events_url":"https://api.github.com/users/dedis/received_events","type":"Organization","site_admin":false},"repo":{"id":41791684,"name":"cothority","full_name":"dedis/cothority","owner":{"login":"dedis","id":3638331,"avatar_url":"https://avatars.githubusercontent.com/u/3638331?v=3","gravatar_id":"","url":"https://api.github.com/users/dedis","html_url":"https://github.com/dedis","followers_url":"https://api.github.com/users/dedis/followers","following_url":"https://api.github.com/users/dedis/following{/other_user}","gists_url":"https://api.github.com/users/dedis/gists{/gist_id}","starred_url":"https://api.github.com/users/dedis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dedis/subscriptions","organizations_url":"https://api.github.com/users/dedis/orgs","repos_url":"https://api.github.com/users/dedis/repos","events_url":"https://api.github.com/users/dedis/events{/privacy}","received_events_url":"https://api.github.com/users/dedis/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dedis/cothority","description":"Scalable collective authority prototype","fork":false,"url":"https://api.github.com/repos/dedis/cothority","forks_url":"https://api.github.com/repos/dedis/cothority/forks","keys_url":"https://api.github.com/repos/dedis/cothority/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dedis/cothority/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dedis/cothority/teams","hooks_url":"https://api.github.com/repos/dedis/cothority/hooks","issue_events_url":"https://api.github.com/repos/dedis/cothority/issues/events{/number}","events_url":"https://api.github.com/repos/dedis/cothority/events","assignees_url":"https://api.github.com/repos/dedis/cothority/assignees{/user}","branches_url":"https://api.github.com/repos/dedis/cothority/branches{/branch}","tags_url":"https://api.github.com/repos/dedis/cothority/tags","blobs_url":"https://api.github.com/repos/dedis/cothority/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dedis/cothority/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dedis/cothority/git/refs{/sha}","trees_url":"https://api.github.com/repos/dedis/cothority/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dedis/cothority/statuses/{sha}","languages_url":"https://api.github.com/repos/dedis/cothority/languages","stargazers_url":"https://api.github.com/repos/dedis/cothority/stargazers","contributors_url":"https://api.github.com/repos/dedis/cothority/contributors","subscribers_url":"https://api.github.com/repos/dedis/cothority/subscribers","subscription_url":"https://api.github.com/repos/dedis/cothority/subscription","commits_url":"https://api.github.com/repos/dedis/cothority/commits{/sha}","git_commits_url":"https://api.github.com/repos/dedis/cothority/git/commits{/sha}","comments_url":"https://api.github.com/repos/dedis/cothority/comments{/number}","issue_comment_url":"https://api.github.com/repos/dedis/cothority/issues/comments{/number}","contents_url":"https://api.github.com/repos/dedis/cothority/contents/{+path}","compare_url":"https://api.github.com/repos/dedis/cothority/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dedis/cothority/merges","archive_url":"https://api.github.com/repos/dedis/cothority/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dedis/cothority/downloads","issues_url":"https://api.github.com/repos/dedis/cothority/issues{/number}","pulls_url":"https://api.github.com/repos/dedis/cothority/pulls{/number}","milestones_url":"https://api.github.com/repos/dedis/cothority/milestones{/number}","notifications_url":"https://api.github.com/repos/dedis/cothority/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dedis/cothority/labels{/name}","releases_url":"https://api.github.com/repos/dedis/cothority/releases{/id}","deployments_url":"https://api.github.com/repos/dedis/cothority/deployments","created_at":"2015-09-02T09:13:57Z","updated_at":"2016-06-30T13:41:43Z","pushed_at":"2016-07-13T07:37:13Z","git_url":"git://github.com/dedis/cothority.git","ssh_url":"git@github.com:dedis/cothority.git","clone_url":"https://github.com/dedis/cothority.git","svn_url":"https://github.com/dedis/cothority","homepage":"","size":53617,"stargazers_count":106,"watchers_count":106,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":60,"forks":10,"open_issues":60,"watchers":106,"default_branch":"master"}},"base":{"label":"dedis:master","ref":"master","sha":"2b28aed6c2dac54e9fbea047dfac333888cee63b","user":{"login":"dedis","id":3638331,"avatar_url":"https://avatars.githubusercontent.com/u/3638331?v=3","gravatar_id":"","url":"https://api.github.com/users/dedis","html_url":"https://github.com/dedis","followers_url":"https://api.github.com/users/dedis/followers","following_url":"https://api.github.com/users/dedis/following{/other_user}","gists_url":"https://api.github.com/users/dedis/gists{/gist_id}","starred_url":"https://api.github.com/users/dedis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dedis/subscriptions","organizations_url":"https://api.github.com/users/dedis/orgs","repos_url":"https://api.github.com/users/dedis/repos","events_url":"https://api.github.com/users/dedis/events{/privacy}","received_events_url":"https://api.github.com/users/dedis/received_events","type":"Organization","site_admin":false},"repo":{"id":41791684,"name":"cothority","full_name":"dedis/cothority","owner":{"login":"dedis","id":3638331,"avatar_url":"https://avatars.githubusercontent.com/u/3638331?v=3","gravatar_id":"","url":"https://api.github.com/users/dedis","html_url":"https://github.com/dedis","followers_url":"https://api.github.com/users/dedis/followers","following_url":"https://api.github.com/users/dedis/following{/other_user}","gists_url":"https://api.github.com/users/dedis/gists{/gist_id}","starred_url":"https://api.github.com/users/dedis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dedis/subscriptions","organizations_url":"https://api.github.com/users/dedis/orgs","repos_url":"https://api.github.com/users/dedis/repos","events_url":"https://api.github.com/users/dedis/events{/privacy}","received_events_url":"https://api.github.com/users/dedis/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dedis/cothority","description":"Scalable collective authority prototype","fork":false,"url":"https://api.github.com/repos/dedis/cothority","forks_url":"https://api.github.com/repos/dedis/cothority/forks","keys_url":"https://api.github.com/repos/dedis/cothority/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dedis/cothority/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dedis/cothority/teams","hooks_url":"https://api.github.com/repos/dedis/cothority/hooks","issue_events_url":"https://api.github.com/repos/dedis/cothority/issues/events{/number}","events_url":"https://api.github.com/repos/dedis/cothority/events","assignees_url":"https://api.github.com/repos/dedis/cothority/assignees{/user}","branches_url":"https://api.github.com/repos/dedis/cothority/branches{/branch}","tags_url":"https://api.github.com/repos/dedis/cothority/tags","blobs_url":"https://api.github.com/repos/dedis/cothority/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dedis/cothority/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dedis/cothority/git/refs{/sha}","trees_url":"https://api.github.com/repos/dedis/cothority/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dedis/cothority/statuses/{sha}","languages_url":"https://api.github.com/repos/dedis/cothority/languages","stargazers_url":"https://api.github.com/repos/dedis/cothority/stargazers","contributors_url":"https://api.github.com/repos/dedis/cothority/contributors","subscribers_url":"https://api.github.com/repos/dedis/cothority/subscribers","subscription_url":"https://api.github.com/repos/dedis/cothority/subscription","commits_url":"https://api.github.com/repos/dedis/cothority/commits{/sha}","git_commits_url":"https://api.github.com/repos/dedis/cothority/git/commits{/sha}","comments_url":"https://api.github.com/repos/dedis/cothority/comments{/number}","issue_comment_url":"https://api.github.com/repos/dedis/cothority/issues/comments{/number}","contents_url":"https://api.github.com/repos/dedis/cothority/contents/{+path}","compare_url":"https://api.github.com/repos/dedis/cothority/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dedis/cothority/merges","archive_url":"https://api.github.com/repos/dedis/cothority/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dedis/cothority/downloads","issues_url":"https://api.github.com/repos/dedis/cothority/issues{/number}","pulls_url":"https://api.github.com/repos/dedis/cothority/pulls{/number}","milestones_url":"https://api.github.com/repos/dedis/cothority/milestones{/number}","notifications_url":"https://api.github.com/repos/dedis/cothority/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dedis/cothority/labels{/name}","releases_url":"https://api.github.com/repos/dedis/cothority/releases{/id}","deployments_url":"https://api.github.com/repos/dedis/cothority/deployments","created_at":"2015-09-02T09:13:57Z","updated_at":"2016-06-30T13:41:43Z","pushed_at":"2016-07-13T07:37:13Z","git_url":"git://github.com/dedis/cothority.git","ssh_url":"git@github.com:dedis/cothority.git","clone_url":"https://github.com/dedis/cothority.git","svn_url":"https://github.com/dedis/cothority","homepage":"","size":53617,"stargazers_count":106,"watchers_count":106,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":60,"forks":10,"open_issues":60,"watchers":106,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dedis/cothority/pulls/472"},"html":{"href":"https://github.com/dedis/cothority/pull/472"},"issue":{"href":"https://api.github.com/repos/dedis/cothority/issues/472"},"comments":{"href":"https://api.github.com/repos/dedis/cothority/issues/472/comments"},"review_comments":{"href":"https://api.github.com/repos/dedis/cothority/pulls/472/comments"},"review_comment":{"href":"https://api.github.com/repos/dedis/cothority/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dedis/cothority/pulls/472/commits"},"statuses":{"href":"https://api.github.com/repos/dedis/cothority/statuses/60bf7d4b6bf26e68bf2eacbe7a8b84778af1e442"}}}}
{"actor":{"display_login":"ineiti"}}