Files
sonr/pkg/crypto/mpc/share.go
T
Prad NukalaandGitHub 89989fa102 feature/1114 implement account interface (#1167)
- **refactor: move session-related code to middleware package**
- **refactor: update PKL build process and adjust related
configurations**
- **feat: integrate base.cosmos.v1 Genesis module**
- **refactor: pass session context to modal rendering functions**
- **refactor: move nebula package to app directory and update templ
version**
- **refactor: Move home section video view to dedicated directory**
- **refactor: remove unused views file**
- **refactor: move styles and UI components to global scope**
- **refactor: Rename images.go to cdn.go**
- **feat: Add Empty State Illustrations**
- **refactor: Consolidate Vault Index Logic**
- **fix: References to App.wasm and remove Vault Directory embedded CDN
files**
- **refactor: Move CDN types to Models**
- **fix: Correct line numbers in templ error messages for
arch_templ.go**
- **refactor: use common types for peer roles**
- **refactor: move common types and ORM to a shared package**
- **fix: Config import dwn**
- **refactor: move nebula directory to app**
- **feat: Rebuild nebula**
- **fix: correct file paths in panels templates**
- **feat: Remove duplicate types**
- **refactor: Move dwn to pkg/core**
- **refactor: Binary Structure**
- **feat: Introduce Crypto Pkg**
- **fix: Broken Process Start**
- **feat: Update pkg/* structure**
- **feat: Refactor PKL Structure**
- **build: update pkl build process**
- **chore: Remove Empty Files**
- **refactor: remove unused macaroon package**
- **feat: Add WebAwesome Components**
- **refactor: consolidate build and generation tasks into a single
taskfile, remove redundant makefile targets**
- **refactor: refactor server and move components to pkg/core/dwn**
- **build: update go modules**
- **refactor: move gateway logic into dedicated hway command**
- **feat: Add KSS (Krawczyk-Song-Song) MPC cryptography module**
- **feat: Implement MPC-based JWT signing and UCAN token generation**
- **feat: add support for MPC-based JWT signing**
- **feat: Implement MPC-based UCAN capabilities for smart accounts**
- **feat: add address field to keyshareSource**
- **feat: Add comprehensive MPC test suite for keyshares, UCAN tokens,
and token attenuations**
- **refactor: improve MPC keyshare management and signing process**
- **feat: enhance MPC capability hierarchy documentation**
- **refactor: rename GenerateKeyshares function to NewKeyshareSource for
clarity**
- **refactor: remove unused Ethereum address computation**
- **feat: Add HasHandle and IsAuthenticated methods to HTTPContext**
- **refactor: Add context.Context support to session HTTPContext**
- **refactor: Resolve context interface conflicts in HTTPContext**
- **feat: Add session ID context key and helper functions**
- **feat: Update WebApp Page Rendering**
- **refactor: Simplify context management by using single HTTPContext
key**
- **refactor: Simplify HTTPContext creation and context management in
session middleware**
- **refactor: refactor session middleware to use a single data
structure**
- **refactor: Simplify HTTPContext implementation and session data
handling**
- **refactor: Improve session context handling and prevent nil pointer
errors**
- **refactor: Improve session context handling with nil safety and type
support**
- **refactor: improve session data injection**
- **feat: add full-screen modal component and update registration flow**
- **chore: add .air.toml to .gitignore**
- **feat: add Air to devbox and update dependencies**
2024-11-23 01:28:58 -05:00

199 lines
4.4 KiB
Go

package mpc
import (
"crypto/ecdsa"
"encoding/json"
"errors"
"github.com/onsonr/sonr/pkg/crypto/core/curves"
"github.com/onsonr/sonr/pkg/crypto/core/protocol"
"github.com/onsonr/sonr/pkg/crypto/tecdsa/dklsv1"
"golang.org/x/crypto/sha3"
)
var ErrInvalidKeyshareRole = errors.New("invalid keyshare role")
type Role int
const (
RoleUnknown Role = iota
RoleUser
RoleValidator
)
func (r Role) IsUser() bool {
return r == RoleUser
}
func (r Role) IsValidator() bool {
return r == RoleValidator
}
// Message is the protocol.Message that is used for MPC
type Message *protocol.Message
type PublicKey *ecdsa.PublicKey
type Signature *curves.EcdsaSignature
// RefreshFunc is the type for the refresh function
type RefreshFunc interface {
protocol.Iterator
}
// SignFunc is the type for the sign function
type SignFunc interface {
protocol.Iterator
}
type ValKeyshare struct {
Message Message `json:"message"`
Role int `json:"role"` // 1 for validator, 2 for user
PublicKey []byte `json:"public-key"`
}
func NewValKeyshare(msg Message) (*ValKeyshare, error) {
valShare, err := dklsv1.DecodeAliceDkgResult(msg)
if err != nil {
return nil, err
}
return &ValKeyshare{
Message: msg,
Role: 1,
PublicKey: valShare.PublicKey.ToAffineUncompressed(),
}, nil
}
func (v ValKeyshare) GetPayloads() map[string][]byte {
return v.Message.Payloads
}
func (v ValKeyshare) GetMetadata() map[string]string {
return v.Message.Metadata
}
func (v ValKeyshare) GetPublicKey() []byte {
return v.PublicKey
}
func (v ValKeyshare) GetProtocol() string {
return v.Message.Protocol
}
func (v ValKeyshare) GetRole() int32 {
return int32(v.Role)
}
func (v ValKeyshare) GetVersion() uint32 {
return uint32(v.Message.Version)
}
func (k ValKeyshare) ECDSAPublicKey() (*ecdsa.PublicKey, error) {
return ComputeEcdsaPublicKey(k.PublicKey)
}
func (k ValKeyshare) ExtractMessage() *protocol.Message {
return &protocol.Message{
Payloads: k.GetPayloads(),
Metadata: k.GetMetadata(),
Protocol: k.GetProtocol(),
Version: uint(k.GetVersion()),
}
}
func (k ValKeyshare) RefreshFunc() (RefreshFunc, error) {
curve := curves.K256()
return dklsv1.NewAliceRefresh(curve, k.ExtractMessage(), protocol.Version1)
}
func (k ValKeyshare) SignFunc(msg []byte) (SignFunc, error) {
curve := curves.K256()
return dklsv1.NewAliceSign(curve, sha3.New256(), msg, k.ExtractMessage(), protocol.Version1)
}
func (v ValKeyshare) Marshal() (string, error) {
jsonBytes, err := json.Marshal(v)
return string(jsonBytes), err
}
func (v ValKeyshare) Unmarshal(data string) error {
return json.Unmarshal([]byte(data), &v)
}
type UserKeyshare struct {
Message Message `json:"message"` // BobOutput
Role int `json:"role"` // 2 for user, 1 for validator
PublicKey []byte `json:"public-key"`
}
func NewUserKeyshare(msg Message) (*UserKeyshare, error) {
out, err := dklsv1.DecodeBobDkgResult(msg)
if err != nil {
return nil, err
}
return &UserKeyshare{
Message: msg,
Role: 2,
PublicKey: out.PublicKey.ToAffineUncompressed(),
}, nil
}
func (u UserKeyshare) GetPayloads() map[string][]byte {
return u.Message.Payloads
}
func (u UserKeyshare) GetMetadata() map[string]string {
return u.Message.Metadata
}
func (u UserKeyshare) GetPublicKey() []byte {
return u.PublicKey
}
func (u UserKeyshare) GetProtocol() string {
return u.Message.Protocol
}
func (u UserKeyshare) GetRole() int32 {
return int32(u.Role)
}
func (u UserKeyshare) GetVersion() uint32 {
return uint32(u.Message.Version)
}
func (k UserKeyshare) ECDSAPublicKey() (*ecdsa.PublicKey, error) {
return ComputeEcdsaPublicKey(k.PublicKey)
}
func (k UserKeyshare) ExtractMessage() *protocol.Message {
return &protocol.Message{
Payloads: k.GetPayloads(),
Metadata: k.GetMetadata(),
Protocol: k.GetProtocol(),
Version: uint(k.GetVersion()),
}
}
func (k UserKeyshare) RefreshFunc() (RefreshFunc, error) {
curve := curves.K256()
return dklsv1.NewBobRefresh(curve, k.ExtractMessage(), protocol.Version1)
}
func (k UserKeyshare) SignFunc(msg []byte) (SignFunc, error) {
curve := curves.K256()
return dklsv1.NewBobSign(curve, sha3.New256(), msg, k.ExtractMessage(), protocol.Version1)
}
func (u UserKeyshare) Marshal() (string, error) {
jsonBytes, err := json.Marshal(u)
if err != nil {
return "", err
}
return string(jsonBytes), nil
}
func (u UserKeyshare) Unmarshal(data string) error {
return json.Unmarshal([]byte(data), &u)
}