134 lines
4.5 KiB
Go
134 lines
4.5 KiB
Go
// Package bson provides functions for serialization and deserialization between
|
|
// paillier objects and BSON
|
|
package bson
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"math/big"
|
|
|
|
"github.com/keep-network/paillier"
|
|
"gopkg.in/mgo.v2/bson"
|
|
)
|
|
|
|
type PartialDecryptionZKP paillier.PartialDecryptionZKP
|
|
|
|
// Serializes PartialDecryptionZKP to BSON
|
|
func SerializePartialDecryptionZKP(pdzkp *paillier.PartialDecryptionZKP) ([]byte, error) {
|
|
return bson.Marshal(toSerializablePartialDecryptionZKP(pdzkp))
|
|
}
|
|
|
|
// Deserializes BSON to PartialDecryptionZKP
|
|
func DeserializePartialDecryptionZKP(data []byte) (*paillier.PartialDecryptionZKP, error) {
|
|
serializable := new(PartialDecryptionZKP)
|
|
if err := bson.Unmarshal(data, serializable); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return toOriginalPartialDecryptionZKP(serializable), nil
|
|
}
|
|
|
|
// Serializes PartialDecryptionZKP to JSON
|
|
func JsonSerializePartialDecryptionZKP(pdzkp *paillier.PartialDecryptionZKP) ([]byte, error) {
|
|
return json.Marshal(toSerializablePartialDecryptionZKP(pdzkp))
|
|
}
|
|
|
|
// Deserializes JSON to PartialDecryptionZKP
|
|
func JsonDeserializePartialDecryptionZKP(data []byte) (*paillier.PartialDecryptionZKP, error) {
|
|
serializable := new(PartialDecryptionZKP)
|
|
if err := json.Unmarshal(data, serializable); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return toOriginalPartialDecryptionZKP(serializable), nil
|
|
}
|
|
|
|
// Changes original PartialDecryptionZKP to serializable PartialDecryptionZKP
|
|
func toSerializablePartialDecryptionZKP(pdzkp *paillier.PartialDecryptionZKP) *PartialDecryptionZKP {
|
|
serializable := PartialDecryptionZKP(*pdzkp)
|
|
return &serializable
|
|
}
|
|
|
|
// Changes serializable PartialDecryptionZKP to original PartialDecryptionZKP
|
|
func toOriginalPartialDecryptionZKP(serializable *PartialDecryptionZKP) *paillier.PartialDecryptionZKP {
|
|
original := paillier.PartialDecryptionZKP(*serializable)
|
|
return &original
|
|
}
|
|
|
|
type dbPartialDecryptionZKP struct {
|
|
Z string `json:"z"`
|
|
E string `json:"e"`
|
|
C string `json:"c"`
|
|
V string `json:"v"`
|
|
N string `json:"n"`
|
|
Vi []string `json:"vi"`
|
|
Decryption string `json:"decryption"`
|
|
Id int `json:"id"`
|
|
TotalNumberOfDecryptionServers int `json:"total_number_of_decryption_servers"`
|
|
Threshold int `json:"threshold"`
|
|
}
|
|
|
|
func (pdzkp *PartialDecryptionZKP) GetBSON() (interface{}, error) {
|
|
db := new(dbPartialDecryptionZKP)
|
|
db.fromPartialDecryptionZKP(pdzkp)
|
|
return db, nil
|
|
}
|
|
|
|
func (pdzkp *PartialDecryptionZKP) SetBSON(raw bson.Raw) error {
|
|
db := new(dbPartialDecryptionZKP)
|
|
if err := raw.Unmarshal(db); err != nil {
|
|
return err
|
|
}
|
|
return db.toPartialDecryptionZKP(pdzkp)
|
|
}
|
|
|
|
func (dbPDZKP *dbPartialDecryptionZKP) fromPartialDecryptionZKP(pdzkp *PartialDecryptionZKP) {
|
|
dbPDZKP.Id = pdzkp.Id
|
|
dbPDZKP.TotalNumberOfDecryptionServers = pdzkp.Key.TotalNumberOfDecryptionServers
|
|
dbPDZKP.Threshold = pdzkp.Key.Threshold
|
|
dbPDZKP.Z = fmt.Sprintf("%x", pdzkp.Z)
|
|
dbPDZKP.E = fmt.Sprintf("%x", pdzkp.E)
|
|
dbPDZKP.N = fmt.Sprintf("%x", pdzkp.Key.N)
|
|
dbPDZKP.C = fmt.Sprintf("%x", pdzkp.C)
|
|
dbPDZKP.V = fmt.Sprintf("%x", pdzkp.Key.V)
|
|
dbPDZKP.Decryption = fmt.Sprintf("%x", pdzkp.Decryption)
|
|
dbPDZKP.Vi = make([]string, len(pdzkp.Key.Vi))
|
|
for i, vi := range pdzkp.Key.Vi {
|
|
dbPDZKP.Vi[i] = fmt.Sprintf("%x", vi)
|
|
}
|
|
}
|
|
|
|
func (dbPDZKP *dbPartialDecryptionZKP) toPartialDecryptionZKP(pdzkp *PartialDecryptionZKP) error {
|
|
pdzkp.Key = new(paillier.ThresholdPublicKey)
|
|
|
|
var oks = make([]bool, 6)
|
|
|
|
pdzkp.Id = dbPDZKP.Id
|
|
pdzkp.Key.TotalNumberOfDecryptionServers = dbPDZKP.TotalNumberOfDecryptionServers
|
|
pdzkp.Key.Threshold = dbPDZKP.Threshold
|
|
pdzkp.Z, oks[0] = new(big.Int).SetString(dbPDZKP.Z, 16)
|
|
pdzkp.E, oks[1] = new(big.Int).SetString(dbPDZKP.E, 16)
|
|
pdzkp.C, oks[2] = new(big.Int).SetString(dbPDZKP.C, 16)
|
|
pdzkp.Key.V, oks[3] = new(big.Int).SetString(dbPDZKP.V, 16)
|
|
pdzkp.Key.N, oks[4] = new(big.Int).SetString(dbPDZKP.N, 16)
|
|
pdzkp.Decryption, oks[5] = new(big.Int).SetString(dbPDZKP.Decryption, 16)
|
|
|
|
if !all(oks) {
|
|
fmt.Println(oks)
|
|
fmt.Println(dbPDZKP.E, "|", dbPDZKP.Z, "|", dbPDZKP.C, "|", dbPDZKP.V, "|", dbPDZKP.Decryption)
|
|
return errors.New("numbers not in hexadecimal format")
|
|
}
|
|
|
|
pdzkp.Key.Vi = make([]*big.Int, len(dbPDZKP.Vi))
|
|
var ok bool
|
|
for i, vi := range dbPDZKP.Vi {
|
|
pdzkp.Key.Vi[i], ok = new(big.Int).SetString(vi, 16)
|
|
if !ok {
|
|
return errors.New("numbers not in hexadecimal format")
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|