Skip to content
Snippets Groups Projects
identity.go 7.18 KiB
Newer Older
Jono Wenger's avatar
Jono Wenger committed
////////////////////////////////////////////////////////////////////////////////
// Copyright © 2022 xx foundation                                             //
Jono Wenger's avatar
Jono Wenger committed
//                                                                            //
// Use of this source code is governed by a license that can be found in the  //
// LICENSE file.                                                              //
Jono Wenger's avatar
Jono Wenger committed
////////////////////////////////////////////////////////////////////////////////

//go:build js && wasm

Jono Wenger's avatar
Jono Wenger committed
package wasm
Jono Wenger's avatar
Jono Wenger committed

import (
	"gitlab.com/elixxir/client/v4/bindings"
	"gitlab.com/elixxir/client/v4/xxdk"
	"gitlab.com/elixxir/wasm-utils/exception"
	"gitlab.com/elixxir/wasm-utils/utils"
Jono Wenger's avatar
Jono Wenger committed
	"syscall/js"
)

////////////////////////////////////////////////////////////////////////////////
// ReceptionIdentity                                                          //
////////////////////////////////////////////////////////////////////////////////

// StoreReceptionIdentity stores the given identity in [Cmix] storage with the
Jono Wenger's avatar
Jono Wenger committed
// given key. This is the ideal way to securely store identities, as the caller
// of this function is only required to store the given key separately rather
// than the keying material.
//
// Parameters:
//   - args[0] - Storage key (string).
//   - args[1] - JSON of the [xxdk.ReceptionIdentity] object (Uint8Array).
//   - args[2] - ID of [Cmix] object in tracker (int).
Jono Wenger's avatar
Jono Wenger committed
//
// Returns:
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if the identity cannot be stored in storage.
func StoreReceptionIdentity(_ js.Value, args []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	identity := utils.CopyBytesToGo(args[1])
Jono Wenger's avatar
Jono Wenger committed
	err := bindings.StoreReceptionIdentity(
		args[0].String(), identity, args[2].Int())

	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
		return nil
	}

	return nil
}

// LoadReceptionIdentity loads the given identity in [Cmix] storage with the
// given key.
Jono Wenger's avatar
Jono Wenger committed
//
// Parameters:
//   - args[0] - Storage key (string).
//   - args[1] - ID of [Cmix] object in tracker (int).
Jono Wenger's avatar
Jono Wenger committed
//
// Returns:
//   - JSON of the stored [xxdk.ReceptionIdentity] object (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if the identity cannot be retrieved from storage.
func LoadReceptionIdentity(_ js.Value, args []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	ri, err := bindings.LoadReceptionIdentity(args[0].String(), args[1].Int())
	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
		return nil
	}

Jono Wenger's avatar
Jono Wenger committed
	return utils.CopyBytesToJS(ri)
Jono Wenger's avatar
Jono Wenger committed
}

// MakeReceptionIdentity generates a new cryptographic identity for receiving
// messages.
//
Jono Wenger's avatar
Jono Wenger committed
// Returns a promise:
//   - Resolves to the JSON of the [xxdk.ReceptionIdentity] object (Uint8Array).
//   - Rejected with an error if creating a new identity fails.
func (c *Cmix) MakeReceptionIdentity(js.Value, []js.Value) any {
	promiseFn := func(resolve, reject func(args ...any) js.Value) {
Jono Wenger's avatar
Jono Wenger committed
		ri, err := c.api.MakeReceptionIdentity()
		if err != nil {
			reject(exception.NewTrace(err))
Jono Wenger's avatar
Jono Wenger committed
		} else {
			resolve(utils.CopyBytesToJS(ri))
		}
Jono Wenger's avatar
Jono Wenger committed
	}

Jono Wenger's avatar
Jono Wenger committed
	return utils.CreatePromise(promiseFn)
Jono Wenger's avatar
Jono Wenger committed
}

// MakeLegacyReceptionIdentity generates the legacy identity for receiving
// messages.
//
Jono Wenger's avatar
Jono Wenger committed
// Returns a promise:
//   - Resolves to the JSON of the [xxdk.ReceptionIdentity] object (Uint8Array).
//   - Rejected with an error if creating a new legacy identity fails.
func (c *Cmix) MakeLegacyReceptionIdentity(js.Value, []js.Value) any {
	promiseFn := func(resolve, reject func(args ...any) js.Value) {
Jono Wenger's avatar
Jono Wenger committed
		ri, err := c.api.MakeLegacyReceptionIdentity()
		if err != nil {
			reject(exception.NewTrace(err))
Jono Wenger's avatar
Jono Wenger committed
		} else {
			resolve(utils.CopyBytesToJS(ri))
		}
Jono Wenger's avatar
Jono Wenger committed
	}

Jono Wenger's avatar
Jono Wenger committed
	return utils.CreatePromise(promiseFn)
Jono Wenger's avatar
Jono Wenger committed
}

// GetReceptionRegistrationValidationSignature returns the signature provided by
// the xx network.
//
// Returns:
//   - Reception registration validation signature (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
func (c *Cmix) GetReceptionRegistrationValidationSignature(
	js.Value, []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	return utils.CopyBytesToJS(
		c.api.GetReceptionRegistrationValidationSignature())
Jono Wenger's avatar
Jono Wenger committed
}

////////////////////////////////////////////////////////////////////////////////
// Contact Functions                                                          //
////////////////////////////////////////////////////////////////////////////////

// GetContactFromReceptionIdentity returns the [contact.Contact] object from the
// [xxdk.ReceptionIdentity].
//
// Parameters:
//   - args[0] - JSON of [xxdk.ReceptionIdentity] (Uint8Array).
//   - Marshalled bytes of [contact.Contact] (string).
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if unmarshalling the identity fails.
func GetContactFromReceptionIdentity(_ js.Value, args []js.Value) any {
	// Note that this function does not appear in normal bindings
Jono Wenger's avatar
Jono Wenger committed
	identityJSON := utils.CopyBytesToGo(args[0])
	identity, err := xxdk.UnmarshalReceptionIdentity(identityJSON)
	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
	return utils.CopyBytesToJS(identity.GetContact().Marshal())
Jono Wenger's avatar
Jono Wenger committed
// GetIDFromContact returns the ID in the [contact.Contact] object.
//
// Parameters:
//   - args[0] - Marshalled bytes of [contact.Contact] (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//
// Returns:
//   - Marshalled bytes of [id.ID] (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if loading the ID from the contact file fails.
func GetIDFromContact(_ js.Value, args []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	cID, err := bindings.GetIDFromContact(utils.CopyBytesToGo(args[0]))
Jono Wenger's avatar
Jono Wenger committed
	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
		return nil
	}

Jono Wenger's avatar
Jono Wenger committed
	return utils.CopyBytesToJS(cID)
Jono Wenger's avatar
Jono Wenger committed
}

// GetPubkeyFromContact returns the DH public key in the [contact.Contact]
// object.
//
// Parameters:
//   - args[0] - Marshalled [contact.Contact] (string).
Jono Wenger's avatar
Jono Wenger committed
//
// Returns:
//   - Bytes of the [cyclic.Int] object (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if loading the public key from the contact file fails.
func GetPubkeyFromContact(_ js.Value, args []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	key, err := bindings.GetPubkeyFromContact([]byte(args[0].String()))
	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
		return nil
	}

Jono Wenger's avatar
Jono Wenger committed
	return utils.CopyBytesToJS(key)
Jono Wenger's avatar
Jono Wenger committed
}

////////////////////////////////////////////////////////////////////////////////
// Fact Functions                                                             //
////////////////////////////////////////////////////////////////////////////////

// SetFactsOnContact replaces the facts on the contact with the passed in facts
// pass in empty facts in order to clear the facts.
//
// Parameters:
//   - args[0] - Marshalled bytes of [contact.Contact] (Uint8Array).
//   - args[1] - JSON of [fact.FactList] (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//
// Returns:
//   - Marshalled bytes of the modified [contact.Contact] (string).
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if loading or modifying the contact fails.
func SetFactsOnContact(_ js.Value, args []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	marshaledContact := utils.CopyBytesToGo(args[0])
	factListJSON := utils.CopyBytesToGo(args[1])
Jono Wenger's avatar
Jono Wenger committed
	c, err := bindings.SetFactsOnContact(marshaledContact, factListJSON)
	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
		return nil
	}

	return c
}

// GetFactsFromContact returns the fact list in the [contact.Contact] object.
//
// Parameters:
//   - args[0] - Marshalled bytes of [contact.Contact] (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//
// Returns:
//   - JSON of [fact.FactList] (Uint8Array).
Jono Wenger's avatar
Jono Wenger committed
//   - Throws an error if loading the contact fails.
func GetFactsFromContact(_ js.Value, args []js.Value) any {
Jono Wenger's avatar
Jono Wenger committed
	fl, err := bindings.GetFactsFromContact(utils.CopyBytesToGo(args[0]))
Jono Wenger's avatar
Jono Wenger committed
	if err != nil {
		exception.ThrowTrace(err)
Jono Wenger's avatar
Jono Wenger committed
		return nil
	}

Jono Wenger's avatar
Jono Wenger committed
	return utils.CopyBytesToJS(fl)
Jono Wenger's avatar
Jono Wenger committed
}