diff --git a/bindings/autheticatedConnection.go b/bindings/autheticatedConnection.go index d62357dfef5b9703298751500c935034715ab760..758b8c741972d61dd6616d9e5691db83837df3d9 100644 --- a/bindings/autheticatedConnection.go +++ b/bindings/autheticatedConnection.go @@ -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 { diff --git a/bindings/contact.go b/bindings/contact.go index c0c9dfe9e66fcf6e5c7d996541e58647c922dbf4..db84c5c25dce6a5b679dcc097ba93cfd521b7e7c 100644 --- a/bindings/contact.go +++ b/bindings/contact.go @@ -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 { diff --git a/bindings/delivery.go b/bindings/delivery.go index 36a1f72652f0a2ef58576d4e7ff7821b2f463f9f..6b181741fb2c4ae6e68f182d190190e095e0bf5a 100644 --- a/bindings/delivery.go +++ b/bindings/delivery.go @@ -10,6 +10,8 @@ import ( "time" ) +// Example marshalled roundList object: +// [1001,1003,1006] type roundsList []int func (rl roundsList) Marshal() ([]byte, error) { diff --git a/bindings/inputJson_test.go b/bindings/inputJson_test.go new file mode 100644 index 0000000000000000000000000000000000000000..c636c9969358fc3251b44aa4a99e4009c9d470e5 --- /dev/null +++ b/bindings/inputJson_test.go @@ -0,0 +1,103 @@ +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)) +} diff --git a/bindings/restlike.go b/bindings/restlike.go index 16bfc2e3bb31b04e4bd6a768a5cf69039a45d56e..cc45b2e6113578c8cf290cdebee235eddd1f8dbd 100644 --- a/bindings/restlike.go +++ b/bindings/restlike.go @@ -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