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.
64 lines
1.3 KiB
64 lines
1.3 KiB
3 years ago
|
// 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)
|
||
|
}
|