Skip to content
Snippets Groups Projects
Commit ea8300b3 authored by Jonah Husson's avatar Jonah Husson
Browse files

Add comments expanding on json formatting to bindings

parent 69ec9e87
No related branches found
No related tags found
3 merge requests!510Release,!226WIP: Api2.0,!207WIP: Client Restructure
......@@ -20,9 +20,10 @@ func (_ *AuthenticatedConnection) IsAuthenticated() bool {
return true
}
// ConnectWithAuthentication is called by the client, ie the one establishing
// connection with the server. Once a connect.Connection has been established
// ConnectWithAuthentication is called by the client (i.e. the one establishing
// connection with the server). Once a connect.Connection has been established
// with the server and then authenticate their identity to the server.
// accepts a marshalled Identity and contact.Contact object
func (c *Client) ConnectWithAuthentication(recipientContact []byte, myIdentity []byte) (*AuthenticatedConnection, error) {
cont, err := contact.Unmarshal(recipientContact)
if err != nil {
......
......@@ -11,6 +11,26 @@ import (
"gitlab.com/xx_network/primitives/id"
)
// Example contact.Contact:
// {"ID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", // User ID (base64)
// // DH Public key
// "DhPubKey": {"Value":5897856983236448841349236507987372549159552598715284610195378196051089368134573280466076038189672561458883294904902687846973238178822842233241860785766185816826285758360932391225518001053367819933965095474045876471502521426634463472280885866375056810295845912596776232660230744646657460711296721451092117848644200333013666241751893383151321460171904648894952567100917586408052597859524654581795844734383581139432945085822846793496012536562496524464153486043864392759112173594825221043729881090076151145795436552852351725727608490246482831755459144881209180199576801001999800444715698088783576119852633280838566256264123448817581650501316117908817592489368379136557137873340250734512199521378972799693841244968719164574541767128546852594550026407820738695953499407931441091576816112217698417722574592750265071234831071430050448725796700241505489986766630847142868559624597459165280989719389157750815411870806046789780648398173408766005145891531993469827100942349,
// "Fingerprint":16801541511233098363},
// // Ownership proof for this contact
// "OwnershipProof":"Mjp8KAn7wK/VYYR2BOlG57a9Zh3HA/wHM8R6RnBdGnNCXMR5Mel9ESSYv3g/6b6RXKqTcDHDyd4aaP6g/Ju+dQ==",
// // List of associated facts
// "Facts":[{"Fact":"zezima","T":0}]}
// Identity struct
// Example marshalled Identity:
// {"ID":"emV6aW1hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD", // User ID (base64)
// // RSA Private key (PEM format)
// "RSAPrivatePem":"LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNU15dTdhYjBJOS9UL1BFUUxtd2x3ejZHV3FjMUNYemVIVXhoVEc4bmg1WWRWSXMxCmJ2THpBVjNOMDJxdXN6K2s4TVFEWjBtejMzdkswUmhPczZIY0NUSFdzTEpXRkE5WWpzWWlCRi9qTDd1bmd1ckIKL2tvK1JJSnNrWGFWaEZaazRGdERoRXhTNWY4RnR0Qmk1NmNLZmdJQlVKT3ozZi9qQllTMkxzMlJ6cWV5YXM3SApjV2RaME9TclBTT3BiYlViU1FPbS9LWnlweGZHU21yZ2oxRUZuU1dZZ2xGZTdUOTRPbHF5MG14QTV5clVXbHorCk9sK3hHbXpCNUp4WUFSMU9oMFQrQTk4RWMrTUZHNm43L1MraDdzRDgybGRnVnJmbStFTzRCdmFKeTRESGZGMWgKNnp6QnVnY25NUVFGc0dLeDFYWC9COTVMdUpPVjdyeXlDbzZGbHdJREFRQUJBb0lCQVFDaUh6OGNlcDZvQk9RTAphUzBVRitHeU5VMnlVcVRNTWtTWThoUkh1c09CMmFheXoybHZVb3RLUHBPbjZRSWRWVTJrcE4vY2dtY0lSb2x5CkhBMDRUOHJBWVNaRlVqaVlRajkzKzRFREpJYXd2Z0YyVEs1bFoyb3oxVTdreStncU82V0RMR2Z0Q0wvODVQWEIKa210aXhnUXpRV3g1RWcvemtHdm03eURBalQxeDloNytsRjJwNFlBam5kT2xTS0dmQjFZeTR1RXBQd0kwc1lWdgpKQWc0MEFxbllZUmt4emJPbmQxWGNjdEJFN2Z1VDdrWXhoeSs3WXYrUTJwVy9BYmh6NGlHOEY1MW9GMGZwV0czCmlISDhsVXZFTkp2SUZEVHZ0UEpESlFZalBRN3lUbGlGZUdrMXZUQkcyQkpQNExzVzhpbDZOeUFuRktaY1hOQ24KeHVCendiSlJBb0dCQVBUK0dGTVJGRHRHZVl6NmwzZmg3UjJ0MlhrMysvUmpvR3BDUWREWDhYNERqR1pVd1RGVQpOS2tQTTNjS29ia2RBYlBDb3FpL0tOOVBibk9QVlZ3R3JkSE9vSnNibFVHYmJGamFTUzJQMFZnNUVhTC9rT2dUCmxMMUdoVFpIUWk1VUlMM0p4M1Z3T0ZRQ3RQOU1UQlQ0UEQvcEFLbDg3VTJXN3JTY1dGV1ZGbFNkQW9HQkFPOFUKVmhHWkRpVGFKTWVtSGZIdVYrNmtzaUlsam9aUVVzeGpmTGNMZ2NjV2RmTHBqS0ZWTzJNN3NqcEJEZ0w4NmFnegorVk14ZkQzZ1l0SmNWN01aMVcwNlZ6TlNVTHh3a1dRY1hXUWdDaXc5elpyYlhCUmZRNUVjMFBlblVoWWVwVzF5CkpkTC8rSlpQeDJxSzVrQytiWU5EdmxlNWdpcjlDSGVzTlR5enVyckRBb0dCQUl0cTJnN1RaazhCSVFUUVNrZ24Kb3BkRUtzRW4wZExXcXlBdENtVTlyaWpHL2l2eHlXczMveXZDQWNpWm5VVEp0QUZISHVlbXVTeXplQ2g5QmRkegoyWkRPNUdqQVBxVHlQS3NudFlNZkY4UDczZ1NES1VSWWVFbHFDejdET0c5QzRzcitPK3FoN1B3cCtqUmFoK1ZiCkNuWllNMDlBVDQ3YStJYUJmbWRkaXpLbEFvR0JBSmo1dkRDNmJIQnNISWlhNUNJL1RZaG5YWXUzMkVCYytQM0sKMHF3VThzOCtzZTNpUHBla2Y4RjVHd3RuUU4zc2tsMk1GQWFGYldmeVFZazBpUEVTb0p1cGJzNXA1enNNRkJ1bwpncUZrVnQ0RUZhRDJweTVwM2tQbDJsZjhlZXVwWkZScGE0WmRQdVIrMjZ4eWYrNEJhdlZJeld3NFNPL1V4Q3crCnhqbTNEczRkQW9HQWREL0VOa1BjU004c1BCM3JSWW9MQ2twcUV2U0MzbVZSbjNJd3c1WFAwcDRRVndhRmR1ckMKYUhtSE1EekNrNEUvb0haQVhFdGZ2S2tRaUI4MXVYM2c1aVo4amdYUVhXUHRteTVIcVVhcWJYUTlENkxWc3B0egpKL3R4SWJLMXp5c1o2bk9IY1VoUUwyVVF6SlBBRThZNDdjYzVzTThEN3kwZjJ0QURTQUZNMmN3PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ==",
// // Salt for identity (base64)
// "Salt":"4kk02v0NIcGtlobZ/xkxqWz8uH/ams/gjvQm14QT0dI=",
// // DH Private key
// "DHKeyPrivate":"eyJWYWx1ZSI6NDU2MDgzOTEzMjA0OTIyODA5Njg2MDI3MzQ0MzM3OTA0MzAyODYwMjM2NDk2NDM5NDI4NTcxMTMwNDMzOTQwMzgyMTIyMjY4OTQzNTMyMjIyMzc1MTkzNTEzMjU4MjA4MDA0NTczMDY4MjEwNzg2NDI5NjA1MjA0OTA3MjI2ODI5OTc3NTczMDkxODY0NTY3NDExMDExNjQxNCwiRmluZ2VycHJpbnQiOjE2ODAxNTQxNTExMjMzMDk4MzYzfQ=="
// }
type Identity struct {
ID []byte
RSAPrivatePem []byte
......@@ -63,6 +83,7 @@ func (c *Client) MakeIdentity() ([]byte, error) {
return json.Marshal(&I)
}
// GetContactFromIdentity accepts a marshalled Identity object and returns a marshalled contact.Contact object
func (c *Client) GetContactFromIdentity(identity []byte) ([]byte, error) {
uID, _, _, dhKey, err := c.unmarshalIdentity(identity)
if err != nil {
......@@ -97,12 +118,12 @@ func (c *Client) unmarshalIdentity(marshaled []byte) (*id.ID, *rsa.PrivateKey, [
}
dhkey := c.api.GetStorage().GetE2EGroup().NewInt(1)
err = dhkey.UnmarshalJSON(I.DHKeyPrivate)
err = dhkey.UnmarshalJSON([]byte(I.DHKeyPrivate))
if err != nil {
return nil, nil, nil, nil, err
}
rsaPriv, err := rsa.LoadPrivateKeyFromPem(I.RSAPrivatePem)
rsaPriv, err := rsa.LoadPrivateKeyFromPem([]byte(I.RSAPrivatePem))
if err != nil {
return nil, nil, nil, nil, err
}
......@@ -110,6 +131,7 @@ func (c *Client) unmarshalIdentity(marshaled []byte) (*id.ID, *rsa.PrivateKey, [
return uID, rsaPriv, I.Salt, dhkey, nil
}
// GetIDFromContact accepts a marshalled contact.Contact object & returns a marshalled id.ID object
func GetIDFromContact(marshaled []byte) ([]byte, error) {
cnt, err := contact.Unmarshal(marshaled)
if err != nil {
......@@ -119,15 +141,17 @@ func GetIDFromContact(marshaled []byte) ([]byte, error) {
return cnt.ID.Marshal(), nil
}
// GetPubkeyFromContact accepts a marshalled contact.Contact object & returns a json marshalled large.Int DhPubKey
func GetPubkeyFromContact(marshaled []byte) ([]byte, error) {
cnt, err := contact.Unmarshal(marshaled)
if err != nil {
return nil, err
}
return cnt.ID.Marshal(), nil
return json.Marshal(cnt.DhPubKey)
}
// TODO: this seems completely pointless, as the FactList type is effectively the same thing
type Fact struct {
Fact string
Type int
......@@ -135,6 +159,7 @@ type Fact struct {
// SetFactsOnContact replaces the facts on the contact with the passed in facts
// pass in empty facts in order to clear the facts
// Accepts a marshalled contact.Contact object & a marshalled list of Fact objects
func SetFactsOnContact(marshaled []byte, facts []byte) ([]byte, error) {
cnt, err := contact.Unmarshal(marshaled)
if err != nil {
......@@ -159,6 +184,7 @@ func SetFactsOnContact(marshaled []byte, facts []byte) ([]byte, error) {
return cnt.Marshal(), nil
}
// GetFactsFromContact accepts a marshalled contact.Contact object, returning its marshalled list of Fact objects
func GetFactsFromContact(marshaled []byte) ([]byte, error) {
cnt, err := contact.Unmarshal(marshaled)
if err != nil {
......
......@@ -10,6 +10,8 @@ import (
"time"
)
// Example marshalled roundList object:
// [1001,1003,1006]
type roundsList []int
func (rl roundsList) Marshal() ([]byte, error) {
......
package bindings
import (
"encoding/json"
"gitlab.com/elixxir/client/restlike"
"gitlab.com/elixxir/crypto/cmix"
"gitlab.com/elixxir/crypto/contact"
"gitlab.com/elixxir/crypto/cyclic"
dh "gitlab.com/elixxir/crypto/diffieHellman"
"gitlab.com/elixxir/primitives/fact"
"gitlab.com/xx_network/crypto/csprng"
"gitlab.com/xx_network/crypto/large"
"gitlab.com/xx_network/crypto/signature/rsa"
"gitlab.com/xx_network/primitives/id"
"testing"
)
func getGroup() *cyclic.Group {
return cyclic.NewGroup(
large.NewIntFromString("E2EE983D031DC1DB6F1A7A67DF0E9A8E5561DB8E8D4941"+
"3394C049B7A8ACCEDC298708F121951D9CF920EC5D146727AA4AE535B0922C688"+
"B55B3DD2AEDF6C01C94764DAB937935AA83BE36E67760713AB44A6337C20E7861"+
"575E745D31F8B9E9AD8412118C62A3E2E29DF46B0864D0C951C394A5CBBDC6ADC"+
"718DD2A3E041023DBB5AB23EBB4742DE9C1687B5B34FA48C3521632C4A530E8FF"+
"B1BC51DADDF453B0B2717C2BC6669ED76B4BDD5C9FF558E88F26E5785302BEDBC"+
"A23EAC5ACE92096EE8A60642FB61E8F3D24990B8CB12EE448EEF78E184C7242DD"+
"161C7738F32BF29A841698978825B4111B4BC3E1E198455095958333D776D8B2B"+
"EEED3A1A1A221A6E37E664A64B83981C46FFDDC1A45E3D5211AAF8BFBC072768C"+
"4F50D7D7803D2D4F278DE8014A47323631D7E064DE81C0C6BFA43EF0E6998860F"+
"1390B5D3FEACAF1696015CB79C3F9C2D93D961120CD0E5F12CBB687EAB045241F"+
"96789C38E89D796138E6319BE62E35D87B1048CA28BE389B575E994DCA7554715"+
"84A09EC723742DC35873847AEF49F66E43873", 16),
large.NewIntFromString("2", 16))
}
func TestInputMarshalling(t *testing.T) {
rng := csprng.NewSystemRNG()
uid := id.NewIdFromString("zezima", id.User, t)
salt := cmix.NewSalt(rng, 32)
pk, _ := rsa.GenerateKey(rng, 2048)
grp := getGroup()
dhpk := dh.GeneratePrivateKey(64, grp, rng)
dhpkJson, _ := dhpk.MarshalJSON()
dhpub := dh.GeneratePublicKey(dhpk, grp)
op := make([]byte, 64)
_, _ = rng.Read(op)
identity := Identity{
ID: uid.Marshal(),
RSAPrivatePem: rsa.CreatePrivateKeyPem(pk),
Salt: salt,
DHKeyPrivate: dhpkJson,
}
c := contact.Contact{
ID: uid,
DhPubKey: dhpub,
OwnershipProof: op,
Facts: fact.FactList{
{
Fact: "zezima",
T: fact.Username,
},
},
}
im, _ := json.Marshal(identity)
cm, _ := json.Marshal(c)
rl := roundsList{
1001, 1003, 1006,
}
rm, _ := json.Marshal(rl)
restlikeMessage := RestlikeMessage{
Version: 1,
Headers: []byte("contents:application/json"),
Content: []byte("This is a restlike message"),
Method: int(restlike.Post),
URI: "xx://CmixRestlike/rest",
}
rlm, _ := json.Marshal(restlikeMessage)
fl := []Fact{
{
Fact: "Zezima",
Type: 0,
},
{
Fact: "Zezima@osrs.org",
Type: 2,
},
}
flm, _ := json.Marshal(fl)
t.Log("Marshalled Identity object")
t.Log(string(im))
t.Log("Marshalled contact.Contact object")
t.Log(string(cm))
t.Log("Marshalled roundsList object")
t.Log(string(rm))
t.Log("Marshalled RestlikeMessage object")
t.Log(string(rlm))
t.Log("Marshalled []Fact")
t.Log(string(flm))
}
......@@ -14,6 +14,13 @@ import (
)
// RestlikeMessage is the bindings representation of a restlike.Message
// Example marshalled RestlikeMessage:
//{"Version":1,
// "Headers":"Y29udGVudHM6YXBwbGljYXRpb24vanNvbg==",
// "Content":"VGhpcyBpcyBhIHJlc3RsaWtlIG1lc3NhZ2U=",
// "Method":2,
// "URI":"xx://CmixRestlike/rest",
// "Error":""}
type RestlikeMessage struct {
Version uint32
Headers []byte
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment