{"id":15058752,"url":"https://github.com/ahnlabcloudmatelabs/go-activitypub-signature-header","last_synced_at":"2026-01-03T01:04:40.776Z","repository":{"id":203051661,"uuid":"708692171","full_name":"ahnlabcloudmatelabs/go-activitypub-signature-header","owner":"ahnlabcloudmatelabs","description":"Signature header for the connect with ActivityPub federations","archived":false,"fork":false,"pushed_at":"2023-10-29T14:17:04.000Z","size":23,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-01-21T23:48:25.211Z","etag":null,"topics":["activitypub","golang","http-signature","signature-header"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ahnlabcloudmatelabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-23T07:37:22.000Z","updated_at":"2023-10-29T14:16:41.000Z","dependencies_parsed_at":"2023-10-26T08:33:02.007Z","dependency_job_id":"ab66c8e7-644a-46e6-8404-60518c59805f","html_url":"https://github.com/ahnlabcloudmatelabs/go-activitypub-signature-header","commit_stats":null,"previous_names":["cloudmatelabs/go-activitypub-signature-header","ahnlabcloudmatelabs/go-activitypub-signature-header"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahnlabcloudmatelabs%2Fgo-activitypub-signature-header","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahnlabcloudmatelabs%2Fgo-activitypub-signature-header/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahnlabcloudmatelabs%2Fgo-activitypub-signature-header/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ahnlabcloudmatelabs%2Fgo-activitypub-signature-header/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ahnlabcloudmatelabs","download_url":"https://codeload.github.com/ahnlabcloudmatelabs/go-activitypub-signature-header/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243707382,"owners_count":20334619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["activitypub","golang","http-signature","signature-header"],"created_at":"2024-09-24T22:29:20.724Z","updated_at":"2026-01-03T01:04:40.749Z","avatar_url":"https://github.com/ahnlabcloudmatelabs.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n![cloudmate logo](https://avatars.githubusercontent.com/u/69299682?s=200\u0026v=4)\n\n# ActivityPub Signature header\n\n\u003csmall style=\"opacity: 0.7;\"\u003eby Cloudmate\u003c/small\u003e\n\n---\n\n![Golang](https://img.shields.io/badge/Go-00ADD8?style=for-the-badge\u0026logo=go\u0026logoColor=white)\n\n[![Go Test](https://github.com/cloudmatelabs/go-activitypub-signature-header/actions/workflows/gotest.yml/badge.svg)](https://github.com/cloudmatelabs/go-activitypub-signature-header/actions/workflows/gotest.yml)\n\n\u003c/div\u003e\n\n## Install\n\n```bash\ngo get -u github.com/cloudmatelabs/go-activitypub-signature-header\n```\n\n## Introduce\n\nThis library is generate `Signature` header for the connect with ActivityPub federations.  \nAnd verify the `Signature` header.\n\n## Usage\n\n### Sign `Signature` header\n\n```go\nimport (\n  \"crypto\"\n  \"net/url\"\n\n  \"github.com/go-resty/resty/v2\"\n  signature_header \"github.com/cloudmatelabs/go-activitypub-signature-header\"\n)\n\nrequestURL, _ := url.Parse(\"https://yodangang.express/users/9iffvxhojp/inbox\")\nmessage := []byte(`{\n  \"@context\": \"https://www.w3.org/ns/activitystreams\",\n  \"id\": \"https://snippet.social/@juunini\",\n  \"type\": \"Follow\",\n  \"actor\": \"https://snippet.social/@juunini\",\n  \"object\": \"https://yodangang.express/users/9iffvxhojp\"\n}`)\n\nheaders, err := signature_header.Generate(signature_header.GenerateInput{\n  PrivateKeyBytes: []byte(\"-----BEGIN RSA PRIVATE KEY-----...\"),\n  // Algorithm:       crypto.SHA256, // optional. if not set, default is crypto.SHA256\n  Host:            requestURL.Host,\n  Path:            requestURL.Path,\n  Body:            message,\n  KeyID:           \"https://snippet.social/@juunini#main-key\",\n})\nif err != nil {\n  // handle error\n}\n\nresty.New().R().\n  SetBody(message).\n  SetHeader(\"Date\", headers.Date).\n  SetHeader(\"Digest\", headers.Digest).\n  SetHeader(\"Host\", headers.Host).\n  SetHeader(\"Signature\", headers.Signature).\n  SetHeader(\"Content-Type\", \"application/activity+json\").\n  Post(requestURL.String())\n```\n\n### Verify `Signature` header\n\n```go\nimport (\n  signature_header \"github.com/cloudmatelabs/go-activitypub-signature-header\"\n)\n\nverifier := signature_header.Verifier{\n  Method: \"POST\",\n  URL: \"https://snippet.social/@juunini/inbox\",\n  Headers: map[string]string{\n    \"Signature\": \"...\",\n    \"Host\": \"...\",\n    \"Date\": \"...\",\n    \"Digest\": \"...\",\n    \"Authorization\": \"...\",\n    \"...\": \"...\",\n  },\n}\n\n// Recommended\nerr := verifier.VerifyWithPublicKey(publicKey)\nerr := verifier.VerifyWithPublicKeyStr(publicKeyStr)\n\n// You can use, but not recommended\nerr := verifier.VerifyWithActor(\"https://yodangang.express/@juunini\")\nerr := verifier.VerifyWithBody([]byte(\"{...}\"))\n```\n\n### Parse `Signature` header\n\n```go\nimport (\n  signature_header \"github.com/cloudmatelabs/go-activitypub-signature-header\"\n)\n\n// map[string]string\nparams := signature_header.ParseSignature(signature)\n// or given Signature authorization header\n// params := signature_header.ParseSignature(authorization)\n\nparams[\"keyId\"]\nparams[\"algorithm\"]\nparams[\"headers\"]\nparams[\"signature\"]\n```\n\n## License\n\n[MIT](LICENSE)\n\nBut, this library use [httpsig].  \n[httpsig] is licensed under the [BSD 3-Clause License](https://github.com/go-fed/httpsig/blob/master/LICENSE)\n\n[httpsig]: https://github.com/go-fed/httpsig\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahnlabcloudmatelabs%2Fgo-activitypub-signature-header","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fahnlabcloudmatelabs%2Fgo-activitypub-signature-header","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fahnlabcloudmatelabs%2Fgo-activitypub-signature-header/lists"}