๐Ÿ“ฆ Kong / go-srp

Secure Remote Password library for Go

โ˜… 49 stars โ‘‚ 13 forks ๐Ÿ‘ 49 watching โš–๏ธ MIT License
๐Ÿ“ฅ Clone https://github.com/Kong/go-srp.git
HTTPS git clone https://github.com/Kong/go-srp.git
SSH git clone git@github.com:Kong/go-srp.git
CLI gh repo clone Kong/go-srp
Gregory Schier Gregory Schier Point to new repo cde1efa 6 years ago ๐Ÿ“ History
๐Ÿ“‚ master View all commits โ†’
๐Ÿ“„ .gitignore
๐Ÿ“„ .travis.yml
๐Ÿ“„ client.go
๐Ÿ“„ LICENSE
๐Ÿ“„ params.go
๐Ÿ“„ README.md
๐Ÿ“„ server.go
๐Ÿ“„ srp_test.go
๐Ÿ“„ srp.go
๐Ÿ“„ util.go
๐Ÿ“„ README.md

go-srp

_NOTE: This is a port of node-srp to Go. I recommend reading their README for general information about the use of SRP._

Installation

go get github.com/kong/go-srp

Usage

View GoDoc for full details

To use SRP, first decide on they parameters you will use. Both client and server must use the same set.

params := srp.GetParams(2048)

Account Creation

To create a new account, generate a verifier from the client, and store it on the server.

verifier := srp.ComputeVerifier(params, salt, identity, password)

Login

From the client... generate a new secret key, initialize the client, and compute A. Once you have A, you can send A to the server.

secret1 := srp.GenKey()
client := NewClient(params, salt, identity, secret, a)
srpA := client.computeA()

sendToServer(srpA)

From the server... generate another secret key, initialize the server, and compute B. Once you have B, you can send B to the client.

secret2 := srp.GenKey()
server := NewServer(params, verifier, secret2)
srpB := client.computeB()

sendToClient(srpB)

Once the client received B from the server, it can compute M1 based on A and B. Once you have M1, send M1 to the server.

client.setB(srpB)
srpM1 := client.ComputeM1()
sendM1ToServer(srpM1)

Once the server receives M1, it can verify that it is correct. If checkM1() returns an error, authentication failed. If it succeeds it should be sent to the client.

srpM2, err := server.checkM1(srpM1)

Once the client receives M2, it can verify that it is correct, and know that authentication was successful.

err = client.CheckM2(serverM2)
`

Now that both client and server have completed a successful authentication, they can both compute K independently. K can now be used as either a key to encrypt communication or as a session ID.

clientK := client.ComputeK()
serverK := server.ComputeK()

Running Tests

go test

_Tests include vectors from RFC 5054, Appendix B._

Licence

MIT