go.dedis.ch/onet/v4@v4.0.0-pre1/app/config_test.go (about)

     1  package app
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  	"go.dedis.ch/kyber/v4/pairing"
    14  	"go.dedis.ch/kyber/v4/suites"
    15  	"go.dedis.ch/onet/v4"
    16  	"go.dedis.ch/onet/v4/log"
    17  	"go.dedis.ch/onet/v4/network"
    18  )
    19  
    20  var o bytes.Buffer
    21  
    22  const testServiceName = "OnetConfigTestService"
    23  
    24  func registerService() {
    25  	onet.RegisterNewServiceWithSuite(testServiceName, pairing.NewSuiteBn256(), func(c *onet.Context) (onet.Service, error) {
    26  		return nil, nil
    27  	})
    28  }
    29  
    30  func unregisterService() {
    31  	onet.UnregisterService(testServiceName)
    32  }
    33  
    34  func TestMain(m *testing.M) {
    35  	out = &o
    36  	log.MainTest(m)
    37  }
    38  
    39  var serverGroup = `Description = "Default Dedis Cothority"
    40  
    41  [[servers]]
    42    Address = "tcp://5.135.161.91:2000"
    43    Public = "94b8255379e11df5167b8a7ae3b85f7e7eb5f13894abee85bd31b3270f1e4c65"
    44    Description = "Nikkolasg's server: spreading the love of singing"
    45    [servers.Services]
    46  	[servers.Services.OnetConfigTestService]
    47  	Suite = "bn256.adapter"
    48  	Public = "593c700babf825b6056a2339ce437f73f717226a77d618a5e8f0251c00273b38557c3cda8dbde5431d062804275f8757a2c942d888ac09f2df34f806e35e660a3c6f13dc64a7cf112865807450ccbd9f75bb3aadb98599f7034cf377a9b976045df374f840e9ee617631257fc9611def6c7c2e5cf23f5ab36cf72f68f14b6686"
    49  	[servers.Services.abc]
    50  	Suite = "Ed25519"
    51  	Public = "94b8255379e11df5167b8a7ae3b85f7e7eb5f13894abee85bd31b3270f1e4c65"
    52  
    53  [[servers]]
    54    Address = "tcp://185.26.156.40:61117"
    55    Suite = "Ed25519"
    56    Public = "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"
    57    Description = "Ismail's server"
    58    URL = "https://ismail.example.com/conode"
    59  `
    60  
    61  func TestReadGroupDescToml(t *testing.T) {
    62  	registerService()
    63  	defer unregisterService()
    64  
    65  	group, err := ReadGroupDescToml(strings.NewReader(serverGroup))
    66  	if err != nil {
    67  		t.Fatal(err)
    68  	}
    69  
    70  	if len(group.Roster.List) != 2 {
    71  		t.Fatal("Should have 2 ServerIdentities")
    72  	}
    73  	nikkoAddr := group.Roster.List[0].Address
    74  	if !nikkoAddr.Valid() || nikkoAddr != network.NewTCPAddress("5.135.161.91:2000") {
    75  		t.Fatal("Address not valid " + group.Roster.List[0].Address.String())
    76  	}
    77  	if len(group.Description) != 2 {
    78  		t.Fatal("Should have 2 descriptions")
    79  	}
    80  	if group.Description[group.Roster.List[1]] != "Ismail's server" {
    81  		t.Fatal("This should be Ismail's server")
    82  	}
    83  	if group.Roster.List[1].URL != "https://ismail.example.com/conode" {
    84  		t.Fatal("Did not find expected URL.")
    85  	}
    86  
    87  	require.Equal(t, 1, len(group.Roster.List[0].ServiceIdentities))
    88  	require.Equal(t, "bn256.adapter", group.Roster.List[0].ServiceIdentities[0].Suite)
    89  }
    90  
    91  // TestReadGroupWithWrongSuite checks if an error is returned when the wrong suite
    92  // is used in the service configuration
    93  func TestReadGroupWithWrongSuite(t *testing.T) {
    94  	registerService()
    95  	defer unregisterService()
    96  
    97  	const group = `
    98  	[[servers]]
    99  	Address = "tcp://5.135.161.91:2000"
   100  	Public = "94b8255379e11df5167b8a7ae3b85f7e7eb5f13894abee85bd31b3270f1e4c65"
   101  	Description = "Nikkolasg's server: spreading the love of singing"
   102  	[servers.Services]
   103  	  [servers.Services.OnetConfigTestService]
   104  	  Suite = "fake_name"
   105  	  Public = ""
   106  	`
   107  
   108  	require.Panics(t, func() { ReadGroupDescToml(strings.NewReader(group)) })
   109  }
   110  
   111  // TestSaveGroup checks that the group is correctly written into the file
   112  func TestSaveGroup(t *testing.T) {
   113  	registerService()
   114  	defer unregisterService()
   115  
   116  	group, err := ReadGroupDescToml(strings.NewReader(serverGroup))
   117  	require.NoError(t, err)
   118  
   119  	tmp, err := ioutil.TempDir("", "")
   120  	require.NoError(t, err)
   121  	defer os.RemoveAll(tmp)
   122  
   123  	filename := path.Join(tmp, "public.toml")
   124  
   125  	suite := suites.MustFind("ed25519")
   126  	err = group.Save(suite, filename)
   127  	require.NoError(t, err)
   128  
   129  	data, err := ioutil.ReadFile(filename)
   130  	require.NoError(t, err)
   131  	fmt.Print(string(data))
   132  	require.Contains(t, string(data), serverGroup[strings.LastIndex(serverGroup, "[[servers]]"):])
   133  }
   134  
   135  func TestParseCothority(t *testing.T) {
   136  	registerService()
   137  	defer unregisterService()
   138  
   139  	suite := "Ed25519"
   140  	public := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"
   141  	private := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"
   142  	address := "tcp://1.2.3.4:1234"
   143  	listenAddr := "127.0.0.1:0"
   144  	description := "This is a description."
   145  	scPublic := "593c700babf825b6056a2339ce437f73f717226a77d618a5e8f0251c00273b38557c3cda8dbde5431d062804275f8757a2c942d888ac09f2df34f806e35e660a3c6f13dc64a7cf112865807450ccbd9f75bb3aadb98599f7034cf377a9b976045df374f840e9ee617631257fc9611def6c7c2e5cf23f5ab36cf72f68f14b6686"
   146  	scPrivate := "622f20fbc7995dd48bab00b0f3d7d13220a9d71716c6be7a45b4b284836041a8"
   147  
   148  	privateInfo := fmt.Sprintf(`Suite = "%s"
   149          Public = "%s"
   150          Private = "%s"
   151          Address = "%s"
   152          ListenAddress = "%s"
   153  		    Description = "%s"
   154  		[services]
   155  			[services.%s]
   156  			suite = "bn256.adapter"
   157  			public = "%s"
   158  			private = "%s"
   159  			[services.abc]
   160  			suite = "Ed25519"
   161  			public = "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"`,
   162  		suite, public, private, address, listenAddr,
   163  		description, testServiceName, scPublic, scPrivate)
   164  
   165  	privateToml, err := ioutil.TempFile("", "temp_private.toml")
   166  	require.Nil(t, err)
   167  
   168  	privateToml.WriteString(privateInfo)
   169  	privateToml.Close()
   170  
   171  	cothConfig, srv, err := ParseCothority(privateToml.Name())
   172  	require.Nil(t, err)
   173  
   174  	// Check basic information
   175  	require.Equal(t, suite, cothConfig.Suite)
   176  	require.Equal(t, public, cothConfig.Public)
   177  	require.Equal(t, private, cothConfig.Private)
   178  	require.Equal(t, address, cothConfig.Address.String())
   179  	require.Equal(t, listenAddr, cothConfig.ListenAddress)
   180  	require.Equal(t, description, cothConfig.Description)
   181  	require.Equal(t, 1, len(srv.ServerIdentity.ServiceIdentities))
   182  	require.Equal(t, "bn256.adapter", cothConfig.Services[testServiceName].Suite)
   183  	require.Equal(t, scPublic, cothConfig.Services[testServiceName].Public)
   184  	require.Equal(t, scPrivate, cothConfig.Services[testServiceName].Private)
   185  
   186  	srv.Close()
   187  }
   188  
   189  func TestParseCothorityWithTLSWebSocket(t *testing.T) {
   190  	suite := "Ed25519"
   191  	public := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"
   192  	private := "6a921638a4ade8970ebcd9e371570f08d71a24987f90f12391b9f6c525be5be4"
   193  	address := "tcp://1.2.3.4:1234"
   194  	listenAddr := "127.0.0.1:0"
   195  	description := "This is a description."
   196  
   197  	// Certificate and key examples taken from
   198  	// 'https://gist.github.com/blinksmith/579b2650a09f128a03ca'
   199  	wsTLSCert := `-----BEGIN CERTIFICATE-----
   200  MIICEzCCAXygAwIBAgIQMIMChMLGrR+QvmQvpwAU6zANBgkqhkiG9w0BAQsFADAS
   201  MRAwDgYDVQQKEwdBY21lIENvMCAXDTcwMDEwMTAwMDAwMFoYDzIwODQwMTI5MTYw
   202  MDAwWjASMRAwDgYDVQQKEwdBY21lIENvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
   203  iQKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9SjY1bIw4
   204  iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZBl2+XsDul
   205  rKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQABo2gwZjAO
   206  BgNVHQ8BAf8EBAMCAqQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUw
   207  AwEB/zAuBgNVHREEJzAlggtleGFtcGxlLmNvbYcEfwAAAYcQAAAAAAAAAAAAAAAA
   208  AAAAATANBgkqhkiG9w0BAQsFAAOBgQCEcetwO59EWk7WiJsG4x8SY+UIAA+flUI9
   209  tyC4lNhbcF2Idq9greZwbYCqTTTr2XiRNSMLCOjKyI7ukPoPjo16ocHj+P3vZGfs
   210  h1fIw3cSS2OolhloGw/XM6RWPWtPAlGykKLciQrBru5NAPvCMsb/I1DAceTiotQM
   211  fblo6RBxUQ==
   212  -----END CERTIFICATE-----`
   213  	wsTLSCertKey := `-----BEGIN RSA PRIVATE KEY-----
   214  MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9
   215  SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZB
   216  l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB
   217  AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet
   218  3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb
   219  uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H
   220  qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp
   221  jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY
   222  fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U
   223  fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU
   224  y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX
   225  qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo
   226  f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA==
   227  -----END RSA PRIVATE KEY-----`
   228  
   229  	// Write files containing cert and key (+ be sure to delete them at the end)
   230  	certFile, err := ioutil.TempFile("", "temp_cert.pem")
   231  	defer func() {
   232  		err := os.Remove(certFile.Name())
   233  		require.Nil(t, err)
   234  	}()
   235  	require.Nil(t, err)
   236  	certFile.WriteString(wsTLSCert)
   237  	certFile.Close()
   238  
   239  	keyFile, err := ioutil.TempFile("", "temp_key.pem")
   240  	defer func() {
   241  		err := os.Remove(keyFile.Name())
   242  		require.Nil(t, err)
   243  	}()
   244  	require.Nil(t, err)
   245  	keyFile.WriteString(wsTLSCertKey)
   246  	keyFile.Close()
   247  
   248  	// Testing different ways of putting TLS info.
   249  	privateInfos := []string{
   250  		fmt.Sprintf(`Suite = "%s"
   251              Public = "%s"
   252              Private = "%s"
   253              Address = "%s"
   254              ListenAddress = "%s"
   255              Description = "%s"
   256              WebSocketTLSCertificate = """string://%s"""
   257              WebSocketTLSCertificateKey = """string://%s"""`,
   258  			suite, public, private, address, listenAddr,
   259  			description, wsTLSCert, wsTLSCertKey),
   260  		fmt.Sprintf(`Suite = "%s"
   261              Public = "%s"
   262              Private = "%s"
   263              Address = "%s"
   264              ListenAddress = "%s"
   265              Description = "%s"
   266              WebSocketTLSCertificate = "file://%s"
   267              WebSocketTLSCertificateKey = "file://%s"`,
   268  			suite, public, private, address, listenAddr,
   269  			description, certFile.Name(), keyFile.Name()),
   270  		fmt.Sprintf(`Suite = "%s"
   271              Public = "%s"
   272              Private = "%s"
   273              Address = "%s"
   274              ListenAddress = "%s"
   275              Description = "%s"
   276              WebSocketTLSCertificate = "%s"
   277              WebSocketTLSCertificateKey = "%s"`,
   278  			suite, public, private, address, listenAddr,
   279  			description, certFile.Name(), keyFile.Name()),
   280  	}
   281  
   282  	for i, privateInfo := range privateInfos {
   283  		privateToml, err := ioutil.TempFile("", "temp_private.toml")
   284  		require.Nil(t, err)
   285  
   286  		privateToml.WriteString(privateInfo)
   287  		privateToml.Close()
   288  
   289  		cothConfig, srv, err := ParseCothority(privateToml.Name())
   290  		require.Nil(t, err)
   291  
   292  		// Check basic information
   293  		require.Equal(t, suite, cothConfig.Suite)
   294  		require.Equal(t, public, cothConfig.Public)
   295  		require.Equal(t, private, cothConfig.Private)
   296  		require.Equal(t, address, cothConfig.Address.String())
   297  		require.Equal(t, listenAddr, cothConfig.ListenAddress)
   298  		require.Equal(t, description, cothConfig.Description)
   299  
   300  		// Check content of certificate and key
   301  		certContent, err := cothConfig.WebSocketTLSCertificate.Content()
   302  		require.Nil(t, err)
   303  		require.Equal(t, wsTLSCert, string(certContent))
   304  
   305  		keyContent, err := cothConfig.WebSocketTLSCertificateKey.Content()
   306  		require.Nil(t, err)
   307  		require.Equal(t, wsTLSCertKey, string(keyContent))
   308  
   309  		if i != 0 {
   310  			// Check when the certificate is a file.
   311  			require.NotNil(t, srv.WebSocket.TLSConfig.GetCertificate)
   312  
   313  			cert, err := srv.WebSocket.TLSConfig.GetCertificate(nil)
   314  			require.NoError(t, err)
   315  			require.NotNil(t, cert)
   316  		}
   317  
   318  		srv.Close()
   319  
   320  		err = os.Remove(privateToml.Name())
   321  		require.Nil(t, err)
   322  	}
   323  }