server_test.go 5.15 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package sessiontest

import (
	"encoding/json"
	"net/http"
	"path/filepath"
	"testing"

	"github.com/Sirupsen/logrus"
	"github.com/mhe/gabi"
	"github.com/privacybydesign/irmago"
	"github.com/privacybydesign/irmago/internal/test"
	"github.com/privacybydesign/irmago/irmaserver"
	"github.com/privacybydesign/irmago/irmaserver/irmarequestor"
	"github.com/stretchr/testify/require"
)

var irmaServer *http.Server

func StartIrmaServer(t *testing.T) {
	testdata := test.FindTestdataFolder(t)
	skpath := filepath.Join(testdata, "irma_configuration", "irma-demo", "RU", "PrivateKeys", "2.xml")
	iss := irma.NewIssuerIdentifier("irma-demo.RU")
	sk, err := gabi.NewPrivateKeyFromFile(skpath)
	require.NoError(t, err)

	skpath = filepath.Join(testdata, "irma_configuration", "irma-demo", "MijnOverheid", "PrivateKeys", "1.xml")
	iss2 := irma.NewIssuerIdentifier("irma-demo.MijnOverheid")
	sk2, err := gabi.NewPrivateKeyFromFile(skpath)
	require.NoError(t, err)

	skpath = filepath.Join(testdata, "irma_configuration", "test", "test", "PrivateKeys", "3.xml")
	iss3 := irma.NewIssuerIdentifier("test.test")
	sk3, err := gabi.NewPrivateKeyFromFile(skpath)
	require.NoError(t, err)

	logger := logrus.New()
	logger.Level = logrus.WarnLevel
	logger.Formatter = &logrus.TextFormatter{}
	require.NoError(t, irmarequestor.Initialize(&irmaserver.Configuration{
		Logger:                logger,
		IrmaConfigurationPath: filepath.Join(testdata, "irma_configuration"),
		PrivateKeys: map[irma.IssuerIdentifier]*gabi.PrivateKey{
			iss:  sk,
			iss2: sk2,
			iss3: sk3,
		},
	}))

	mux := http.NewServeMux()
	mux.HandleFunc("/", irmarequestor.HttpHandlerFunc("/"))
	irmaServer = &http.Server{Addr: ":48680", Handler: mux}
	go func() {
		irmaServer.ListenAndServe()
	}()
}

func StopIrmaServer() {
	irmaServer.Close()
}

func newSessionHelper(t *testing.T, request irma.SessionRequest) *irmaserver.SessionResult {
	StartIrmaServer(t)
	client := parseStorage(t)
	clientChan := make(chan *SessionResult)
	serverChan := make(chan *irmaserver.SessionResult)

	qr, token, err := irmarequestor.StartSession(request, func(result *irmaserver.SessionResult) {
		serverChan <- result
	})
	require.NoError(t, err)
	qr.URL = "http://localhost:48680/" + qr.URL

	h := TestHandler{t, clientChan, client}
	j, err := json.Marshal(qr)
	require.NoError(t, err)
	client.NewSession(string(j), h)
	clientResult := <-clientChan
	if clientResult != nil {
		require.NoError(t, clientResult.Err)
	}

	serverResult := <-serverChan
	StopIrmaServer()
	test.ClearTestStorage(t)
	require.Equal(t, token, serverResult.Token)
	return serverResult
}

func TestNewSignatureSession(t *testing.T) {
	id := irma.NewAttributeTypeIdentifier("irma-demo.RU.studentCard.studentID")
	serverResult := newSessionHelper(t, &irma.SignatureRequest{
		Message: "message",
		DisclosureRequest: irma.DisclosureRequest{
			BaseRequest: irma.BaseRequest{Type: irma.ActionSigning},
			Content: irma.AttributeDisjunctionList([]*irma.AttributeDisjunction{{
				Label:      "foo",
				Attributes: []irma.AttributeTypeIdentifier{id},
			}}),
		},
	})

	require.Nil(t, serverResult.Err)
	require.Equal(t, irma.ProofStatusValid, serverResult.ProofStatus)
	require.NotEmpty(t, serverResult.Disclosed)
	require.Equal(t, id, serverResult.Disclosed[0].Identifier)
	require.Equal(t, "456", serverResult.Disclosed[0].Value["en"])
}

func TestNewDisclosureSession(t *testing.T) {
	id := irma.NewAttributeTypeIdentifier("irma-demo.RU.studentCard.studentID")
	serverResult := newSessionHelper(t, &irma.DisclosureRequest{
		BaseRequest: irma.BaseRequest{Type: irma.ActionDisclosing},
		Content: irma.AttributeDisjunctionList([]*irma.AttributeDisjunction{{
			Label:      "foo",
			Attributes: []irma.AttributeTypeIdentifier{id},
		}}),
	})

	require.Nil(t, serverResult.Err)
	require.Equal(t, irma.ProofStatusValid, serverResult.ProofStatus)
	require.NotEmpty(t, serverResult.Disclosed)
	require.Equal(t, id, serverResult.Disclosed[0].Identifier)
	require.Equal(t, "456", serverResult.Disclosed[0].Value["en"])

}

func TestNewIssuanceSession(t *testing.T) {
	attrid := irma.NewAttributeTypeIdentifier("irma-demo.RU.studentCard.studentID")
	request := &irma.IssuanceRequest{
		BaseRequest: irma.BaseRequest{Type: irma.ActionIssuing},
	}
	request.Credentials = []*irma.CredentialRequest{{
		CredentialTypeID: irma.NewCredentialTypeIdentifier("irma-demo.RU.studentCard"),
		Attributes: map[string]string{
			"university":        "Radboud",
			"studentCardNumber": "31415927",
			"studentID":         "s1234567",
			"level":             "42",
		},
	}, {
		CredentialTypeID: irma.NewCredentialTypeIdentifier("irma-demo.MijnOverheid.root"),
		Attributes: map[string]string{
			"BSN": "299792458",
		},
	}, {
		CredentialTypeID: irma.NewCredentialTypeIdentifier("test.test.mijnirma"),
		Attributes:       map[string]string{"email": "testusername"},
	}}
	request.Disclose = []*irma.AttributeDisjunction{{
		Label:      "foo",
		Attributes: []irma.AttributeTypeIdentifier{attrid},
	}}

	result := newSessionHelper(t, request)
	require.Nil(t, result.Err)
	require.Equal(t, irma.ProofStatusValid, result.ProofStatus)
	require.NotEmpty(t, result.Disclosed)
	require.Equal(t, attrid, result.Disclosed[0].Identifier)
	require.Equal(t, "456", result.Disclosed[0].Value["en"])
}