updated deps; updated healthchecks.io integration
This commit is contained in:
80
vendor/maunium.net/go/mautrix/crypto/olm/pk_goolm.go
generated
vendored
80
vendor/maunium.net/go/mautrix/crypto/olm/pk_goolm.go
generated
vendored
@@ -1,71 +1,29 @@
|
||||
// Copyright (c) 2024 Sumner Evans
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
// When the goolm build flag is enabled, this file will make [PKSigning]
|
||||
// constructors use the goolm constuctors.
|
||||
|
||||
//go:build goolm
|
||||
|
||||
package olm
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
import "maunium.net/go/mautrix/crypto/goolm/pk"
|
||||
|
||||
"github.com/tidwall/sjson"
|
||||
|
||||
"maunium.net/go/mautrix/crypto/canonicaljson"
|
||||
"maunium.net/go/mautrix/crypto/goolm/pk"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
// PkSigning stores a key pair for signing messages.
|
||||
type PkSigning struct {
|
||||
pk.Signing
|
||||
PublicKey id.Ed25519
|
||||
Seed []byte
|
||||
// NewPKSigningFromSeed creates a new PKSigning object using the given seed.
|
||||
func NewPKSigningFromSeed(seed []byte) (PKSigning, error) {
|
||||
return pk.NewSigningFromSeed(seed)
|
||||
}
|
||||
|
||||
// Clear clears the underlying memory of a PkSigning object.
|
||||
func (p *PkSigning) Clear() {
|
||||
p.Signing = pk.Signing{}
|
||||
// NewPKSigning creates a new [PKSigning] object, containing a key pair for
|
||||
// signing messages.
|
||||
func NewPKSigning() (PKSigning, error) {
|
||||
return pk.NewSigning()
|
||||
}
|
||||
|
||||
// NewPkSigningFromSeed creates a new PkSigning object using the given seed.
|
||||
func NewPkSigningFromSeed(seed []byte) (*PkSigning, error) {
|
||||
p := &PkSigning{}
|
||||
signing, err := pk.NewSigningFromSeed(seed)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.Signing = *signing
|
||||
p.Seed = seed
|
||||
p.PublicKey = p.Signing.PublicKey()
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// NewPkSigning creates a new PkSigning object, containing a key pair for signing messages.
|
||||
func NewPkSigning() (*PkSigning, error) {
|
||||
p := &PkSigning{}
|
||||
signing, err := pk.NewSigning()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.Signing = *signing
|
||||
p.Seed = signing.Seed
|
||||
p.PublicKey = p.Signing.PublicKey()
|
||||
return p, err
|
||||
}
|
||||
|
||||
// Sign creates a signature for the given message using this key.
|
||||
func (p *PkSigning) Sign(message []byte) ([]byte, error) {
|
||||
return p.Signing.Sign(message), nil
|
||||
}
|
||||
|
||||
// SignJSON creates a signature for the given object after encoding it to canonical JSON.
|
||||
func (p *PkSigning) SignJSON(obj interface{}) (string, error) {
|
||||
objJSON, err := json.Marshal(obj)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
objJSON, _ = sjson.DeleteBytes(objJSON, "unsigned")
|
||||
objJSON, _ = sjson.DeleteBytes(objJSON, "signatures")
|
||||
signature, err := p.Sign(canonicaljson.CanonicalJSONAssumeValid(objJSON))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(signature), nil
|
||||
func NewPKDecryption(privateKey []byte) (PKDecryption, error) {
|
||||
return pk.NewDecryption()
|
||||
}
|
||||
|
||||
41
vendor/maunium.net/go/mautrix/crypto/olm/pk_interface.go
generated
vendored
Normal file
41
vendor/maunium.net/go/mautrix/crypto/olm/pk_interface.go
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
// Copyright (c) 2024 Sumner Evans
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
package olm
|
||||
|
||||
import (
|
||||
"maunium.net/go/mautrix/crypto/goolm/pk"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
// PKSigning is an interface for signing messages.
|
||||
type PKSigning interface {
|
||||
// Seed returns the seed of the key.
|
||||
Seed() []byte
|
||||
|
||||
// PublicKey returns the public key.
|
||||
PublicKey() id.Ed25519
|
||||
|
||||
// Sign creates a signature for the given message using this key.
|
||||
Sign(message []byte) ([]byte, error)
|
||||
|
||||
// SignJSON creates a signature for the given object after encoding it to
|
||||
// canonical JSON.
|
||||
SignJSON(obj any) (string, error)
|
||||
}
|
||||
|
||||
var _ PKSigning = (*pk.Signing)(nil)
|
||||
|
||||
// PKDecryption is an interface for decrypting messages.
|
||||
type PKDecryption interface {
|
||||
// PublicKey returns the public key.
|
||||
PublicKey() id.Curve25519
|
||||
|
||||
// Decrypt verifies and decrypts the given message.
|
||||
Decrypt(ciphertext, mac []byte, key id.Curve25519) ([]byte, error)
|
||||
}
|
||||
|
||||
var _ PKDecryption = (*pk.Decryption)(nil)
|
||||
@@ -1,3 +1,9 @@
|
||||
// Copyright (c) 2024 Sumner Evans
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
//go:build !goolm
|
||||
|
||||
package olm
|
||||
@@ -18,14 +24,17 @@ import (
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
// PkSigning stores a key pair for signing messages.
|
||||
type PkSigning struct {
|
||||
// LibOlmPKSigning stores a key pair for signing messages.
|
||||
type LibOlmPKSigning struct {
|
||||
int *C.OlmPkSigning
|
||||
mem []byte
|
||||
PublicKey id.Ed25519
|
||||
Seed []byte
|
||||
publicKey id.Ed25519
|
||||
seed []byte
|
||||
}
|
||||
|
||||
// Ensure that LibOlmPKSigning implements PKSigning.
|
||||
var _ PKSigning = (*LibOlmPKSigning)(nil)
|
||||
|
||||
func pkSigningSize() uint {
|
||||
return uint(C.olm_pk_signing_size())
|
||||
}
|
||||
@@ -42,48 +51,57 @@ func pkSigningSignatureLength() uint {
|
||||
return uint(C.olm_pk_signature_length())
|
||||
}
|
||||
|
||||
func NewBlankPkSigning() *PkSigning {
|
||||
func newBlankPKSigning() *LibOlmPKSigning {
|
||||
memory := make([]byte, pkSigningSize())
|
||||
return &PkSigning{
|
||||
return &LibOlmPKSigning{
|
||||
int: C.olm_pk_signing(unsafe.Pointer(&memory[0])),
|
||||
mem: memory,
|
||||
}
|
||||
}
|
||||
|
||||
// Clear clears the underlying memory of a PkSigning object.
|
||||
func (p *PkSigning) Clear() {
|
||||
C.olm_clear_pk_signing((*C.OlmPkSigning)(p.int))
|
||||
}
|
||||
|
||||
// NewPkSigningFromSeed creates a new PkSigning object using the given seed.
|
||||
func NewPkSigningFromSeed(seed []byte) (*PkSigning, error) {
|
||||
p := NewBlankPkSigning()
|
||||
p.Clear()
|
||||
// NewPKSigningFromSeed creates a new [PKSigning] object using the given seed.
|
||||
func NewPKSigningFromSeed(seed []byte) (PKSigning, error) {
|
||||
p := newBlankPKSigning()
|
||||
p.clear()
|
||||
pubKey := make([]byte, pkSigningPublicKeyLength())
|
||||
if C.olm_pk_signing_key_from_seed((*C.OlmPkSigning)(p.int),
|
||||
unsafe.Pointer(&pubKey[0]), C.size_t(len(pubKey)),
|
||||
unsafe.Pointer(&seed[0]), C.size_t(len(seed))) == errorVal() {
|
||||
return nil, p.lastError()
|
||||
}
|
||||
p.PublicKey = id.Ed25519(pubKey)
|
||||
p.Seed = seed
|
||||
p.publicKey = id.Ed25519(pubKey)
|
||||
p.seed = seed
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// NewPkSigning creates a new PkSigning object, containing a key pair for signing messages.
|
||||
func NewPkSigning() (*PkSigning, error) {
|
||||
// NewPKSigning creates a new LibOlmPKSigning object, containing a key pair for
|
||||
// signing messages.
|
||||
func NewPKSigning() (PKSigning, error) {
|
||||
// Generate the seed
|
||||
seed := make([]byte, pkSigningSeedLength())
|
||||
_, err := rand.Read(seed)
|
||||
if err != nil {
|
||||
panic(NotEnoughGoRandom)
|
||||
}
|
||||
pk, err := NewPkSigningFromSeed(seed)
|
||||
pk, err := NewPKSigningFromSeed(seed)
|
||||
return pk, err
|
||||
}
|
||||
|
||||
func (p *LibOlmPKSigning) PublicKey() id.Ed25519 {
|
||||
return p.publicKey
|
||||
}
|
||||
|
||||
func (p *LibOlmPKSigning) Seed() []byte {
|
||||
return p.seed
|
||||
}
|
||||
|
||||
// clear clears the underlying memory of a LibOlmPKSigning object.
|
||||
func (p *LibOlmPKSigning) clear() {
|
||||
C.olm_clear_pk_signing((*C.OlmPkSigning)(p.int))
|
||||
}
|
||||
|
||||
// Sign creates a signature for the given message using this key.
|
||||
func (p *PkSigning) Sign(message []byte) ([]byte, error) {
|
||||
func (p *LibOlmPKSigning) Sign(message []byte) ([]byte, error) {
|
||||
signature := make([]byte, pkSigningSignatureLength())
|
||||
if C.olm_pk_sign((*C.OlmPkSigning)(p.int), (*C.uint8_t)(unsafe.Pointer(&message[0])), C.size_t(len(message)),
|
||||
(*C.uint8_t)(unsafe.Pointer(&signature[0])), C.size_t(len(signature))) == errorVal() {
|
||||
@@ -93,7 +111,7 @@ func (p *PkSigning) Sign(message []byte) ([]byte, error) {
|
||||
}
|
||||
|
||||
// SignJSON creates a signature for the given object after encoding it to canonical JSON.
|
||||
func (p *PkSigning) SignJSON(obj interface{}) (string, error) {
|
||||
func (p *LibOlmPKSigning) SignJSON(obj interface{}) (string, error) {
|
||||
objJSON, err := json.Marshal(obj)
|
||||
if err != nil {
|
||||
return "", err
|
||||
@@ -107,12 +125,13 @@ func (p *PkSigning) SignJSON(obj interface{}) (string, error) {
|
||||
return string(signature), nil
|
||||
}
|
||||
|
||||
// lastError returns the last error that happened in relation to this PkSigning object.
|
||||
func (p *PkSigning) lastError() error {
|
||||
// lastError returns the last error that happened in relation to this
|
||||
// LibOlmPKSigning object.
|
||||
func (p *LibOlmPKSigning) lastError() error {
|
||||
return convertError(C.GoString(C.olm_pk_signing_last_error((*C.OlmPkSigning)(p.int))))
|
||||
}
|
||||
|
||||
type PkDecryption struct {
|
||||
type LibOlmPKDecryption struct {
|
||||
int *C.OlmPkDecryption
|
||||
mem []byte
|
||||
PublicKey []byte
|
||||
@@ -126,13 +145,13 @@ func pkDecryptionPublicKeySize() uint {
|
||||
return uint(C.olm_pk_key_length())
|
||||
}
|
||||
|
||||
func NewPkDecryption(privateKey []byte) (*PkDecryption, error) {
|
||||
func NewPkDecryption(privateKey []byte) (*LibOlmPKDecryption, error) {
|
||||
memory := make([]byte, pkDecryptionSize())
|
||||
p := &PkDecryption{
|
||||
p := &LibOlmPKDecryption{
|
||||
int: C.olm_pk_decryption(unsafe.Pointer(&memory[0])),
|
||||
mem: memory,
|
||||
}
|
||||
p.Clear()
|
||||
p.clear()
|
||||
pubKey := make([]byte, pkDecryptionPublicKeySize())
|
||||
|
||||
if C.olm_pk_key_from_private((*C.OlmPkDecryption)(p.int),
|
||||
@@ -145,7 +164,7 @@ func NewPkDecryption(privateKey []byte) (*PkDecryption, error) {
|
||||
return p, nil
|
||||
}
|
||||
|
||||
func (p *PkDecryption) Decrypt(ephemeralKey []byte, mac []byte, ciphertext []byte) ([]byte, error) {
|
||||
func (p *LibOlmPKDecryption) Decrypt(ephemeralKey []byte, mac []byte, ciphertext []byte) ([]byte, error) {
|
||||
maxPlaintextLength := uint(C.olm_pk_max_plaintext_length((*C.OlmPkDecryption)(p.int), C.size_t(len(ciphertext))))
|
||||
plaintext := make([]byte, maxPlaintextLength)
|
||||
|
||||
@@ -162,11 +181,12 @@ func (p *PkDecryption) Decrypt(ephemeralKey []byte, mac []byte, ciphertext []byt
|
||||
}
|
||||
|
||||
// Clear clears the underlying memory of a PkDecryption object.
|
||||
func (p *PkDecryption) Clear() {
|
||||
func (p *LibOlmPKDecryption) clear() {
|
||||
C.olm_clear_pk_decryption((*C.OlmPkDecryption)(p.int))
|
||||
}
|
||||
|
||||
// lastError returns the last error that happened in relation to this PkDecryption object.
|
||||
func (p *PkDecryption) lastError() error {
|
||||
// lastError returns the last error that happened in relation to this
|
||||
// LibOlmPKDecryption object.
|
||||
func (p *LibOlmPKDecryption) lastError() error {
|
||||
return convertError(C.GoString(C.olm_pk_decryption_last_error((*C.OlmPkDecryption)(p.int))))
|
||||
}
|
||||
146
vendor/maunium.net/go/mautrix/crypto/olm/utility.go
generated
vendored
146
vendor/maunium.net/go/mautrix/crypto/olm/utility.go
generated
vendored
@@ -1,146 +0,0 @@
|
||||
//go:build !goolm
|
||||
|
||||
package olm
|
||||
|
||||
// #cgo LDFLAGS: -lolm -lstdc++
|
||||
// #include <olm/olm.h>
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"unsafe"
|
||||
|
||||
"github.com/tidwall/gjson"
|
||||
"github.com/tidwall/sjson"
|
||||
"go.mau.fi/util/exgjson"
|
||||
|
||||
"maunium.net/go/mautrix/crypto/canonicaljson"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
// Utility stores the necessary state to perform hash and signature
|
||||
// verification operations.
|
||||
type Utility struct {
|
||||
int *C.OlmUtility
|
||||
mem []byte
|
||||
}
|
||||
|
||||
// utilitySize returns the size of a utility object in bytes.
|
||||
func utilitySize() uint {
|
||||
return uint(C.olm_utility_size())
|
||||
}
|
||||
|
||||
// sha256Len returns the length of the buffer needed to hold the SHA-256 hash.
|
||||
func (u *Utility) sha256Len() uint {
|
||||
return uint(C.olm_sha256_length((*C.OlmUtility)(u.int)))
|
||||
}
|
||||
|
||||
// lastError returns an error describing the most recent error to happen to a
|
||||
// utility.
|
||||
func (u *Utility) lastError() error {
|
||||
return convertError(C.GoString(C.olm_utility_last_error((*C.OlmUtility)(u.int))))
|
||||
}
|
||||
|
||||
// Clear clears the memory used to back this utility.
|
||||
func (u *Utility) Clear() error {
|
||||
r := C.olm_clear_utility((*C.OlmUtility)(u.int))
|
||||
if r == errorVal() {
|
||||
return u.lastError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// NewUtility creates a new utility.
|
||||
func NewUtility() *Utility {
|
||||
memory := make([]byte, utilitySize())
|
||||
return &Utility{
|
||||
int: C.olm_utility(unsafe.Pointer(&memory[0])),
|
||||
mem: memory,
|
||||
}
|
||||
}
|
||||
|
||||
// Sha256 calculates the SHA-256 hash of the input and encodes it as base64.
|
||||
func (u *Utility) Sha256(input string) string {
|
||||
if len(input) == 0 {
|
||||
panic(EmptyInput)
|
||||
}
|
||||
output := make([]byte, u.sha256Len())
|
||||
r := C.olm_sha256(
|
||||
(*C.OlmUtility)(u.int),
|
||||
unsafe.Pointer(&([]byte(input)[0])),
|
||||
C.size_t(len(input)),
|
||||
unsafe.Pointer(&(output[0])),
|
||||
C.size_t(len(output)))
|
||||
if r == errorVal() {
|
||||
panic(u.lastError())
|
||||
}
|
||||
return string(output)
|
||||
}
|
||||
|
||||
// VerifySignature verifies an ed25519 signature. Returns true if the verification
|
||||
// suceeds or false otherwise. Returns error on failure. If the key was too
|
||||
// small then the error will be "INVALID_BASE64".
|
||||
func (u *Utility) VerifySignature(message string, key id.Ed25519, signature string) (ok bool, err error) {
|
||||
if len(message) == 0 || len(key) == 0 || len(signature) == 0 {
|
||||
return false, EmptyInput
|
||||
}
|
||||
r := C.olm_ed25519_verify(
|
||||
(*C.OlmUtility)(u.int),
|
||||
unsafe.Pointer(&([]byte(key)[0])),
|
||||
C.size_t(len(key)),
|
||||
unsafe.Pointer(&([]byte(message)[0])),
|
||||
C.size_t(len(message)),
|
||||
unsafe.Pointer(&([]byte(signature)[0])),
|
||||
C.size_t(len(signature)))
|
||||
if r == errorVal() {
|
||||
err = u.lastError()
|
||||
if err == BadMessageMAC {
|
||||
err = nil
|
||||
}
|
||||
} else {
|
||||
ok = true
|
||||
}
|
||||
return ok, err
|
||||
}
|
||||
|
||||
// VerifySignatureJSON verifies the signature in the JSON object _obj following
|
||||
// the Matrix specification:
|
||||
// https://matrix.org/speculator/spec/drafts%2Fe2e/appendices.html#signing-json
|
||||
// If the _obj is a struct, the `json` tags will be honored.
|
||||
func (u *Utility) VerifySignatureJSON(obj interface{}, userID id.UserID, keyName string, key id.Ed25519) (bool, error) {
|
||||
var err error
|
||||
objJSON, ok := obj.(json.RawMessage)
|
||||
if !ok {
|
||||
objJSON, err = json.Marshal(obj)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
sig := gjson.GetBytes(objJSON, exgjson.Path("signatures", string(userID), fmt.Sprintf("ed25519:%s", keyName)))
|
||||
if !sig.Exists() || sig.Type != gjson.String {
|
||||
return false, SignatureNotFound
|
||||
}
|
||||
objJSON, err = sjson.DeleteBytes(objJSON, "unsigned")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
objJSON, err = sjson.DeleteBytes(objJSON, "signatures")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
objJSONString := string(canonicaljson.CanonicalJSONAssumeValid(objJSON))
|
||||
return u.VerifySignature(objJSONString, key, sig.Str)
|
||||
}
|
||||
|
||||
// VerifySignatureJSON verifies the signature in the JSON object _obj following
|
||||
// the Matrix specification:
|
||||
// https://matrix.org/speculator/spec/drafts%2Fe2e/appendices.html#signing-json
|
||||
// This function is a wrapper over Utility.VerifySignatureJSON that creates and
|
||||
// destroys the Utility object transparently.
|
||||
// If the _obj is a struct, the `json` tags will be honored.
|
||||
func VerifySignatureJSON(obj interface{}, userID id.UserID, keyName string, key id.Ed25519) (bool, error) {
|
||||
u := NewUtility()
|
||||
defer u.Clear()
|
||||
return u.VerifySignatureJSON(obj, userID, keyName, key)
|
||||
}
|
||||
92
vendor/maunium.net/go/mautrix/crypto/olm/utility_goolm.go
generated
vendored
92
vendor/maunium.net/go/mautrix/crypto/olm/utility_goolm.go
generated
vendored
@@ -1,92 +0,0 @@
|
||||
//go:build goolm
|
||||
|
||||
package olm
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/tidwall/gjson"
|
||||
"github.com/tidwall/sjson"
|
||||
"go.mau.fi/util/exgjson"
|
||||
|
||||
"maunium.net/go/mautrix/crypto/canonicaljson"
|
||||
"maunium.net/go/mautrix/crypto/goolm/utilities"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
// Utility stores the necessary state to perform hash and signature
|
||||
// verification operations.
|
||||
type Utility struct{}
|
||||
|
||||
// Clear clears the memory used to back this utility.
|
||||
func (u *Utility) Clear() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// NewUtility creates a new utility.
|
||||
func NewUtility() *Utility {
|
||||
return &Utility{}
|
||||
}
|
||||
|
||||
// Sha256 calculates the SHA-256 hash of the input and encodes it as base64.
|
||||
func (u *Utility) Sha256(input string) string {
|
||||
if len(input) == 0 {
|
||||
panic(EmptyInput)
|
||||
}
|
||||
hash := sha256.Sum256([]byte(input))
|
||||
return base64.RawStdEncoding.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
// VerifySignature verifies an ed25519 signature. Returns true if the verification
|
||||
// suceeds or false otherwise. Returns error on failure. If the key was too
|
||||
// small then the error will be "INVALID_BASE64".
|
||||
func (u *Utility) VerifySignature(message string, key id.Ed25519, signature string) (ok bool, err error) {
|
||||
if len(message) == 0 || len(key) == 0 || len(signature) == 0 {
|
||||
return false, EmptyInput
|
||||
}
|
||||
return utilities.VerifySignature([]byte(message), key, []byte(signature))
|
||||
}
|
||||
|
||||
// VerifySignatureJSON verifies the signature in the JSON object _obj following
|
||||
// the Matrix specification:
|
||||
// https://matrix.org/speculator/spec/drafts%2Fe2e/appendices.html#signing-json
|
||||
// If the _obj is a struct, the `json` tags will be honored.
|
||||
func (u *Utility) VerifySignatureJSON(obj interface{}, userID id.UserID, keyName string, key id.Ed25519) (bool, error) {
|
||||
var err error
|
||||
objJSON, ok := obj.(json.RawMessage)
|
||||
if !ok {
|
||||
objJSON, err = json.Marshal(obj)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
sig := gjson.GetBytes(objJSON, exgjson.Path("signatures", string(userID), fmt.Sprintf("ed25519:%s", keyName)))
|
||||
if !sig.Exists() || sig.Type != gjson.String {
|
||||
return false, SignatureNotFound
|
||||
}
|
||||
objJSON, err = sjson.DeleteBytes(objJSON, "unsigned")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
objJSON, err = sjson.DeleteBytes(objJSON, "signatures")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
objJSONString := string(canonicaljson.CanonicalJSONAssumeValid(objJSON))
|
||||
return u.VerifySignature(objJSONString, key, sig.Str)
|
||||
}
|
||||
|
||||
// VerifySignatureJSON verifies the signature in the JSON object _obj following
|
||||
// the Matrix specification:
|
||||
// https://matrix.org/speculator/spec/drafts%2Fe2e/appendices.html#signing-json
|
||||
// This function is a wrapper over Utility.VerifySignatureJSON that creates and
|
||||
// destroys the Utility object transparently.
|
||||
// If the _obj is a struct, the `json` tags will be honored.
|
||||
func VerifySignatureJSON(obj interface{}, userID id.UserID, keyName string, key id.Ed25519) (bool, error) {
|
||||
u := NewUtility()
|
||||
defer u.Clear()
|
||||
return u.VerifySignatureJSON(obj, userID, keyName, key)
|
||||
}
|
||||
142
vendor/maunium.net/go/mautrix/crypto/olm/verification.go
generated
vendored
142
vendor/maunium.net/go/mautrix/crypto/olm/verification.go
generated
vendored
@@ -1,142 +0,0 @@
|
||||
//go:build !nosas && !goolm
|
||||
|
||||
package olm
|
||||
|
||||
// #cgo LDFLAGS: -lolm -lstdc++
|
||||
// #include <olm/olm.h>
|
||||
// #include <olm/sas.h>
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// SAS stores an Olm Short Authentication String (SAS) object.
|
||||
type SAS struct {
|
||||
int *C.OlmSAS
|
||||
mem []byte
|
||||
}
|
||||
|
||||
// NewBlankSAS initializes an empty SAS object.
|
||||
func NewBlankSAS() *SAS {
|
||||
memory := make([]byte, sasSize())
|
||||
return &SAS{
|
||||
int: C.olm_sas(unsafe.Pointer(&memory[0])),
|
||||
mem: memory,
|
||||
}
|
||||
}
|
||||
|
||||
// sasSize is the size of a SAS object in bytes.
|
||||
func sasSize() uint {
|
||||
return uint(C.olm_sas_size())
|
||||
}
|
||||
|
||||
// sasRandomLength is the number of random bytes needed to create an SAS object.
|
||||
func (sas *SAS) sasRandomLength() uint {
|
||||
return uint(C.olm_create_sas_random_length(sas.int))
|
||||
}
|
||||
|
||||
// NewSAS creates a new SAS object.
|
||||
func NewSAS() *SAS {
|
||||
sas := NewBlankSAS()
|
||||
random := make([]byte, sas.sasRandomLength()+1)
|
||||
_, err := rand.Read(random)
|
||||
if err != nil {
|
||||
panic(NotEnoughGoRandom)
|
||||
}
|
||||
r := C.olm_create_sas(
|
||||
(*C.OlmSAS)(sas.int),
|
||||
unsafe.Pointer(&random[0]),
|
||||
C.size_t(len(random)))
|
||||
if r == errorVal() {
|
||||
panic(sas.lastError())
|
||||
} else {
|
||||
return sas
|
||||
}
|
||||
}
|
||||
|
||||
// clear clears the memory used to back an SAS object.
|
||||
func (sas *SAS) clear() uint {
|
||||
return uint(C.olm_clear_sas(sas.int))
|
||||
}
|
||||
|
||||
// lastError returns the most recent error to happen to an SAS object.
|
||||
func (sas *SAS) lastError() error {
|
||||
return convertError(C.GoString(C.olm_sas_last_error(sas.int)))
|
||||
}
|
||||
|
||||
// pubkeyLength is the size of a public key in bytes.
|
||||
func (sas *SAS) pubkeyLength() uint {
|
||||
return uint(C.olm_sas_pubkey_length((*C.OlmSAS)(sas.int)))
|
||||
}
|
||||
|
||||
// GetPubkey gets the public key for the SAS object.
|
||||
func (sas *SAS) GetPubkey() []byte {
|
||||
pubkey := make([]byte, sas.pubkeyLength())
|
||||
r := C.olm_sas_get_pubkey(
|
||||
(*C.OlmSAS)(sas.int),
|
||||
unsafe.Pointer(&pubkey[0]),
|
||||
C.size_t(len(pubkey)))
|
||||
if r == errorVal() {
|
||||
panic(sas.lastError())
|
||||
}
|
||||
return pubkey
|
||||
}
|
||||
|
||||
// SetTheirKey sets the public key of the other user.
|
||||
func (sas *SAS) SetTheirKey(theirKey []byte) error {
|
||||
theirKeyCopy := make([]byte, len(theirKey))
|
||||
copy(theirKeyCopy, theirKey)
|
||||
r := C.olm_sas_set_their_key(
|
||||
(*C.OlmSAS)(sas.int),
|
||||
unsafe.Pointer(&theirKeyCopy[0]),
|
||||
C.size_t(len(theirKeyCopy)))
|
||||
if r == errorVal() {
|
||||
return sas.lastError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GenerateBytes generates bytes to use for the short authentication string.
|
||||
func (sas *SAS) GenerateBytes(info []byte, count uint) ([]byte, error) {
|
||||
infoCopy := make([]byte, len(info))
|
||||
copy(infoCopy, info)
|
||||
output := make([]byte, count)
|
||||
r := C.olm_sas_generate_bytes(
|
||||
(*C.OlmSAS)(sas.int),
|
||||
unsafe.Pointer(&infoCopy[0]),
|
||||
C.size_t(len(infoCopy)),
|
||||
unsafe.Pointer(&output[0]),
|
||||
C.size_t(len(output)))
|
||||
if r == errorVal() {
|
||||
return nil, sas.lastError()
|
||||
}
|
||||
return output, nil
|
||||
}
|
||||
|
||||
// macLength is the size of a message authentication code generated by olm_sas_calculate_mac.
|
||||
func (sas *SAS) macLength() uint {
|
||||
return uint(C.olm_sas_mac_length((*C.OlmSAS)(sas.int)))
|
||||
}
|
||||
|
||||
// CalculateMAC generates a message authentication code (MAC) based on the shared secret.
|
||||
func (sas *SAS) CalculateMAC(input []byte, info []byte) ([]byte, error) {
|
||||
inputCopy := make([]byte, len(input))
|
||||
copy(inputCopy, input)
|
||||
infoCopy := make([]byte, len(info))
|
||||
copy(infoCopy, info)
|
||||
mac := make([]byte, sas.macLength())
|
||||
r := C.olm_sas_calculate_mac(
|
||||
(*C.OlmSAS)(sas.int),
|
||||
unsafe.Pointer(&inputCopy[0]),
|
||||
C.size_t(len(inputCopy)),
|
||||
unsafe.Pointer(&infoCopy[0]),
|
||||
C.size_t(len(infoCopy)),
|
||||
unsafe.Pointer(&mac[0]),
|
||||
C.size_t(len(mac)))
|
||||
if r == errorVal() {
|
||||
return nil, sas.lastError()
|
||||
}
|
||||
return mac, nil
|
||||
}
|
||||
23
vendor/maunium.net/go/mautrix/crypto/olm/verification_goolm.go
generated
vendored
23
vendor/maunium.net/go/mautrix/crypto/olm/verification_goolm.go
generated
vendored
@@ -1,23 +0,0 @@
|
||||
//go:build !nosas && goolm
|
||||
|
||||
package olm
|
||||
|
||||
import (
|
||||
"maunium.net/go/mautrix/crypto/goolm/sas"
|
||||
)
|
||||
|
||||
// SAS stores an Olm Short Authentication String (SAS) object.
|
||||
type SAS struct {
|
||||
sas.SAS
|
||||
}
|
||||
|
||||
// NewSAS creates a new SAS object.
|
||||
func NewSAS() *SAS {
|
||||
newSAS, err := sas.New()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return &SAS{
|
||||
SAS: *newSAS,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user