diff --git a/dfssc/sign/server.go b/dfssc/sign/server.go index 4c5ba6ec3c69dda1cbe5987b3a3b1f0d50174881..92c4c427b979b129c06f63f8b6c79539d94906ba 100644 --- a/dfssc/sign/server.go +++ b/dfssc/sign/server.go @@ -1,13 +1,10 @@ package sign import ( - "fmt" - "dfss" cAPI "dfss/dfssc/api" pAPI "dfss/dfssp/api" "dfss/net" - "golang.org/x/net/context" "google.golang.org/grpc" ) @@ -34,7 +31,6 @@ func (s *clientServer) TreatSignature(ctx context.Context, in *cAPI.Signature) ( // // Handle incoming Discover messages func (s *clientServer) Discover(ctx context.Context, in *cAPI.Hello) (*cAPI.Hello, error) { - fmt.Println("Recieved:", in.Version) return &cAPI.Hello{Version: dfss.Version}, nil } diff --git a/dfssc/sign/starter.go b/dfssc/sign/starter.go index 8f33c128a9ab91b77800be0d23a563733b8d07e7..b428ba3a67acd3e0d52441efc5ac98c29da7e78e 100644 --- a/dfssc/sign/starter.go +++ b/dfssc/sign/starter.go @@ -5,6 +5,7 @@ import ( "crypto/x509" "errors" "fmt" + "log" "strconv" "time" @@ -28,6 +29,8 @@ type SignatureManager struct { cServer *grpc.Server cert, ca *x509.Certificate key *rsa.PrivateKey + sequence []uint32 + uuid string } // NewSignatureManager populates a SignatureManager and connects to the platform. @@ -44,7 +47,7 @@ func NewSignatureManager(fileCA, fileCert, fileKey, addrPort, passphrase string, } m.cServer = m.GetServer() - go func() { _ = net.Listen("0.0.0.0:"+strconv.Itoa(port), m.cServer) }() + go func() { log.Fatalln(net.Listen("0.0.0.0:"+strconv.Itoa(port), m.cServer)) }() conn, err := net.Connect(m.auth.AddrPort, m.cert, m.key, m.ca) if err != nil { @@ -55,7 +58,9 @@ func NewSignatureManager(fileCA, fileCert, fileKey, addrPort, passphrase string, m.peers = make(map[string]*cAPI.ClientClient) for _, u := range c.Signers { - m.peers[u.Email] = nil + if u.Email != m.cert.Subject.CommonName { + m.peers[u.Email] = nil + } } return m, nil @@ -82,7 +87,7 @@ func (m *SignatureManager) ConnectToPeers() error { } ready, err := m.addPeer(userConnected.User) if err != nil { - return err + continue // Unable to connect to this user, ignore it for the moment } if ready { break @@ -98,9 +103,12 @@ func (m *SignatureManager) addPeer(user *pAPI.User) (ready bool, err error) { err = errors.New("unexpected user format") return } + if _, ok := m.peers[user.Email]; !ok { + return // Ignore if unknown + } addrPort := user.Ip + ":" + strconv.Itoa(int(user.Port)) - fmt.Println("Trying to connect with", user.Email, "/", addrPort) + fmt.Println("- Trying to connect with", user.Email, "/", addrPort) conn, err := net.Connect(addrPort, m.cert, m.key, m.ca) if err != nil { @@ -110,12 +118,17 @@ func (m *SignatureManager) addPeer(user *pAPI.User) (ready bool, err error) { // Sending Hello message client := cAPI.NewClientClient(conn) m.peers[user.Email] = &client - msg, err := client.Discover(context.Background(), &cAPI.Hello{Version: dfss.Version}) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + msg, err := client.Discover(ctx, &cAPI.Hello{Version: dfss.Version}) if err != nil { return false, err } + // Printing answer: application version - fmt.Println("Recieved:", msg.Version) + // TODO check certificate + fmt.Println(" Successfully connected!", "[", msg.Version, "]") // Check if we have any other peer to connect to for _, u := range m.peers { @@ -129,7 +142,7 @@ func (m *SignatureManager) addPeer(user *pAPI.User) (ready bool, err error) { // SendReadySign sends the READY signal to the platform, and wait (potentially a long time) for START signal. func (m *SignatureManager) SendReadySign() (signatureUUID string, err error) { - ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Minute) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute) defer cancel() launch, err := m.platform.ReadySign(ctx, &pAPI.ReadySignRequest{ ContractUuid: m.contract.UUID, @@ -144,6 +157,21 @@ func (m *SignatureManager) SendReadySign() (signatureUUID string, err error) { return } - signatureUUID = launch.SignatureUuid + // Check signers from platform data + if len(m.contract.Signers) != len(launch.KeyHash) { + err = errors.New("Corrupted DFSS file: bad number of signers, unable to sign safely") + return + } + + for i, s := range m.contract.Signers { + if s.Hash != fmt.Sprintf("%x", launch.KeyHash[i]) { + err = errors.New("Corrupted DFSS file: signer " + s.Email + " has an invalid hash, unable to sign safely") + return + } + } + + m.sequence = launch.Sequence + m.uuid = launch.SignatureUuid + signatureUUID = m.uuid return } diff --git a/dfssp/api/platform.pb.go b/dfssp/api/platform.pb.go index b9e4552f946425e81c44ea33a5ea5cf424ee2acc..eed627b0e57b3145525e986fbd06033f31f89981 100644 --- a/dfssp/api/platform.pb.go +++ b/dfssp/api/platform.pb.go @@ -211,6 +211,7 @@ type LaunchSignature struct { ErrorCode *ErrorCode `protobuf:"bytes,1,opt,name=errorCode" json:"errorCode,omitempty"` SignatureUuid string `protobuf:"bytes,2,opt,name=signatureUuid" json:"signatureUuid,omitempty"` KeyHash [][]byte `protobuf:"bytes,3,rep,name=keyHash,proto3" json:"keyHash,omitempty"` + Sequence []uint32 `protobuf:"varint,4,rep,name=sequence" json:"sequence,omitempty"` } func (m *LaunchSignature) Reset() { *m = LaunchSignature{} } @@ -471,44 +472,45 @@ var _Platform_serviceDesc = grpc.ServiceDesc{ } var fileDescriptor0 = []byte{ - // 621 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x54, 0x5d, 0x6f, 0xd3, 0x30, - 0x14, 0x6d, 0xda, 0xec, 0xa3, 0x77, 0x6b, 0x17, 0xb9, 0x03, 0x95, 0x4a, 0x43, 0x93, 0x85, 0x04, - 0x42, 0xa8, 0x9d, 0x8a, 0x84, 0x04, 0x6f, 0x59, 0xa9, 0xb6, 0x21, 0x54, 0x4d, 0xee, 0x0a, 0x12, - 0x6f, 0x21, 0xf1, 0xd6, 0x68, 0xcd, 0x07, 0xb6, 0x23, 0xb4, 0x27, 0xf8, 0x25, 0xfc, 0x2d, 0x7e, - 0x0e, 0xd8, 0x4e, 0x9c, 0x26, 0xa3, 0x42, 0xda, 0x1e, 0x32, 0xdf, 0xeb, 0xeb, 0x73, 0x7c, 0xce, - 0xbd, 0x2e, 0x1c, 0x05, 0xd7, 0x9c, 0x8f, 0xd4, 0x27, 0x1d, 0x79, 0x69, 0x38, 0x4a, 0x57, 0x9e, - 0xb8, 0x4e, 0x58, 0x34, 0x4c, 0x59, 0x22, 0x12, 0xd4, 0x92, 0x39, 0xec, 0xc2, 0x01, 0xa1, 0x37, - 0x21, 0x17, 0x94, 0x11, 0xfa, 0x2d, 0xa3, 0x5c, 0xa0, 0x43, 0xd8, 0xa2, 0x91, 0x17, 0xae, 0xfa, - 0xd6, 0xb1, 0xf5, 0xa2, 0x4d, 0xf2, 0x00, 0xf5, 0x61, 0x87, 0xe5, 0x05, 0xfd, 0xa6, 0xce, 0x9b, - 0x10, 0xff, 0xb2, 0xa0, 0x3d, 0x65, 0x2c, 0x61, 0x93, 0x24, 0xa0, 0xe8, 0x39, 0xd8, 0xbe, 0xfc, - 0xaf, 0x0f, 0x77, 0xc7, 0xbd, 0xa1, 0x24, 0x19, 0x96, 0xbb, 0x43, 0xf5, 0x21, 0xba, 0x40, 0x01, - 0x46, 0x94, 0x73, 0xef, 0x86, 0x1a, 0xc0, 0x22, 0xc4, 0x33, 0xb0, 0x35, 0xd4, 0x1e, 0xec, 0xcc, - 0x17, 0x93, 0xc9, 0x74, 0x3e, 0x77, 0x1a, 0x08, 0x60, 0xfb, 0x62, 0xf6, 0xc9, 0x25, 0x67, 0x8e, - 0xa5, 0x36, 0x4e, 0xdd, 0xf7, 0xee, 0xe2, 0xea, 0xdc, 0x69, 0xaa, 0xe0, 0xb3, 0x4b, 0x66, 0x17, - 0xb3, 0x33, 0xa7, 0x85, 0x7a, 0xaa, 0xea, 0x6a, 0x4a, 0x88, 0xf3, 0xc7, 0xfc, 0x59, 0xf8, 0x2d, - 0xec, 0xb9, 0x99, 0x58, 0xfe, 0x5f, 0x9f, 0xcc, 0x8a, 0xe4, 0x96, 0xc6, 0xc5, 0x65, 0xf2, 0x00, - 0x9f, 0x40, 0xd7, 0xd8, 0x43, 0x83, 0x05, 0xa7, 0x0c, 0x3d, 0x05, 0xf0, 0x57, 0x21, 0x8d, 0xc5, - 0x84, 0x32, 0x51, 0x40, 0x54, 0x32, 0x78, 0x07, 0xb6, 0xa6, 0x51, 0x2a, 0xee, 0xf0, 0x77, 0xe8, - 0x5d, 0x26, 0x5c, 0x4c, 0x92, 0x58, 0x30, 0xcf, 0x17, 0x86, 0x1d, 0x81, 0xbd, 0xf4, 0xf8, 0x52, - 0x9f, 0xdc, 0x27, 0x7a, 0x8d, 0x06, 0xb0, 0x7b, 0x1d, 0xae, 0x68, 0xec, 0x45, 0xc6, 0x8b, 0x32, - 0x46, 0x8f, 0x61, 0x9b, 0x87, 0x37, 0x31, 0x65, 0xfd, 0xd6, 0x71, 0x4b, 0xee, 0x14, 0x91, 0xb2, - 0xcf, 0x4f, 0xa2, 0x48, 0xd2, 0xf6, 0xed, 0xdc, 0xbe, 0x22, 0x94, 0xf6, 0x1d, 0x7e, 0x48, 0xc2, - 0x78, 0x2e, 0xeb, 0x3c, 0x91, 0x31, 0x6a, 0x98, 0x31, 0xec, 0xfb, 0xc5, 0x65, 0x16, 0x59, 0x18, - 0x14, 0x77, 0xaf, 0xe5, 0xd4, 0xed, 0xd2, 0x84, 0xe5, 0x2d, 0xee, 0x10, 0xbd, 0xc6, 0x3f, 0x2d, - 0xe8, 0x28, 0xe9, 0x52, 0x49, 0x4c, 0x7d, 0x41, 0x03, 0xf4, 0x0a, 0xda, 0xd4, 0xb4, 0x54, 0xc3, - 0xec, 0x8d, 0xbb, 0xf5, 0x46, 0x93, 0x75, 0xc1, 0x3f, 0xbc, 0xcd, 0x0d, 0xbc, 0x47, 0x60, 0x67, - 0x5c, 0x6b, 0x54, 0x60, 0x6d, 0x0d, 0xa6, 0x38, 0x89, 0x4e, 0xe3, 0x2f, 0x60, 0x6b, 0xf3, 0xa5, - 0xe8, 0x5b, 0x7a, 0x77, 0xbe, 0xf6, 0xcf, 0x84, 0xeb, 0xa6, 0x36, 0xab, 0x4d, 0xed, 0x42, 0x33, - 0x4c, 0x35, 0x68, 0x9b, 0xc8, 0x55, 0x29, 0xcf, 0xae, 0xc8, 0x7b, 0x03, 0x0e, 0xa1, 0x5e, 0x70, - 0xa7, 0xfc, 0x7a, 0x80, 0x55, 0xf8, 0x07, 0x1c, 0x7c, 0xf4, 0xb2, 0xd8, 0x5f, 0x96, 0x46, 0x3f, - 0xd0, 0x97, 0x67, 0xd0, 0xe1, 0xe6, 0x68, 0xc5, 0x98, 0x7a, 0xb2, 0x2a, 0x59, 0x0d, 0xc0, 0x5a, - 0xf2, 0xf8, 0x77, 0x13, 0x76, 0x2f, 0x8b, 0x27, 0x8d, 0xc6, 0xb0, 0x6b, 0x06, 0x15, 0x1d, 0x6a, - 0xce, 0x7b, 0xcf, 0x7a, 0x70, 0xef, 0x26, 0xb8, 0x81, 0x46, 0x60, 0xab, 0x77, 0x81, 0x1c, 0xbd, - 0x53, 0x79, 0x22, 0x83, 0x5e, 0x0d, 0x21, 0x9f, 0x7c, 0x79, 0xe0, 0x25, 0xc0, 0x22, 0x66, 0x86, - 0x06, 0x72, 0x40, 0x35, 0xec, 0x1b, 0xc0, 0xdf, 0xc1, 0x7e, 0x75, 0xfc, 0x51, 0x5f, 0x57, 0x6c, - 0x78, 0x11, 0x1b, 0xce, 0x9e, 0x42, 0xa7, 0x36, 0xc1, 0xe8, 0x89, 0x2e, 0xd9, 0x34, 0xd5, 0x03, - 0x54, 0xce, 0x4a, 0x39, 0x9f, 0xb8, 0x71, 0x62, 0x49, 0xfe, 0x76, 0xd9, 0x56, 0xf4, 0xa8, 0xd0, - 0x53, 0x6f, 0xf3, 0x20, 0x37, 0xea, 0x5e, 0x17, 0x71, 0xe3, 0xeb, 0xb6, 0xfe, 0x81, 0x7c, 0xfd, - 0x37, 0x00, 0x00, 0xff, 0xff, 0xe1, 0xe6, 0x41, 0xec, 0x41, 0x05, 0x00, 0x00, + // 636 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x94, 0x54, 0x6d, 0x6b, 0x13, 0x41, + 0x10, 0xce, 0x25, 0xd7, 0x97, 0x4c, 0x9b, 0xf4, 0xd8, 0x54, 0x89, 0x81, 0x4a, 0x59, 0x04, 0x45, + 0x24, 0x29, 0x11, 0x04, 0xfd, 0x76, 0x8d, 0xa1, 0xad, 0x48, 0x28, 0x9b, 0x46, 0xc1, 0x6f, 0xe7, + 0xdd, 0xb6, 0x39, 0x9a, 0x7b, 0x71, 0x77, 0x0f, 0xe9, 0x37, 0xff, 0x87, 0xe0, 0xdf, 0xf2, 0xe7, + 0xe8, 0xee, 0xde, 0xed, 0xf5, 0x2e, 0x06, 0xa1, 0xfd, 0x70, 0xdd, 0x99, 0x9d, 0x7d, 0x66, 0x9e, + 0x67, 0x66, 0x02, 0x47, 0xc1, 0x35, 0xe7, 0x23, 0xf5, 0x49, 0x47, 0x5e, 0x1a, 0x8e, 0xd2, 0x95, + 0x27, 0xae, 0x13, 0x16, 0x0d, 0x53, 0x96, 0x88, 0x04, 0xb5, 0xa4, 0x0f, 0xbb, 0x70, 0x40, 0xe8, + 0x4d, 0xc8, 0x05, 0x65, 0x84, 0x7e, 0xcb, 0x28, 0x17, 0xe8, 0x10, 0xb6, 0x68, 0xe4, 0x85, 0xab, + 0xbe, 0x75, 0x6c, 0xbd, 0x68, 0x93, 0xdc, 0x40, 0x7d, 0xd8, 0x61, 0x79, 0x40, 0xbf, 0xa9, 0xfd, + 0xc6, 0xc4, 0xbf, 0x2c, 0x68, 0x4f, 0x19, 0x4b, 0xd8, 0x24, 0x09, 0x28, 0x7a, 0x0e, 0xb6, 0x2f, + 0xff, 0xeb, 0xc7, 0xdd, 0x71, 0x6f, 0x28, 0x93, 0x0c, 0xcb, 0xdb, 0xa1, 0xfa, 0x10, 0x1d, 0xa0, + 0x00, 0x23, 0xca, 0xb9, 0x77, 0x43, 0x0d, 0x60, 0x61, 0xe2, 0x19, 0xd8, 0x1a, 0x6a, 0x0f, 0x76, + 0xe6, 0x8b, 0xc9, 0x64, 0x3a, 0x9f, 0x3b, 0x0d, 0x04, 0xb0, 0x7d, 0x31, 0xfb, 0xe4, 0x92, 0x33, + 0xc7, 0x52, 0x17, 0xa7, 0xee, 0x7b, 0x77, 0x71, 0x75, 0xee, 0x34, 0x95, 0xf1, 0xd9, 0x25, 0xb3, + 0x8b, 0xd9, 0x99, 0xd3, 0x42, 0x3d, 0x15, 0x75, 0x35, 0x25, 0xc4, 0xf9, 0x63, 0xfe, 0x2c, 0xfc, + 0x16, 0xf6, 0xdc, 0x4c, 0x2c, 0xff, 0xcf, 0x4f, 0x7a, 0x45, 0x72, 0x4b, 0xe3, 0xa2, 0x98, 0xdc, + 0xc0, 0x27, 0xd0, 0x35, 0xf2, 0xd0, 0x60, 0xc1, 0x29, 0x43, 0x4f, 0x01, 0xfc, 0x55, 0x48, 0x63, + 0x31, 0xa1, 0x4c, 0x14, 0x10, 0x15, 0x0f, 0xde, 0x81, 0xad, 0x69, 0x94, 0x8a, 0x3b, 0xfc, 0x1d, + 0x7a, 0x97, 0x09, 0x17, 0x93, 0x24, 0x16, 0xcc, 0xf3, 0x85, 0xc9, 0x8e, 0xc0, 0x5e, 0x7a, 0x7c, + 0xa9, 0x5f, 0xee, 0x13, 0x7d, 0x46, 0x03, 0xd8, 0xbd, 0x0e, 0x57, 0x34, 0xf6, 0x22, 0xa3, 0x45, + 0x69, 0xa3, 0xc7, 0xb0, 0xcd, 0xc3, 0x9b, 0x98, 0xb2, 0x7e, 0xeb, 0xb8, 0x25, 0x6f, 0x0a, 0x4b, + 0xc9, 0xe7, 0x27, 0x51, 0x24, 0xd3, 0xf6, 0xed, 0x5c, 0xbe, 0xc2, 0x94, 0xf2, 0x1d, 0x7e, 0x48, + 0xc2, 0x78, 0x2e, 0xe3, 0x3c, 0x91, 0x31, 0x6a, 0x32, 0x63, 0xd8, 0xf7, 0x8b, 0x62, 0x16, 0x59, + 0x18, 0x14, 0xb5, 0xd7, 0x7c, 0xaa, 0xba, 0x34, 0x61, 0x79, 0x8b, 0x3b, 0x44, 0x9f, 0xf1, 0x0f, + 0x0b, 0x3a, 0x8a, 0xba, 0x64, 0x12, 0x53, 0x5f, 0xd0, 0x00, 0xbd, 0x82, 0x36, 0x35, 0x2d, 0xd5, + 0x30, 0x7b, 0xe3, 0x6e, 0xbd, 0xd1, 0xe4, 0x3e, 0xe0, 0x9f, 0xbc, 0xcd, 0x0d, 0x79, 0x8f, 0xc0, + 0xce, 0xb8, 0xe6, 0xa8, 0xc0, 0xda, 0x1a, 0x4c, 0xe5, 0x24, 0xda, 0x8d, 0xbf, 0x80, 0xad, 0xc5, + 0x97, 0xa4, 0x6f, 0xe9, 0xdd, 0xf9, 0xbd, 0x7e, 0xc6, 0xbc, 0x6f, 0x6a, 0xb3, 0xda, 0xd4, 0x2e, + 0x34, 0xc3, 0x54, 0x83, 0xb6, 0x89, 0x3c, 0x95, 0xf4, 0xec, 0x0a, 0xbd, 0x37, 0xe0, 0x10, 0xea, + 0x05, 0x77, 0x4a, 0xaf, 0x07, 0x48, 0x85, 0x7f, 0x5a, 0x70, 0xf0, 0xd1, 0xcb, 0x62, 0x7f, 0x59, + 0x2a, 0xfd, 0x40, 0x61, 0x9e, 0x41, 0x87, 0x9b, 0xa7, 0x15, 0x65, 0xea, 0xce, 0x2a, 0x67, 0x35, + 0x01, 0x15, 0xce, 0x72, 0x6c, 0xb8, 0x2a, 0x38, 0xf6, 0xa9, 0x64, 0xd4, 0x92, 0x8c, 0x4a, 0x7b, + 0xfc, 0xbb, 0x09, 0xbb, 0x97, 0xc5, 0xbe, 0xa3, 0x31, 0xec, 0x9a, 0x29, 0x46, 0x87, 0xba, 0x9e, + 0xb5, 0x9d, 0x1f, 0xac, 0x55, 0x89, 0x1b, 0x68, 0x04, 0xb6, 0x5a, 0x1a, 0xe4, 0xe8, 0x9b, 0xca, + 0xfe, 0x0c, 0x7a, 0x35, 0x84, 0x7c, 0x2d, 0xe4, 0x83, 0x97, 0x00, 0x8b, 0x98, 0x99, 0x34, 0x90, + 0x03, 0xaa, 0x4d, 0xd8, 0x00, 0xfe, 0x0e, 0xf6, 0xab, 0xbb, 0x81, 0xfa, 0x3a, 0x62, 0xc3, 0xba, + 0x6c, 0x78, 0x7b, 0x0a, 0x9d, 0xda, 0x78, 0xa3, 0x27, 0x3a, 0x64, 0xd3, 0xc8, 0x0f, 0x50, 0x39, + 0x48, 0xe5, 0xf0, 0xe2, 0xc6, 0x89, 0x25, 0xf3, 0xb7, 0xcb, 0x9e, 0xa3, 0x47, 0x05, 0x9f, 0xfa, + 0x0c, 0x0c, 0x72, 0xa1, 0xd6, 0x3a, 0x8c, 0x1b, 0x5f, 0xb7, 0xf5, 0xaf, 0xe7, 0xeb, 0xbf, 0x01, + 0x00, 0x00, 0xff, 0xff, 0x3f, 0xa2, 0x07, 0x22, 0x5e, 0x05, 0x00, 0x00, } diff --git a/dfssp/api/platform.proto b/dfssp/api/platform.proto index 5dd180b581901cd0d0c508704799402c57d3b0f9..93f4887c568632f3c979a783c50ab332d8444218 100644 --- a/dfssp/api/platform.proto +++ b/dfssp/api/platform.proto @@ -94,4 +94,5 @@ message LaunchSignature { ErrorCode errorCode = 1; string signatureUuid = 2; repeated bytes keyHash = 3; + repeated uint32 sequence = 4; } diff --git a/dfssp/contract/file.go b/dfssp/contract/file.go index 3a088a03f19669196ada3483a660556ec7311157..ebf4d721d3678868f65b074078305f4b26e9736d 100644 --- a/dfssp/contract/file.go +++ b/dfssp/contract/file.go @@ -29,13 +29,12 @@ type TTPJSON struct { // JSON is the structure used to store contract information in JSON format type JSON struct { - UUID string - Date *time.Time - Comment string - File *FileJSON - Signers []SignerJSON - Sequence []uint - TTP *TTPJSON + UUID string + Date *time.Time + Comment string + File *FileJSON + Signers []SignerJSON + TTP *TTPJSON } // GetJSON returns indented json from a contract and some ttp information (nil allowed) diff --git a/dfssp/contract/file_test.go b/dfssp/contract/file_test.go index 5a396f6a349652a9db767623da184e95ca871d84..33eb53ea283571b4fa543169229755bfdaa7730f 100644 --- a/dfssp/contract/file_test.go +++ b/dfssp/contract/file_test.go @@ -48,7 +48,6 @@ allow multiline and accents: éÉ`, "Hash": "bb" } ], - "Sequence": null, "TTP": null }` diff --git a/dfssp/contract/join.go b/dfssp/contract/join.go index 58262fe875a238bcf24f2ad403d9d3a0724cca87..3673672cc5e19514bfcad2a57a9f0433a51ba6e3 100644 --- a/dfssp/contract/join.go +++ b/dfssp/contract/join.go @@ -103,4 +103,3 @@ func sendUserToStream(stream *api.Platform_JoinSignatureServer, contractUUID str User: user, }) } - diff --git a/dfssp/contract/ready.go b/dfssp/contract/ready.go index 5749531bf7063bb7d74217163a04e50813ef3696..f5dabcd86a7765d92aa6b41b9e931bf5716eb04b 100644 --- a/dfssp/contract/ready.go +++ b/dfssp/contract/ready.go @@ -14,9 +14,10 @@ import ( // readySignal is the structure that is transmitted accross goroutines type readySignal struct { - ready bool // If true, this is the ready signal. If not, this is a new connection signal - data string // Various data (CN or SignatureUUID) - chain [][]byte // Only used to broadcast hash chain (signers hashes in order) + ready bool // If true, this is the ready signal. If not, this is a new connection signal + data string // Various data (CN or SignatureUUID) + chain [][]byte // Only used to broadcast hash chain (signers hashes in order) + sequence []uint32 // Only used to broadcast signature sequence } // ReadySign is the last job of the platform before the signature can occur. @@ -108,9 +109,10 @@ func masterReadyRoutine(db *mgdb.MongoManager, rooms *common.WaitingGroupMap, co ready := FindAndUpdatePendingSigner(cn, &signersReady, &contract.Signers) if ready { rooms.Broadcast(roomID, &readySignal{ - ready: true, - data: bson.NewObjectId().Hex(), - chain: contract.GetHashChain(), + ready: true, + data: bson.NewObjectId().Hex(), + chain: contract.GetHashChain(), + sequence: GenerateSignSequence(len(contract.Signers)), }) work = false } diff --git a/dfssp/contract/sequence.go b/dfssp/contract/sequence.go index 796e752ff840efc43a71151dc830119c68e64fa4..eaf28f60d8b279b5fce66e4089aa461ee6f45184 100644 --- a/dfssp/contract/sequence.go +++ b/dfssp/contract/sequence.go @@ -1,23 +1,20 @@ package contract -import ( - "dfss/dfssp/entities" -) - // GenerateSignSequence for the contract signature // // The generated sequence is an array of integers refering to the User array. -func GenerateSignSequence(users []*entities.User) []int { - return SquaredSignEngine(len(users)) +func GenerateSignSequence(n int) []uint32 { + return SquaredSignEngine(uint32(n)) } // SquaredSignEngine is a basic ^2 engine for sequence generation -func SquaredSignEngine(n int) []int { - sequence := make([]int, n*n) +func SquaredSignEngine(n uint32) []uint32 { + sequence := make([]uint32, n*n) - for i := 0; i < n; i++ { - for k := 0; k < n; k++ { - sequence[i*n+k] = k + var i, k uint32 + for i = 0; i < n; i++ { + for k = 0; k < n; k++ { + sequence[i*n+k] = uint32(k) } } @@ -25,17 +22,18 @@ func SquaredSignEngine(n int) []int { } // SquaredSignEngineSlice is the same as the above with slicing -func SquaredSignEngineSlice(n int) []int { - baseSequence := make([]int, n) +func SquaredSignEngineSlice(n uint32) []uint32 { + baseSequence := make([]uint32, n) // populate base slice - for i := 0; i < n; i++ { + var i uint32 + for i = 0; i < n; i++ { baseSequence[i] = i } - sequence := make([]int, 0, n*n) + sequence := make([]uint32, 0, n*n) // append n-1 time the slice to itself - for i := 0; i < n; i++ { + for i = 0; i < n; i++ { sequence = append(sequence, baseSequence...) } diff --git a/dfssp/contract/sequence_test.go b/dfssp/contract/sequence_test.go index 2327a8bb91cc03a25c341ac723266d5b0f769973..e3097c0b36ab62ee5798e9851f0bfc87f64c47ad 100644 --- a/dfssp/contract/sequence_test.go +++ b/dfssp/contract/sequence_test.go @@ -2,30 +2,18 @@ package contract_test import ( "dfss/dfssp/contract" - "dfss/dfssp/entities" "github.com/bmizerany/assert" "testing" ) -var refSeq = []int{0, 1, 2, 0, 1, 2, 0, 1, 2} // for n = 3 +var refSeq = []uint32{0, 1, 2, 0, 1, 2, 0, 1, 2} // for n = 3 func TestGenerateSignSequence(t *testing.T) { - - // initialise fixtures - var users = make([]*entities.User, 3) - users[0] = entities.NewUser() - users[1] = entities.NewUser() - users[2] = entities.NewUser() - users[0].Email = "user1@example.com" - users[1].Email = "user2@example.com" - users[2].Email = "user3@example.com" - - assert.Equal(t, refSeq, contract.GenerateSignSequence(users)) + assert.Equal(t, refSeq, contract.GenerateSignSequence(3)) } // Perform sequence generation in a loop func BenchmarkSquaredEngine(b *testing.B) { - for i := 0; i < b.N; i++ { _ = contract.SquaredSignEngine(10) } @@ -33,7 +21,6 @@ func BenchmarkSquaredEngine(b *testing.B) { // Perform sequence generation in a loop with slicing func BenchmarkSquaredEngineSlice(b *testing.B) { - for i := 0; i < b.N; i++ { _ = contract.SquaredSignEngineSlice(10) } diff --git a/tests/sign_test.go b/tests/sign_test.go index 6f9f304089ec6fcb1d9a1ac77e6bd26e48575175..115078c1a6dd3dcb759cba2c7e870609d48e0078 100644 --- a/tests/sign_test.go +++ b/tests/sign_test.go @@ -32,15 +32,15 @@ func TestSignContract(t *testing.T) { // Register clients clients := make([]*exec.Cmd, 3) - client1, err := createClient(workingDir, ca, 0) + client1, err := createClient(workingDir, ca, 9091) assert.Equal(t, nil, err) err = registerAndAuth(client1, "client1@example.com", "password", "", true, true) assert.Equal(t, nil, err) - client2, err := createClient(workingDir, ca, 0) + client2, err := createClient(workingDir, ca, 9092) assert.Equal(t, nil, err) err = registerAndAuth(client2, "client2@example.com", "password", "", true, true) assert.Equal(t, nil, err) - client3, err := createClient(workingDir, ca, 0) + client3, err := createClient(workingDir, ca, 9093) assert.Equal(t, nil, err) err = registerAndAuth(client3, "client3@example.com", "password", "", true, true) assert.Equal(t, nil, err) @@ -80,6 +80,7 @@ func TestSignContract(t *testing.T) { go func(c *exec.Cmd, i int) { time.Sleep(time.Duration(i*2) * time.Second) c.Stdin = strings.NewReader("password\nyes\n") + c.Stderr = os.Stderr output, err := c.Output() if err != nil { output = nil diff --git a/tests/starters_test.go b/tests/starters_test.go index a82bd8bdb352db411af25d286208c2299add824f..a0ca586295201a177b31e3990b2dd8e4e5514bc8 100644 --- a/tests/starters_test.go +++ b/tests/starters_test.go @@ -73,7 +73,7 @@ func createClient(tmpDir string, ca []byte, port int) (*exec.Cmd, error) { // Prepare the client command. // The last argument is up to you! - cmd := exec.Command(path, "-ca", caPath, "-cert", certPath, "-host", "127.0.0.1:"+testPort, "-key", keyPath, "-port", strconv.Itoa(port), "-v") + cmd := exec.Command(path, "-ca", caPath, "-cert", certPath, "-host", "127.0.0.1:"+testPort, "-key", keyPath, "-port", strconv.Itoa(port), "-v") return cmd, nil }