Skip to content
/ scram Public

Go implementation of RFC-5802 Salted Challenge Response Authentication Mechanism (SCRAM)

License

Notifications You must be signed in to change notification settings

xdg-go/scram

Folders and files

NameName
Last commit message
Last commit date

Latest commit

17629a5 · Dec 7, 2022

History

38 Commits
Dec 7, 2022
Jan 16, 2022
Mar 4, 2018
Dec 7, 2022
Mar 4, 2018
Mar 27, 2021
Mar 28, 2021
Aug 10, 2018
Aug 10, 2018
Aug 14, 2018
Aug 10, 2018
Jan 16, 2022
Mar 26, 2021
Dec 7, 2022
Dec 7, 2022
Aug 10, 2018
Jan 16, 2022
Aug 10, 2018
Aug 10, 2018
Mar 26, 2021
Jan 16, 2022

Repository files navigation

Go Reference Go Report Card Github Actions

scram – Go implementation of RFC-5802

Description

Package scram provides client and server implementations of the Salted Challenge Response Authentication Mechanism (SCRAM) described in RFC-5802 and RFC-7677.

It includes both client and server side support.

Channel binding and extensions are not (yet) supported.

Examples

Client side

package main

import "github.com/xdg-go/scram"

func main() {
    // Get Client with username, password and (optional) authorization ID.
    clientSHA1, err := scram.SHA1.NewClient("mulder", "trustno1", "")
    if err != nil {
        panic(err)
    }

    // Prepare the authentication conversation. Use the empty string as the
    // initial server message argument to start the conversation.
    conv := clientSHA1.NewConversation()
    var serverMsg string

    // Get the first message, send it and read the response.
    firstMsg, err := conv.Step(serverMsg)
    if err != nil {
        panic(err)
    }
    serverMsg = sendClientMsg(firstMsg)

    // Get the second message, send it, and read the response.
    secondMsg, err := conv.Step(serverMsg)
    if err != nil {
        panic(err)
    }
    serverMsg = sendClientMsg(secondMsg)

    // Validate the server's final message.  We have no further message to
    // send so ignore that return value.
    _, err = conv.Step(serverMsg)
    if err != nil {
        panic(err)
    }

    return
}

func sendClientMsg(s string) string {
    // A real implementation would send this to a server and read a reply.
    return ""
}

Copyright and License

Copyright 2018 by David A. Golden. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License"). You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0