QA@IT
«質問へ戻る

質問を投稿

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

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

[環境]
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")
    }
}
下記は状態を再現する為に作成したあまり小さくはないですが最小のコードです。
何か情報をお持ちの方がいましたら教えていただけると幸いです。

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

```Go
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")
	}
}
```