You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

63 lines
1.3 KiB

// Package srp contains implementation of Secure Remote Password protocol.
package srp
import (
"crypto/sha256"
"io"
"math/big"
"github.com/go-faster/xor"
"github.com/gotd/td/internal/crypto"
)
// SRP is client implementation of Secure Remote Password protocol.
//
// See https://core.telegram.org/api/srp.
type SRP struct {
random io.Reader
}
// NewSRP creates new SRP instance.
func NewSRP(random io.Reader) SRP {
return SRP{random: random}
}
// Input is hashing algorithm parameters from server.
//
// Copy of tg.PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow
type Input struct {
// One of two salts used by the derivation function (see SRP 2FA login)
Salt1 []byte
// One of two salts used by the derivation function (see SRP 2FA login)
Salt2 []byte
// Base (see SRP 2FA login)
G int
// 2048-bit modulus (see SRP 2FA login)
P []byte
}
// Answer is result of SRP algorithm.
type Answer struct {
// A parameter (see SRP)
A []byte
// M1 parameter (see SRP)
M1 []byte
}
func xor32(a, b [sha256.Size]byte) (res [sha256.Size]byte) {
xor.Bytes(res[:], a[:], b[:])
return res
}
func (s SRP) bigFromBytes(b []byte) *big.Int {
return new(big.Int).SetBytes(b)
}
func (s SRP) bigExp(x, y, m *big.Int) *big.Int {
return new(big.Int).Exp(x, y, m)
}
func checkInput(g int, p *big.Int) error {
return crypto.CheckDH(g, p)
}