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
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) |
|
}
|
|
|