7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package crypto
|
||
|
||
import (
|
||
"crypto/rsa"
|
||
// #nosec
|
||
//
|
||
// Allowing sha1 because it is used in MTProto itself.
|
||
"crypto/sha1"
|
||
"math/big"
|
||
)
|
||
|
||
// RSAKeyBits is RSA key size.
|
||
//
|
||
// Can be used as rsa.GenerateKey(src, RSAKeyBits).
|
||
const RSAKeyBits = 2048
|
||
|
||
const (
|
||
rsaLen = 256
|
||
rsaWithHashLen = 255
|
||
rsaDataLen = rsaWithHashLen - sha1.Size
|
||
)
|
||
|
||
// RSAPublicDecrypt recovers the message digest from the raw signature
|
||
// using the signer’s RSA public key.
|
||
//
|
||
// See also OpenSSL’s RSA_public_decrypt with RSA_NO_PADDING.
|
||
func RSAPublicDecrypt(pub *rsa.PublicKey, sig []byte) ([]byte, error) {
|
||
k := pub.Size()
|
||
if k < 11 || k != len(sig) {
|
||
return nil, rsa.ErrVerification
|
||
}
|
||
|
||
c := new(big.Int).SetBytes(sig)
|
||
e := big.NewInt(int64(pub.E))
|
||
m := new(big.Int).Exp(c, e, pub.N)
|
||
|
||
return m.Bytes(), nil
|
||
}
|
||
|
||
func rsaEncrypt(data []byte, key *rsa.PublicKey) []byte {
|
||
z := new(big.Int).SetBytes(data)
|
||
e := big.NewInt(int64(key.E))
|
||
c := new(big.Int).Exp(z, e, key.N)
|
||
res := make([]byte, rsaLen)
|
||
c.FillBytes(res)
|
||
return res
|
||
}
|
||
|
||
func rsaDecrypt(data []byte, key *rsa.PrivateKey, to []byte) bool {
|
||
c := new(big.Int).SetBytes(data)
|
||
m := new(big.Int).Exp(c, key.D, key.N)
|
||
return FillBytes(m, to)
|
||
}
|