QA@IT

Secure Remote Passwords protocol(SRP-6a)によるクライアント/サーバーの認証が成功しない。

8195 PV

下記は状態を再現する為に作成したあまり小さくはないですが最小のコードです。
何か情報をお持ちの方がいましたら教えていただけると幸いです。

[環境]
Windows 10
go version go1.8.1 windows/amd64

package main

import (
    "crypto/sha512"
    "fmt"
    "log"

    "github.com/tadglines/go-pkgs/crypto/srp"
)

// KeyDerivativeFuncRFC2945 returns the SRP-6a key derivative function which does
func KeyDerivativeFuncRFC2945(h srp.HashFunc, username []byte) srp.KeyDerivationFunc {
    return func(salt, pin []byte) []byte {
        h := h()
        h.Write(username)
        h.Write([]byte(":"))
        h.Write(pin)
        t2 := h.Sum(nil)
        h.Reset()
        h.Write(salt)
        h.Write(t2)
        return h.Sum(nil)
    }
}

func main() {
    pairName := []byte("Pair-Setup")
    password := []byte("12344321")

    isrp, err := srp.NewSRP("rfc5054.3072", sha512.New, KeyDerivativeFuncRFC2945(sha512.New, []byte(pairName)))
    if err != nil {
        fmt.Println(err)
        return
    }

    isrp.SaltLength = 16
    salt, v, err := isrp.ComputeVerifier(password)
    if err != nil {
        fmt.Println(err)
        return
    }
    ss := isrp.NewServerSession(pairName, salt, v)

    cs := isrp.NewClientSession(pairName, password)
    ckey, err := cs.ComputeKey(salt, ss.GetB())
    if err != nil {
        fmt.Println(err)
        return
    }
    log.Printf("The Client's computed session key is: %v\n", ckey)

    skey, err := ss.ComputeKey(cs.GetA())
    if err != nil {
        fmt.Println(err)
        return
    }
    log.Printf("The Server's computed session key is: %v\n", skey)

    cauth := cs.ComputeAuthenticator()
    if !cs.VerifyServerAuthenticator(cauth) {
        // 失敗してしまう。
        fmt.Println("Client Authenticator is not valid")
    }

    sauth := ss.ComputeAuthenticator(cauth)
    if !ss.VerifyClientAuthenticator(sauth) {
        // 失敗してしまう。
        fmt.Println("Server Authenticator is not valid")
    }
}

回答

的外れだったら申し訳ないです。とりあえず気になったのですがcs.VerifyServerAuthenticatorss.VerifyClientAuthenticatorが逆ではないでしょうか?

    cauth := cs.ComputeAuthenticator()
    if !ss.VerifyClientAuthenticator(cauth) {
        // 失敗してしまう。
        fmt.Println("Client Authenticator is not valid")
    }

    sauth := ss.ComputeAuthenticator(cauth)
    if !cs.VerifyServerAuthenticator(sauth) {
        // 失敗してしまう。
        fmt.Println("Server Authenticator is not valid")
    }
編集 履歴 (0)
  • ありがとうございます。
    その通りでした。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。