Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Multiparty #176

Draft
wants to merge 252 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
252 commits
Select commit Hold shift + click to select a range
6190f76
added conversion of request type
aleksander-vedvik Jan 18, 2024
c844904
experimental commit: added sender and round to metadata
aleksander-vedvik Jan 18, 2024
7a7113b
refactor
aleksander-vedvik Jan 19, 2024
abb2cf9
bugfix
aleksander-vedvik Jan 19, 2024
bb6efa8
refactor broadcasthandler name
aleksander-vedvik Jan 19, 2024
795288d
refactor
aleksander-vedvik Jan 20, 2024
d11bb8f
refactor type safety
aleksander-vedvik Jan 24, 2024
072cf43
added possibility to return response to client
aleksander-vedvik Jan 26, 2024
db08ddf
resolved merge conflict
aleksander-vedvik Jan 26, 2024
bf23f5f
added comments
aleksander-vedvik Jan 30, 2024
7790c88
removed coupling
aleksander-vedvik Jan 31, 2024
0da29c4
init code gen
aleksander-vedvik Feb 1, 2024
d572e38
removing option
aleksander-vedvik Feb 1, 2024
81a2e2c
broadcast option automatically adds quorum function
aleksander-vedvik Feb 1, 2024
54f3d36
first try code gen
aleksander-vedvik Feb 1, 2024
0a4bc9b
fixed bug
aleksander-vedvik Feb 1, 2024
5108264
code gen for server
aleksander-vedvik Feb 1, 2024
f45c29d
refactor round to broadcastID
aleksander-vedvik Feb 1, 2024
333b929
refactor client response
aleksander-vedvik Feb 1, 2024
af309ef
refactor
aleksander-vedvik Feb 1, 2024
483d7b6
added broadcast id to msgs and modified server to server communication
aleksander-vedvik Feb 1, 2024
a08940e
almost done client gen
aleksander-vedvik Feb 1, 2024
83414c5
changed server to server communication to multicast
aleksander-vedvik Feb 1, 2024
7361645
added support for returning to client from server
aleksander-vedvik Feb 3, 2024
c23bf41
refactor
aleksander-vedvik Feb 3, 2024
be8befe
unexported methods and removed unused
aleksander-vedvik Feb 3, 2024
e038f18
refactor: unexported methods
aleksander-vedvik Feb 3, 2024
4d11f53
added comments for interal methods
aleksander-vedvik Feb 3, 2024
e0208de
fix bug: possible to broadcast several times in same method and retur…
aleksander-vedvik Feb 3, 2024
8ba421f
added support for server config
aleksander-vedvik Feb 3, 2024
a7ad9dd
ctx init
aleksander-vedvik Feb 4, 2024
1f20273
ctx and refactor
aleksander-vedvik Feb 4, 2024
53bc6d4
ctx works
aleksander-vedvik Feb 4, 2024
74615a1
refactor and cleanup
aleksander-vedvik Feb 5, 2024
5e17b49
added guard against malformed broadcast reqs
aleksander-vedvik Feb 6, 2024
2ad973b
fix(protoc): uuid will be correctly imported
aleksander-vedvik Feb 6, 2024
af0d8cd
refactor(protoc)!: broadcast option will no longer generate quorumcall
aleksander-vedvik Feb 7, 2024
f5bea8c
feat(ctx): possible to retrieve a single value from ctx
aleksander-vedvik Feb 7, 2024
1fdb1cc
fix(protoc)!: QuorumSpec will not generate methods for broadcast
aleksander-vedvik Feb 7, 2024
2c0eb45
fix(broadcast): blocking and config errors
aleksander-vedvik Feb 7, 2024
1c3964d
fix(broadcast): reconnect after send fail
aleksander-vedvik Feb 7, 2024
b54ecaa
refactor(broadcast): server timeout corresponds to mgr timeout
aleksander-vedvik Feb 9, 2024
3991284
refactor(broadcast): removed unused code and moved code to protoc
aleksander-vedvik Feb 14, 2024
d7a60d0
feat(protoc): gRPC methods will be generated on server by default
aleksander-vedvik Feb 14, 2024
e153613
refactor(protoc): changed name of serverMethods variable
aleksander-vedvik Feb 14, 2024
176baf5
fix(protoc): made broadcast calls thread safe
aleksander-vedvik Feb 15, 2024
e29e84b
feat(broadcast): made broadcast calls synchronous
aleksander-vedvik Feb 15, 2024
bf08360
inital all to all commit
aleksander-vedvik Jan 17, 2024
2c9c7c3
init protoc server
aleksander-vedvik Jan 18, 2024
671e576
added conversion of request type
aleksander-vedvik Jan 18, 2024
fe10ab2
experimental commit: added sender and round to metadata
aleksander-vedvik Jan 18, 2024
11884be
refactor
aleksander-vedvik Jan 19, 2024
a518fc5
bugfix
aleksander-vedvik Jan 19, 2024
37c9ed7
refactor broadcasthandler name
aleksander-vedvik Jan 19, 2024
26b1a04
refactor
aleksander-vedvik Jan 20, 2024
b7406b0
added possibility to return response to client
aleksander-vedvik Jan 26, 2024
a8c173f
refactor type safety
aleksander-vedvik Jan 24, 2024
e3238a8
added comments
aleksander-vedvik Jan 30, 2024
eceab79
removed coupling
aleksander-vedvik Jan 31, 2024
6aaa2a8
init code gen
aleksander-vedvik Feb 1, 2024
59c5efa
removing option
aleksander-vedvik Feb 1, 2024
3eff8a3
broadcast option automatically adds quorum function
aleksander-vedvik Feb 1, 2024
ec98c72
first try code gen
aleksander-vedvik Feb 1, 2024
4c1ce51
fixed bug
aleksander-vedvik Feb 1, 2024
a4d0e87
code gen for server
aleksander-vedvik Feb 1, 2024
ce51497
refactor round to broadcastID
aleksander-vedvik Feb 1, 2024
ca27222
refactor client response
aleksander-vedvik Feb 1, 2024
e877260
refactor
aleksander-vedvik Feb 1, 2024
e92df31
added broadcast id to msgs and modified server to server communication
aleksander-vedvik Feb 1, 2024
1cb0ff3
almost done client gen
aleksander-vedvik Feb 1, 2024
492c82f
changed server to server communication to multicast
aleksander-vedvik Feb 1, 2024
9042258
added support for returning to client from server
aleksander-vedvik Feb 3, 2024
51b6e6e
refactor
aleksander-vedvik Feb 3, 2024
67952ce
unexported methods and removed unused
aleksander-vedvik Feb 3, 2024
e8a9c33
refactor: unexported methods
aleksander-vedvik Feb 3, 2024
224ed2c
added comments for interal methods
aleksander-vedvik Feb 3, 2024
ec3484d
fix bug: possible to broadcast several times in same method and retur…
aleksander-vedvik Feb 3, 2024
1e9698c
added support for server config
aleksander-vedvik Feb 3, 2024
259b21a
ctx init
aleksander-vedvik Feb 4, 2024
6c7855f
ctx and refactor
aleksander-vedvik Feb 4, 2024
b772f2c
ctx works
aleksander-vedvik Feb 4, 2024
da85d90
refactor and cleanup
aleksander-vedvik Feb 5, 2024
62e8485
added guard against malformed broadcast reqs
aleksander-vedvik Feb 6, 2024
a17b873
fix(protoc): uuid will be correctly imported
aleksander-vedvik Feb 6, 2024
dc62c15
refactor(protoc)!: broadcast option will no longer generate quorumcall
aleksander-vedvik Feb 7, 2024
e328481
feat(ctx): possible to retrieve a single value from ctx
aleksander-vedvik Feb 7, 2024
0516925
fix(protoc)!: QuorumSpec will not generate methods for broadcast
aleksander-vedvik Feb 7, 2024
8bbd8ae
fix(broadcast): blocking and config errors
aleksander-vedvik Feb 7, 2024
28c44c8
fix(broadcast): reconnect after send fail
aleksander-vedvik Feb 7, 2024
aa4ba79
refactor(broadcast): server timeout corresponds to mgr timeout
aleksander-vedvik Feb 9, 2024
f22a126
refactor(broadcast): removed unused code and moved code to protoc
aleksander-vedvik Feb 14, 2024
6b34f78
feat(protoc): gRPC methods will be generated on server by default
aleksander-vedvik Feb 14, 2024
f23beff
refactor(protoc): changed name of serverMethods variable
aleksander-vedvik Feb 14, 2024
42e8be9
fix(protoc): made broadcast calls thread safe
aleksander-vedvik Feb 15, 2024
4497965
feat(broadcast): made broadcast calls synchronous
aleksander-vedvik Feb 15, 2024
65c3115
fix(merge): merged master into multiparty branch
aleksander-vedvik Feb 15, 2024
afe531d
Merge branch 'multiparty' of github.com:relab/gorums into multiparty
aleksander-vedvik Feb 15, 2024
a18b254
refactor(broadcast): renamed broadcast funcs
aleksander-vedvik Feb 17, 2024
cb2d109
refactor(broadcast): refactor tmp names
aleksander-vedvik Feb 19, 2024
dfed80f
refactor(broadcast): removed antipattern for broadcast calls
aleksander-vedvik Feb 21, 2024
6e0099d
feat(protoc): added possibility for client handlers
aleksander-vedvik Feb 21, 2024
21fea81
feat(broadcast): enable server side client response
aleksander-vedvik Feb 22, 2024
a90921c
fix(protoc): QF methods is not generated for broadcast
aleksander-vedvik Feb 22, 2024
962aeb3
refactor(broadcast): removed unecessary fields and methods
aleksander-vedvik Feb 26, 2024
4188a15
fix(broadcast): removed undefined fields
aleksander-vedvik Feb 26, 2024
6afcca6
refactor(broadcast): removed unused fields
aleksander-vedvik Feb 26, 2024
c3fedf7
fix(protoc): servers will send proper rpc calls to clients
aleksander-vedvik Feb 27, 2024
3703fe1
fix(protoc): wrong path for client rpcs
aleksander-vedvik Feb 27, 2024
fcd720b
refactor(protoc): better naming on broadcast options in protogen
aleksander-vedvik Feb 27, 2024
a741341
refactor(broadcast): renamed consts to camelcase
aleksander-vedvik Feb 27, 2024
5b734e0
refactor(protoc): moved some of the generated code
aleksander-vedvik Feb 28, 2024
429ea54
refactor(protoc): incorporated replySpec into qSpec
aleksander-vedvik Feb 29, 2024
7816a96
refactor(protoc): incorporated client server creation in config
aleksander-vedvik Feb 29, 2024
f9ef012
fix(broadcast): client rpc got wrong method
aleksander-vedvik Feb 29, 2024
b1f87c7
refactor(protoc): removed unecessary methods
aleksander-vedvik Feb 29, 2024
432fcd8
refactor(broadcast): removed unecessary code and improved readability
aleksander-vedvik Mar 2, 2024
15c8d66
test(broadcast): added test for broadcasthandler
aleksander-vedvik Mar 3, 2024
13f2b0d
test(broadcast): added tests for broadcast
aleksander-vedvik Mar 4, 2024
62801e5
fix(broadcast): added structured logging and removed race conditions
aleksander-vedvik Mar 5, 2024
6ed3c12
fix(broadcast): improvements, reconnection and fixes
aleksander-vedvik Mar 12, 2024
e31268b
refactor(connection): better readability of reconnection steps
aleksander-vedvik Mar 13, 2024
799dacf
fix(broadcast): fixed leaking goroutines and removed redundant code
aleksander-vedvik Mar 13, 2024
344a6d0
Merge branch 'connection' into multiparty
aleksander-vedvik Mar 13, 2024
4715dc9
refactor(broadcast): removed async option
aleksander-vedvik Mar 14, 2024
5497fff
feat(broadcast): enabled async execution
aleksander-vedvik Mar 19, 2024
1753aee
refactor(broadcast): removed comments
aleksander-vedvik Mar 19, 2024
c06dfda
refactor(broadcast): removed comments
aleksander-vedvik Mar 19, 2024
6312ec4
Merge branch 'connection' into multiparty
aleksander-vedvik Mar 21, 2024
47b7e17
fix(protoc): regenerated protofiles
aleksander-vedvik Mar 21, 2024
025c9c7
refactor(broadcast): regen protos and added id to broadcastSrv
aleksander-vedvik Mar 21, 2024
a5332c9
fix(protoc): method description was fixed causing marshalling errors
aleksander-vedvik Mar 21, 2024
1f7c2be
refactor(broadcast): removed unecessary structs and methods
aleksander-vedvik Mar 23, 2024
32b727b
test(broadcast): generated proto files
aleksander-vedvik Mar 23, 2024
3fc7189
Merge branch 'master' into multiparty
aleksander-vedvik Mar 30, 2024
34c1a4b
fix(broadcast): moved client server to mgr and fixed leaking goroutines
aleksander-vedvik Mar 31, 2024
5eb241a
test(broadcast): added test for broadcast
aleksander-vedvik Mar 31, 2024
d00256c
benchmark(broadcast): trying to find bottleneck
aleksander-vedvik Apr 3, 2024
add4d71
fix(broadcast): fixed ordering of client replies
aleksander-vedvik Apr 3, 2024
1acb426
refactor(broadcast): created a router and a storage for the broadcastSrv
aleksander-vedvik Apr 3, 2024
4e21b68
refactor(broadcast): adding a router and state
aleksander-vedvik Apr 5, 2024
38fb7a7
fix(broadcast): removed deadlock
aleksander-vedvik Apr 5, 2024
2662d74
refactor(broadcast): cleanup and removed the need for chans when sending
aleksander-vedvik Apr 7, 2024
735a0dc
fix(broadcast): removed wrong validation logic
aleksander-vedvik Apr 7, 2024
1b1a203
refactor(broadcast): reduced number of maps from 3 to 1
aleksander-vedvik Apr 7, 2024
823bf7c
fix(broadcast): not creating new conn for every response
aleksander-vedvik Apr 7, 2024
0065282
test(broadcast): cleanup and removed comments
aleksander-vedvik Apr 7, 2024
1229e4d
refactor(broadcast): cleanup and removed unecessary code
aleksander-vedvik Apr 7, 2024
fce17de
fix(broadcast): regenerated test code
aleksander-vedvik Apr 7, 2024
e62c206
refactor(broadcast): cleanup
aleksander-vedvik Apr 7, 2024
5ebc635
refactor(broadcast): regen dev files
aleksander-vedvik Apr 7, 2024
c635d33
refactor: ran go mod tidy
aleksander-vedvik Apr 7, 2024
1da07bb
test(broadcast): added more tests
aleksander-vedvik Apr 8, 2024
09c8cd0
feat(broadcast): reduced lock contention
aleksander-vedvik Apr 8, 2024
8b2f5f3
test(broadcast): added more tests
aleksander-vedvik Apr 8, 2024
b9120b7
refactor(broadcast): moved code to correct locations
aleksander-vedvik Apr 9, 2024
a33c436
feat(broadcast): running all handlers async
aleksander-vedvik Apr 9, 2024
2164d5d
refactor(broadcast): minor optimizations
aleksander-vedvik Apr 10, 2024
ac161e7
refactor(broadcast): removed comments
aleksander-vedvik Apr 10, 2024
a13c1a0
test(broadcast): added more tests
aleksander-vedvik Apr 11, 2024
c81ce1f
feat(broadcast): added alt to handle reqs
aleksander-vedvik Apr 11, 2024
c7cfca5
feat(broadcast): enabled forwarding for broadcastCalls
aleksander-vedvik Apr 11, 2024
f9ddbe9
refactor(broadcast): preparing for moving code in folder
aleksander-vedvik Apr 13, 2024
2424dcf
test(broadcast): added specific tests for broadcasthandler
aleksander-vedvik Apr 15, 2024
d185dee
feat(broadcast): prepared for snowflake ids
aleksander-vedvik Apr 17, 2024
7a7b4b9
refactor(broadcast): changed the type of broadcastID and senderType
aleksander-vedvik Apr 17, 2024
76f5ce9
feat(broadcast): created shards to reduce lock contention
aleksander-vedvik Apr 17, 2024
03ace57
fix(broadcast): fixed deadlock and changed to correct types
aleksander-vedvik Apr 20, 2024
5bbe647
fix(broadcast): added checks for logger and metrics
aleksander-vedvik Apr 20, 2024
1f2b032
refactor(broadcast): moved code into subfolder
aleksander-vedvik Apr 20, 2024
7f82078
feat(broadcast): added broadcast metrics
aleksander-vedvik Apr 20, 2024
6991ebb
fix(broadcast): fixed deadlock and added more metrics
aleksander-vedvik Apr 21, 2024
cecd574
feat(broadcast): added more metrics and possibility to create req from
aleksander-vedvik Apr 24, 2024
aa97621
fix(broadcast): fixed client server implementation
aleksander-vedvik Apr 25, 2024
32cc645
fix(broadcast): fixed deadlock
aleksander-vedvik Apr 25, 2024
1286ae6
fix(broadcast): fixed deadlocks
aleksander-vedvik Apr 27, 2024
fc3efe3
refactor(broadcast): removed redundant code
aleksander-vedvik Apr 27, 2024
35d5589
fix(broadcast): set min latency to high number
aleksander-vedvik Apr 27, 2024
42c554e
refactor(broadcast): moved interface to broadcast folder
aleksander-vedvik Apr 29, 2024
5778dee
fix(broadcast): added tests and fixed broadcast bug
aleksander-vedvik May 1, 2024
bafd2ce
test(broadcast): added tests for shard and broadcast request
aleksander-vedvik May 1, 2024
cc75006
refactor(broadcast): simplified manager interface
aleksander-vedvik May 3, 2024
9e09109
feat(broadcast): enabled cancellation
aleksander-vedvik May 8, 2024
d0d09c9
feat(broadcast): enabled cancellations
aleksander-vedvik May 8, 2024
dd23c03
fix(broadcast): fixed error when unmarshalling cancellations
aleksander-vedvik May 8, 2024
ef48e27
feat(broadcast): init client can cancel requests
aleksander-vedvik May 8, 2024
c88e88a
fix(broadcast): client sends cancellation upon timeouts
aleksander-vedvik May 9, 2024
8b7000f
fix(broadcast): more efficient code and terminating req at client
aleksander-vedvik May 9, 2024
78fd91e
feat(broadcast): ordering init
aleksander-vedvik May 9, 2024
e7ab4e1
feat(broadcast): almost done ordering
aleksander-vedvik May 9, 2024
4ff4d75
refactor(broadcast): improved organization
aleksander-vedvik May 11, 2024
56e1af7
fix(broadcast): removed race condition when cleaning up
aleksander-vedvik May 12, 2024
18aef22
test(broadcast): made test faster
aleksander-vedvik May 13, 2024
91bb774
feat(broadcast): implemented logic for ordering
aleksander-vedvik May 14, 2024
ded0579
feat(broadcast): generated methods for ordering
aleksander-vedvik May 14, 2024
189a62d
fix(broadcast): removed name conflict on method names
aleksander-vedvik May 14, 2024
1119ae4
test(broadcast): added test for ordering
aleksander-vedvik May 14, 2024
bbc0149
test(broadcast): added test for ordering
aleksander-vedvik May 14, 2024
ec817e2
refactor(broadcast): cleanup and removed code
aleksander-vedvik May 15, 2024
6d65de7
refactor(broadcast): performance optimization
aleksander-vedvik May 16, 2024
8145e5f
feat(broadcast): added fast path for broadcasting and response
aleksander-vedvik May 16, 2024
e05720f
test(broadcast): added test for optimizations
aleksander-vedvik May 16, 2024
cc35674
fix(broadcast): increased default TTL for reqs
aleksander-vedvik May 16, 2024
201bb14
doc(broadcast): added comments to enqueueFast
aleksander-vedvik May 16, 2024
ef3f0ec
fix(channel): guard against nil pointer dereference
aleksander-vedvik May 16, 2024
3cb68b8
refactor(broadcast): refactored broadcast request to processor
aleksander-vedvik May 22, 2024
6c9f14d
test(broadcast): removed unused files
aleksander-vedvik May 22, 2024
40936b4
refactor(broadcast): checks for listen addr
aleksander-vedvik May 22, 2024
d8215b3
refactor(broadcast): made shard more readable and fixed test
aleksander-vedvik May 22, 2024
9ee6295
feat(broadcast): added cleanup functionality
aleksander-vedvik May 22, 2024
d128be2
fix(broadcast): prevent backtracking of order
aleksander-vedvik May 23, 2024
f8f71f9
fix(broadcast): better error handling and option for machineID
aleksander-vedvik May 23, 2024
073cb89
fix(broadcast): all mgrs were assigned the same machineID
aleksander-vedvik May 23, 2024
0c937f7
fix(broadcast): connections wont be made when not broadcastcall
aleksander-vedvik May 23, 2024
116531c
feat(broadcast): added more fields to broadcast metadata
aleksander-vedvik May 23, 2024
0e2e7bc
test(broadcast): clients listen on free ports
aleksander-vedvik May 23, 2024
6792610
feat(broadcast): changed shard to use locks instead
aleksander-vedvik May 27, 2024
04bd405
fix(broadcast): prevents forwarding to cause errors
aleksander-vedvik May 27, 2024
9b42b2b
test(broadcast): fixed tests
aleksander-vedvik May 27, 2024
d490532
fix(broadcast): shard uses locks and fixed concurrency bugs 🥴
aleksander-vedvik May 28, 2024
c7f38ef
feat(broadcast): added logging
aleksander-vedvik May 29, 2024
eb87024
chore(broadcast): better logging
aleksander-vedvik May 29, 2024
5c68674
feat(broadcast): added logging to clientserver
aleksander-vedvik May 29, 2024
6920371
chore(broadcast): better logging and increased sendbuffer
aleksander-vedvik May 29, 2024
0c91d0b
fix(broadcast): send cancel is user option on call
aleksander-vedvik May 29, 2024
1628a4b
feat(broadcast): added retries to channel
aleksander-vedvik May 29, 2024
7c1e42f
feat: upgraded to structured logger on mgr and channel
aleksander-vedvik May 30, 2024
640472a
feat(logging): provided strong type safety to logging
aleksander-vedvik May 31, 2024
4b08ced
fix(logging): changed err to correct type
aleksander-vedvik May 31, 2024
a997e33
fix(broadcast): removed race condition on shards
aleksander-vedvik May 31, 2024
872ad58
fix(broadcast): corrected client server addr
aleksander-vedvik May 31, 2024
6e32f9d
fix(logging): set correct log level
aleksander-vedvik May 31, 2024
258a680
fix(broadcast): listen addr must be given as an option to broadcast s…
aleksander-vedvik May 31, 2024
a3564f7
doc(broadcast): documented options
aleksander-vedvik Jun 1, 2024
447ee4e
fix(broadcast): removed panic when creating server
aleksander-vedvik Jun 1, 2024
57a378f
refactor(broadcast): removed unused code
aleksander-vedvik Jun 1, 2024
4e29aea
fix(broadcast): changed to pointers to reduce mem footprint
aleksander-vedvik Jun 2, 2024
c739e30
feat(broadcast): added options for order and skipping self
aleksander-vedvik Jun 2, 2024
9c20ba7
refactor(broadcast)!: setting chans to nil to reduce mem footprint
aleksander-vedvik Jun 4, 2024
797e5ee
fix(broadcast): checks whether a client req has arrived immediately
aleksander-vedvik Jun 5, 2024
5dfc647
refactor(broadcast): removed code, fixed tests and added options
aleksander-vedvik Jun 10, 2024
6c89b73
refactor(broadcast)!: made processor more readable and client reply
aleksander-vedvik Jun 10, 2024
478f1d1
feat(broadcast): added auth to broadcast call
aleksander-vedvik Jun 11, 2024
c634b01
chore(broadcast): made the linter happy, I hope ☺
aleksander-vedvik Jun 11, 2024
8dba797
test(broadcast): fixed test
aleksander-vedvik Jun 11, 2024
656a7fc
feat(broadcast): added broadcast request auth
aleksander-vedvik Jun 11, 2024
c923d79
chore(broadcast): cleanup of unused code
aleksander-vedvik Jun 11, 2024
1f60773
doc(broadcast): added documentation for broadcast options
aleksander-vedvik Jun 11, 2024
b986030
doc(broadcast): added readme
aleksander-vedvik Jun 13, 2024
4efb50c
Update README.md
aleksander-vedvik Jun 13, 2024
7d2935f
fix(broadcast): added cancel to processor
aleksander-vedvik Jun 15, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 177 additions & 0 deletions authentication/authentication.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
package authentication

import (
"bytes"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256"
"crypto/x509"
"encoding/pem"
"fmt"
"net"
)

// Elliptic Curve Cryptography (ECC) is a key-based technique for encrypting data.
// ECC focuses on pairs of public and private keys for decryption and encryption of web traffic.
// ECC is frequently discussed in the context of the Rivest–Shamir–Adleman (RSA) cryptographic algorithm.
//
// https://pkg.go.dev/github.com/katzenpost/core/crypto/eddsa
type EllipticCurve struct {
addr net.Addr // used to identify self
pubKeyCurve elliptic.Curve // http://golang.org/pkg/crypto/elliptic/#P256
privateKey *ecdsa.PrivateKey
publicKey *ecdsa.PublicKey
}

// New EllipticCurve instance
func New(curve elliptic.Curve) *EllipticCurve {
return &EllipticCurve{
pubKeyCurve: curve,
privateKey: new(ecdsa.PrivateKey),
}
}

// GenerateKeys EllipticCurve public and private keys
func (ec *EllipticCurve) GenerateKeys() error {
privKey, err := ecdsa.GenerateKey(ec.pubKeyCurve, rand.Reader)
if err != nil {
return err
}
ec.privateKey = privKey
ec.publicKey = &privKey.PublicKey
return nil
}

// RegisterKeys EllipticCurve public and private keys
func (ec *EllipticCurve) RegisterKeys(addr net.Addr, privKey *ecdsa.PrivateKey, pubKey *ecdsa.PublicKey) {
ec.addr = addr
ec.privateKey = privKey
ec.publicKey = pubKey
}

// Returns the EllipticCurve public and private keys
func (ec *EllipticCurve) Keys() (*ecdsa.PrivateKey, *ecdsa.PublicKey) {
return ec.privateKey, ec.publicKey
}

// Returns the address
func (ec *EllipticCurve) Addr() string {
return ec.addr.String()
}

// EncodePrivate private key
func (ec *EllipticCurve) EncodePrivate() (string, error) {
encoded, err := x509.MarshalECPrivateKey(ec.privateKey)
if err != nil {
return "", err
}
pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: encoded})
key := string(pemEncoded)
return key, nil
}

// EncodePublic public key
func (ec *EllipticCurve) EncodePublic() (string, error) {
encoded, err := x509.MarshalPKIXPublicKey(ec.publicKey)
if err != nil {
return "", err
}
pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: encoded})
key := string(pemEncodedPub)
return key, nil
}

// DecodePrivate private key
func (ec *EllipticCurve) DecodePrivate(pemEncodedPriv string) (*ecdsa.PrivateKey, error) {
blockPriv, _ := pem.Decode([]byte(pemEncodedPriv))
x509EncodedPriv := blockPriv.Bytes
return x509.ParseECPrivateKey(x509EncodedPriv)
}

// DecodePublic public key
func (ec *EllipticCurve) DecodePublic(pemEncodedPub string) (*ecdsa.PublicKey, error) {
blockPub, _ := pem.Decode([]byte(pemEncodedPub))
if blockPub == nil {
return nil, fmt.Errorf("invalid publicKey")
}
x509EncodedPub := blockPub.Bytes
genericPublicKey, err := x509.ParsePKIXPublicKey(x509EncodedPub)
publicKey := genericPublicKey.(*ecdsa.PublicKey)
return publicKey, err
}

func (ec *EllipticCurve) Sign(msg []byte) ([]byte, error) {
h := sha256.Sum256(msg)
hash := h[:]
signature, err := ecdsa.SignASN1(rand.Reader, ec.privateKey, hash)
if err != nil {
return nil, err
}
return signature, nil
}

func (ec *EllipticCurve) Hash(msg []byte) []byte {
h := sha256.Sum256(msg)
hash := h[:]
return hash
}

// VerifySignature sign ecdsa style and verify signature
func (ec *EllipticCurve) VerifySignature(pemEncodedPub string, msg, signature []byte) (bool, error) {
h := sha256.Sum256(msg)
hash := h[:]
pubKey, err := ec.DecodePublic(pemEncodedPub)
if err != nil {
return false, err
}
ok := ecdsa.VerifyASN1(pubKey, hash, signature)
return ok, nil
}

// VerifySignature sign ecdsa style and verify signature
func (ec *EllipticCurve) SignAndVerify(privKey *ecdsa.PrivateKey, pubKey *ecdsa.PublicKey) ([]byte, bool, error) {
h := sha256.Sum256([]byte("test"))
hash := h[:]
signature, err := ecdsa.SignASN1(rand.Reader, privKey, hash)
if err != nil {
return nil, false, err
}
ok := ecdsa.VerifyASN1(pubKey, hash, signature)
return signature, ok, nil
}

func (ec *EllipticCurve) EncodeMsg(msg any) ([]byte, error) {
return []byte(fmt.Sprintf("%v", msg)), nil
/*var encodedMsg bytes.Buffer
gob.Register(msg)
enc := gob.NewEncoder(&encodedMsg)
err := enc.Encode(msg)
if err != nil {
return nil, err
}
return encodedMsg.Bytes(), nil*/
}

func encodeMsg(msg any) ([]byte, error) {
return []byte(fmt.Sprintf("%v", msg)), nil
}

func Verify(pemEncodedPub string, signature, digest []byte, msg any) (bool, error) {
encodedMsg, err := encodeMsg(msg)
if err != nil {
return false, err
}
ec := New(elliptic.P256())
h := sha256.Sum256(encodedMsg)
hash := h[:]
if !bytes.Equal(hash, digest) {
return false, fmt.Errorf("wrong digest")
}
pubKey, err := ec.DecodePublic(pemEncodedPub)
if err != nil {
return false, err
}
ok := ecdsa.VerifyASN1(pubKey, hash, signature)
return ok, nil
}
128 changes: 128 additions & 0 deletions authentication/authentication_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package authentication

import (
"crypto/elliptic"
"errors"
"reflect"
"testing"
)

func TestAuthentication(t *testing.T) {
ec := New(elliptic.P256())
_ = ec.GenerateKeys()
err := ec.test()
if err != nil {
t.Error(err)
}
}

func TestSignAndVerify(t *testing.T) {
ec1 := New(elliptic.P256())
err := ec1.GenerateKeys()
if err != nil {
t.Fatal(err)
}

ec2 := New(elliptic.P256())
err = ec2.GenerateKeys()
if err != nil {
t.Fatal(err)
}

message := "This is a message"

encodedMsg1, err := ec1.EncodeMsg(message)
if err != nil {
t.Error(err)
}
signature, err := ec1.Sign(encodedMsg1)
if err != nil {
t.Error(err)
}
pemEncodedPub, err := ec1.EncodePublic()
if err != nil {
t.Error(err)
}

encodedMsg2, err := ec2.EncodeMsg(message)
if err != nil {
t.Error(err)
}
ok, err := ec2.VerifySignature(pemEncodedPub, encodedMsg2, signature)
if err != nil {
t.Error(err)
}
if !ok {
t.Error("signature not ok!")
}
}

func TestVerifyWithWrongPubKey(t *testing.T) {
ec1 := New(elliptic.P256())
err := ec1.GenerateKeys()
if err != nil {
t.Fatal(err)
}

ec2 := New(elliptic.P256())
err = ec2.GenerateKeys()
if err != nil {
t.Fatal(err)
}

message := "This is a message"
encodedMsg1, err := ec1.EncodeMsg(message)
if err != nil {
t.Error(err)
}
signature, err := ec1.Sign(encodedMsg1)
if err != nil {
t.Error(err)
}

// encoding ec2 public key instead of ec1 (which was used in signing)
pemEncodedPub, err := ec2.EncodePublic()
if err != nil {
t.Error(err)
}

encodedMsg2, err := ec2.EncodeMsg(message)
if err != nil {
t.Error(err)
}
ok, err := ec2.VerifySignature(pemEncodedPub, encodedMsg2, signature)
if err != nil {
t.Error(err)
}
if ok {
t.Error("signature should not be ok!")
}
}

// Can be used in _test.go
// Test encode, decode and test it with deep equal
func (ec *EllipticCurve) test() error {
encPriv, err := ec.EncodePrivate()
if err != nil {
return err
}
encPub, err := ec.EncodePublic()
if err != nil {
return err
}
priv2, err := ec.DecodePrivate(encPriv)
if err != nil {
return err
}
pub2, err := ec.DecodePublic(encPub)
if err != nil {
return err
}
if !reflect.DeepEqual(ec.privateKey, priv2) {
return errors.New("private keys do not match")
}
if !reflect.DeepEqual(ec.publicKey, pub2) {
return errors.New("public keys do not match")
}
return nil
}
Loading
Loading