Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
IRMA
Github mirrors
irmago
Commits
2403cfcd
Commit
2403cfcd
authored
Oct 10, 2017
by
Sietse Ringers
Browse files
Refactor registration flow
parent
6bf87237
Changes
7
Hide whitespace changes
Inline
Side-by-side
configstore.go
View file @
2403cfcd
...
...
@@ -356,20 +356,20 @@ func (store *ConfigurationStore) Download(set *IrmaIdentifierSet) (*IrmaIdentifi
}
downloaded
.
Issuers
[
issid
]
=
struct
{}{}
}
for
issid
,
list
:=
range
set
.
PublicKeys
{
for
_
,
count
:=
range
list
{
pk
,
err
:=
store
.
PublicKey
(
issid
,
count
)
if
err
!=
nil
{
}
for
issid
,
list
:=
range
set
.
PublicKeys
{
for
_
,
count
:=
range
list
{
pk
,
err
:=
store
.
PublicKey
(
issid
,
count
)
if
err
!=
nil
{
return
nil
,
err
}
if
pk
==
nil
{
manager
:=
issid
.
SchemeManagerIdentifier
()
suffix
:=
fmt
.
Sprintf
(
"/%s/PublicKeys/%d.xml"
,
issid
.
Name
(),
count
)
path
:=
fmt
.
Sprintf
(
"%s/%s/%s"
,
store
.
path
,
manager
.
String
(),
suffix
)
if
transport
.
GetFile
(
store
.
SchemeManagers
[
manager
]
.
URL
+
suffix
,
path
);
err
!=
nil
{
return
nil
,
err
}
if
pk
==
nil
{
manager
:=
issid
.
SchemeManagerIdentifier
()
suffix
:=
fmt
.
Sprintf
(
"/%s/PublicKeys/%d.xml"
,
issid
.
Name
(),
count
)
path
:=
fmt
.
Sprintf
(
"%s/%s/%s"
,
store
.
path
,
manager
.
String
(),
suffix
)
if
transport
.
GetFile
(
store
.
SchemeManagers
[
manager
]
.
URL
+
suffix
,
path
);
err
!=
nil
{
return
nil
,
err
}
}
}
}
}
...
...
irmago_test.go
View file @
2403cfcd
...
...
@@ -27,14 +27,12 @@ func TestMain(m *testing.M) {
os
.
Exit
(
retCode
)
}
type
Ignoring
Keyshare
Handler
struct
{}
type
Ignoring
Client
Handler
struct
{}
func
(
i
*
IgnoringKeyshareHandler
)
UpdateConfigurationStore
(
new
*
IrmaIdentifierSet
)
{}
func
(
i
*
IgnoringKeyshareHandler
)
UpdateAttributes
()
{}
func
(
i
*
IgnoringKeyshareHandler
)
RegistrationError
(
err
error
)
{}
func
(
i
*
IgnoringKeyshareHandler
)
RegistrationSuccess
()
{}
func
(
i
*
IgnoringKeyshareHandler
)
StartRegistration
(
m
*
SchemeManager
,
callback
func
(
e
,
p
string
))
{
}
func
(
i
*
IgnoringClientHandler
)
UpdateConfigurationStore
(
new
*
IrmaIdentifierSet
)
{}
func
(
i
*
IgnoringClientHandler
)
UpdateAttributes
()
{}
func
(
i
*
IgnoringClientHandler
)
RegistrationError
(
manager
SchemeManagerIdentifier
,
err
error
)
{}
func
(
i
*
IgnoringClientHandler
)
RegistrationSuccess
(
manager
SchemeManagerIdentifier
)
{}
func
parseStorage
(
t
*
testing
.
T
)
*
CredentialManager
{
exists
,
err
:=
PathExists
(
"testdata/storage/test"
)
...
...
@@ -46,7 +44,7 @@ func parseStorage(t *testing.T) *CredentialManager {
"testdata/storage/test"
,
"testdata/irma_configuration"
,
"testdata/oldstorage"
,
&
Ignoring
Keyshare
Handler
{},
&
Ignoring
Client
Handler
{},
)
require
.
NoError
(
t
,
err
)
return
manager
...
...
manager.go
View file @
2403cfcd
...
...
@@ -46,18 +46,18 @@ type CredentialManager struct {
storage
storage
// Other state
ConfigurationStore
*
ConfigurationStore
irmaConfigurationPath
string
androidStoragePath
string
handler
ClientHandler
ConfigurationStore
*
ConfigurationStore
UnenrolledKeyshareServers
[]
SchemeManagerIdentifier
irmaConfigurationPath
string
androidStoragePath
string
handler
ClientHandler
}
// KeyshareHandler is used for asking the user for his email address and PIN,
// for registering at a keyshare server.
type
KeyshareHandler
interface
{
StartRegistration
(
manager
*
SchemeManager
,
registrationCallback
func
(
email
,
pin
string
))
RegistrationError
(
err
error
)
RegistrationSuccess
()
RegistrationError
(
manager
SchemeManagerIdentifier
,
err
error
)
RegistrationSuccess
(
manager
SchemeManagerIdentifier
)
}
type
ClientHandler
interface
{
...
...
@@ -142,12 +142,8 @@ func NewCredentialManager(
cm
.
paillierKey
(
false
)
}
unenrolled
:=
cm
.
unenrolledKeyshareServers
()
switch
len
(
unenrolled
)
{
case
0
:
// nop
case
1
:
cm
.
KeyshareEnroll
(
unenrolled
[
0
],
cm
.
handler
)
default
:
cm
.
UnenrolledKeyshareServers
=
cm
.
unenrolledKeyshareServers
()
if
len
(
cm
.
UnenrolledKeyshareServers
)
>
1
{
return
nil
,
errors
.
New
(
"Too many keyshare servers"
)
}
...
...
@@ -596,28 +592,27 @@ func (cm *CredentialManager) paillierKeyWorker(wait bool, ch chan bool) {
}
}
func
(
cm
*
CredentialManager
)
unenrolledKeyshareServers
()
[]
*
SchemeManager
{
list
:=
[]
*
SchemeManager
{}
func
(
cm
*
CredentialManager
)
unenrolledKeyshareServers
()
[]
SchemeManager
Identifier
{
list
:=
[]
SchemeManager
Identifier
{}
for
name
,
manager
:=
range
cm
.
ConfigurationStore
.
SchemeManagers
{
if
_
,
contains
:=
cm
.
keyshareServers
[
name
];
len
(
manager
.
KeyshareServer
)
>
0
&&
!
contains
{
list
=
append
(
list
,
manager
)
if
_
,
contains
:=
cm
.
keyshareServers
[
name
];
manager
.
Distributed
()
&&
!
contains
{
list
=
append
(
list
,
manager
.
Identifier
()
)
}
}
return
list
}
// KeyshareEnroll attempts to register at the keyshare server of the specified scheme manager.
func
(
cm
*
CredentialManager
)
KeyshareEnroll
(
manager
*
SchemeManager
,
handler
KeyshareHandler
)
{
handler
.
StartRegistration
(
manager
,
func
(
email
,
pin
string
)
{
go
func
()
{
err
:=
cm
.
keyshareEnrollWorker
(
manager
.
Identifier
(),
email
,
pin
)
if
err
!=
nil
{
handler
.
RegistrationError
(
err
)
}
else
{
handler
.
RegistrationSuccess
()
}
}()
})
func
(
cm
*
CredentialManager
)
KeyshareEnroll
(
manager
SchemeManagerIdentifier
,
email
,
pin
string
)
{
go
func
()
{
err
:=
cm
.
keyshareEnrollWorker
(
manager
,
email
,
pin
)
cm
.
UnenrolledKeyshareServers
=
cm
.
unenrolledKeyshareServers
()
if
err
!=
nil
{
cm
.
handler
.
RegistrationError
(
manager
,
err
)
}
else
{
cm
.
handler
.
RegistrationSuccess
(
manager
)
}
}()
}
func
(
cm
*
CredentialManager
)
keyshareEnrollWorker
(
managerID
SchemeManagerIdentifier
,
email
,
pin
string
)
error
{
...
...
requests.go
View file @
2403cfcd
...
...
@@ -181,27 +181,27 @@ func newIssuanceState() (*issuanceState, error) {
},
nil
}
func
(
d
r
*
IssuanceRequest
)
Identifiers
()
*
IrmaIdentifierSet
{
if
d
r
.
identifiers
==
nil
{
d
r
.
identifiers
=
&
IrmaIdentifierSet
{
func
(
i
r
*
IssuanceRequest
)
Identifiers
()
*
IrmaIdentifierSet
{
if
i
r
.
identifiers
==
nil
{
i
r
.
identifiers
=
&
IrmaIdentifierSet
{
SchemeManagers
:
map
[
SchemeManagerIdentifier
]
struct
{}{},
Issuers
:
map
[
IssuerIdentifier
]
struct
{}{},
CredentialTypes
:
map
[
CredentialTypeIdentifier
]
struct
{}{},
PublicKeys
:
map
[
IssuerIdentifier
][]
int
{},
}
for
_
,
credreq
:=
range
d
r
.
Credentials
{
for
_
,
credreq
:=
range
i
r
.
Credentials
{
issuer
:=
credreq
.
CredentialTypeID
.
IssuerIdentifier
()
d
r
.
identifiers
.
SchemeManagers
[
issuer
.
SchemeManagerIdentifier
()]
=
struct
{}{}
d
r
.
identifiers
.
Issuers
[
issuer
]
=
struct
{}{}
d
r
.
identifiers
.
CredentialTypes
[
*
credreq
.
CredentialTypeID
]
=
struct
{}{}
if
d
r
.
identifiers
.
PublicKeys
[
issuer
]
==
nil
{
d
r
.
identifiers
.
PublicKeys
[
issuer
]
=
[]
int
{}
i
r
.
identifiers
.
SchemeManagers
[
issuer
.
SchemeManagerIdentifier
()]
=
struct
{}{}
i
r
.
identifiers
.
Issuers
[
issuer
]
=
struct
{}{}
i
r
.
identifiers
.
CredentialTypes
[
*
credreq
.
CredentialTypeID
]
=
struct
{}{}
if
i
r
.
identifiers
.
PublicKeys
[
issuer
]
==
nil
{
i
r
.
identifiers
.
PublicKeys
[
issuer
]
=
[]
int
{}
}
d
r
.
identifiers
.
PublicKeys
[
issuer
]
=
append
(
d
r
.
identifiers
.
PublicKeys
[
issuer
],
credreq
.
KeyCounter
)
i
r
.
identifiers
.
PublicKeys
[
issuer
]
=
append
(
i
r
.
identifiers
.
PublicKeys
[
issuer
],
credreq
.
KeyCounter
)
}
for
_
,
disjunction
:=
range
d
r
.
Disclose
{
for
_
,
disjunction
:=
range
i
r
.
Disclose
{
for
_
,
attr
:=
range
disjunction
.
Attributes
{
var
cti
CredentialTypeIdentifier
if
!
attr
.
IsCredential
()
{
...
...
@@ -209,13 +209,13 @@ func (dr *IssuanceRequest) Identifiers() *IrmaIdentifierSet {
}
else
{
cti
=
NewCredentialTypeIdentifier
(
attr
.
String
())
}
d
r
.
identifiers
.
SchemeManagers
[
cti
.
IssuerIdentifier
()
.
SchemeManagerIdentifier
()]
=
struct
{}{}
d
r
.
identifiers
.
Issuers
[
cti
.
IssuerIdentifier
()]
=
struct
{}{}
d
r
.
identifiers
.
CredentialTypes
[
cti
]
=
struct
{}{}
i
r
.
identifiers
.
SchemeManagers
[
cti
.
IssuerIdentifier
()
.
SchemeManagerIdentifier
()]
=
struct
{}{}
i
r
.
identifiers
.
Issuers
[
cti
.
IssuerIdentifier
()]
=
struct
{}{}
i
r
.
identifiers
.
CredentialTypes
[
cti
]
=
struct
{}{}
}
}
}
return
d
r
.
identifiers
return
i
r
.
identifiers
}
// ToDisclose returns the attributes that must be disclosed in this issuance session.
...
...
session.go
View file @
2403cfcd
...
...
@@ -24,6 +24,7 @@ type Handler interface {
Cancelled
(
action
Action
)
Failure
(
action
Action
,
err
*
SessionError
)
UnsatisfiableRequest
(
action
Action
,
missing
AttributeDisjunctionList
)
MissingKeyshareServer
(
manager
SchemeManagerIdentifier
)
RequestIssuancePermission
(
request
IssuanceRequest
,
ServerName
string
,
callback
PermissionHandler
)
RequestVerificationPermission
(
request
DisclosureRequest
,
ServerName
string
,
callback
PermissionHandler
)
...
...
@@ -46,7 +47,6 @@ type session struct {
irmaSession
IrmaSession
transport
*
HTTPTransport
choice
*
DisclosureChoice
newmanager
*
SchemeManager
downloaded
*
IrmaIdentifierSet
}
...
...
@@ -184,6 +184,17 @@ func (session *session) start() {
}
}
// Check if we are registered to all involved keyshare servers
for
id
:=
range
session
.
irmaSession
.
Identifiers
()
.
SchemeManagers
{
distributed
:=
session
.
credManager
.
ConfigurationStore
.
SchemeManagers
[
id
]
.
Distributed
()
_
,
registered
:=
session
.
credManager
.
keyshareServers
[
id
]
if
distributed
&&
!
registered
{
session
.
transport
.
Delete
()
session
.
Handler
.
MissingKeyshareServer
(
id
)
return
}
}
// Download missing credential types/issuers/public keys from the scheme manager
if
session
.
downloaded
,
err
=
session
.
credManager
.
ConfigurationStore
.
Download
(
session
.
irmaSession
.
Identifiers
());
err
!=
nil
{
session
.
Handler
.
Failure
(
...
...
@@ -351,39 +362,21 @@ func (session *session) managerSession() {
session
.
Handler
.
Cancelled
(
session
.
Action
)
// No need to DELETE session here
return
}
session
.
newmanager
=
manager
if
err
:=
session
.
credManager
.
ConfigurationStore
.
AddSchemeManager
(
manager
);
err
!=
nil
{
session
.
Handler
.
Failure
(
session
.
Action
,
&
SessionError
{})
return
}
if
manager
.
Distributed
()
{
session
.
credManager
.
KeyshareEnroll
(
manager
,
KeyshareHandler
(
session
))
}
else
{
session
.
RegistrationSuccess
()
session
.
credManager
.
UnenrolledKeyshareServers
=
session
.
credManager
.
unenrolledKeyshareServers
()
}
session
.
credManager
.
handler
.
UpdateConfigurationStore
(
&
IrmaIdentifierSet
{
SchemeManagers
:
map
[
SchemeManagerIdentifier
]
struct
{}{
manager
.
Identifier
()
:
{}},
Issuers
:
map
[
IssuerIdentifier
]
struct
{}{},
CredentialTypes
:
map
[
CredentialTypeIdentifier
]
struct
{}{},
},
)
session
.
Handler
.
Success
(
session
.
Action
)
})
return
}
func
(
session
*
session
)
StartRegistration
(
manager
*
SchemeManager
,
callback
func
(
email
,
pin
string
))
{
session
.
credManager
.
handler
.
StartRegistration
(
manager
,
callback
)
}
func
(
session
*
session
)
RegistrationError
(
err
error
)
{
session
.
Handler
.
Failure
(
session
.
Action
,
&
SessionError
{
Err
:
err
})
// TODO
session
.
credManager
.
handler
.
RegistrationError
(
err
)
}
func
(
session
*
session
)
RegistrationSuccess
()
{
if
err
:=
session
.
credManager
.
ConfigurationStore
.
AddSchemeManager
(
session
.
newmanager
);
err
!=
nil
{
session
.
Handler
.
Failure
(
session
.
Action
,
&
SessionError
{})
return
}
session
.
credManager
.
handler
.
UpdateConfigurationStore
(
&
IrmaIdentifierSet
{
SchemeManagers
:
map
[
SchemeManagerIdentifier
]
struct
{}{
session
.
newmanager
.
Identifier
()
:
{}},
Issuers
:
map
[
IssuerIdentifier
]
struct
{}{},
CredentialTypes
:
map
[
CredentialTypeIdentifier
]
struct
{}{},
},
)
session
.
Handler
.
Success
(
session
.
Action
)
if
session
.
newmanager
.
Distributed
()
{
session
.
credManager
.
handler
.
RegistrationSuccess
()
}
}
session_test.go
View file @
2403cfcd
...
...
@@ -10,6 +10,7 @@ import (
"fmt"
"testing"
"github.com/go-errors/errors"
"github.com/stretchr/testify/require"
)
...
...
@@ -19,6 +20,10 @@ type TestHandler struct {
manager
*
CredentialManager
}
func
(
th
TestHandler
)
MissingKeyshareServer
(
manager
SchemeManagerIdentifier
)
{
th
.
Failure
(
ActionUnknown
,
&
SessionError
{
Err
:
errors
.
Errorf
(
"Missing keyshare server %s"
,
manager
.
String
())})
}
func
(
th
TestHandler
)
StatusUpdate
(
action
Action
,
status
Status
)
{}
func
(
th
TestHandler
)
Success
(
action
Action
)
{
th
.
c
<-
nil
...
...
updates.go
View file @
2403cfcd
...
...
@@ -156,6 +156,7 @@ func (cm *CredentialManager) ParseAndroidStorage() (present bool, err error) {
return
}
}
cm
.
UnenrolledKeyshareServers
=
cm
.
unenrolledKeyshareServers
()
if
err
=
cm
.
storage
.
StorePaillierKeys
(
cm
.
paillierKeyCache
);
err
!=
nil
{
return
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment