@@ -58,6 +58,11 @@ type keyMaterial struct {
5858 serverSecretKey * ecc.Scalar
5959 serverPublicKey []byte
6060 oprfSeed []byte
61+ oprfClientSeed []byte
62+ }
63+
64+ type OPRFSeedOptions struct {
65+ OPRFSeed []byte
6166}
6267
6368// NewServer returns a Server instantiation given the application Configuration.
@@ -84,49 +89,67 @@ func (s *Server) GetConf() *internal.Configuration {
8489 return s .conf
8590}
8691
87- func (s * Server ) oprfResponse (element * ecc.Element , oprfSeed , credentialIdentifier []byte ) * ecc.Element {
88- seed := s .conf .KDF .Expand (
89- oprfSeed ,
90- encoding .SuffixString (credentialIdentifier , tag .ExpandOPRF ),
91- internal .SeedLength ,
92- )
92+ func (s * Server ) oprfResponse (element * ecc.Element , credentialIdentifier []byte ) (* ecc.Element , error ) {
93+ if s .keyMaterial == nil {
94+ return nil , fmt .Errorf ("key material must be specified" )
95+ }
96+ seed := s .keyMaterial .oprfClientSeed
97+ if seed == nil {
98+ if s .keyMaterial .oprfSeed == nil {
99+ return nil , fmt .Errorf ("OPRF seed must be specified" )
100+ }
101+ seed = s .conf .KDF .Expand (
102+ s .keyMaterial .oprfSeed ,
103+ encoding .SuffixString (credentialIdentifier , tag .ExpandOPRF ),
104+ internal .SeedLength ,
105+ )
106+ }
93107 ku := s .conf .OPRF .DeriveKey (seed , []byte (tag .DeriveKeyPair ))
94108
95- return s .conf .OPRF .Evaluate (ku , element )
109+ return s .conf .OPRF .Evaluate (ku , element ), nil
96110}
97111
98112// RegistrationResponse returns a RegistrationResponse message to the input RegistrationRequest message and given
99113// identifiers.
100114func (s * Server ) RegistrationResponse (
101115 req * message.RegistrationRequest ,
102- serverPublicKey * ecc.Element ,
103- credentialIdentifier , oprfSeed []byte ,
104- ) * message.RegistrationResponse {
105- z := s .oprfResponse (req .BlindedMessage , oprfSeed , credentialIdentifier )
116+ credentialIdentifier []byte ,
117+ ) (* message.RegistrationResponse , error ) {
118+ z , err := s .oprfResponse (req .BlindedMessage , credentialIdentifier )
119+ if err != nil {
120+ return nil , err
121+ }
122+
123+ serverPublicKey := s .conf .Group .NewElement ()
124+ if err := serverPublicKey .Decode (s .keyMaterial .serverPublicKey ); err != nil {
125+ return nil , fmt .Errorf ("invalid server public key: %w" , err )
126+ }
106127
107128 return & message.RegistrationResponse {
108129 EvaluatedMessage : z ,
109130 Pks : serverPublicKey ,
110- }
131+ }, nil
111132}
112133
113134func (s * Server ) credentialResponse (
114135 req * message.CredentialRequest ,
115- serverPublicKey []byte ,
116136 record * message.RegistrationRecord ,
117- credentialIdentifier , oprfSeed , maskingNonce []byte ,
118- ) * message.CredentialResponse {
119- z := s .oprfResponse (req .BlindedMessage , oprfSeed , credentialIdentifier )
137+ credentialIdentifier , maskingNonce []byte ,
138+ ) (* message.CredentialResponse , error ) {
139+ z , err := s .oprfResponse (req .BlindedMessage , credentialIdentifier )
140+ if err != nil {
141+ return nil , err
142+ }
120143
121144 maskingNonce , maskedResponse := masking .Mask (
122145 s .conf ,
123146 maskingNonce ,
124147 record .MaskingKey ,
125- serverPublicKey ,
148+ s . keyMaterial . serverPublicKey ,
126149 record .Envelope ,
127150 )
128151
129- return message .NewCredentialResponse (z , maskingNonce , maskedResponse )
152+ return message .NewCredentialResponse (z , maskingNonce , maskedResponse ), nil
130153}
131154
132155// GenerateKE2Options enables setting optional values for the session, which default to secure random values if not
@@ -160,7 +183,7 @@ func getGenerateKE2Options(options []GenerateKE2Options) *ake.Options {
160183// - serverSecretKey is the server's secret AKE key.
161184// - serverPublicKey is the server's public AKE key to the serverSecretKey.
162185// - oprfSeed is the long-term OPRF input seed.
163- func (s * Server ) SetKeyMaterial (serverIdentity , serverSecretKey , serverPublicKey , oprfSeed []byte ) error {
186+ func (s * Server ) SetKeyMaterial (serverIdentity , serverSecretKey , serverPublicKey , oprfSeed []byte , oprfClientSeed [] byte ) error {
164187 sks := s .conf .Group .NewScalar ()
165188 if err := sks .Decode (serverSecretKey ); err != nil {
166189 return fmt .Errorf ("invalid server AKE secret key: %w" , err )
@@ -170,7 +193,15 @@ func (s *Server) SetKeyMaterial(serverIdentity, serverSecretKey, serverPublicKey
170193 return ErrZeroSKS
171194 }
172195
173- if len (oprfSeed ) != s .conf .Hash .Size () {
196+ if oprfSeed != nil {
197+ if len (oprfSeed ) != s .conf .Hash .Size () {
198+ return ErrInvalidOPRFSeedLength
199+ }
200+ } else if oprfClientSeed != nil {
201+ if len (oprfClientSeed ) != internal .SeedLength {
202+ return ErrInvalidOPRFSeedLength
203+ }
204+ } else {
174205 return ErrInvalidOPRFSeedLength
175206 }
176207
@@ -187,6 +218,7 @@ func (s *Server) SetKeyMaterial(serverIdentity, serverSecretKey, serverPublicKey
187218 serverSecretKey : sks ,
188219 serverPublicKey : serverPublicKey ,
189220 oprfSeed : oprfSeed ,
221+ oprfClientSeed : oprfClientSeed ,
190222 }
191223
192224 return nil
@@ -211,8 +243,11 @@ func (s *Server) GenerateKE2(
211243
212244 op := getGenerateKE2Options (options )
213245
214- response := s .credentialResponse (ke1 .CredentialRequest , s .keyMaterial .serverPublicKey ,
215- record .RegistrationRecord , record .CredentialIdentifier , s .keyMaterial .oprfSeed , record .TestMaskNonce )
246+ response , err := s .credentialResponse (ke1 .CredentialRequest ,
247+ record .RegistrationRecord , record .CredentialIdentifier , record .TestMaskNonce )
248+ if err != nil {
249+ return nil , err
250+ }
216251
217252 identities := ake.Identities {
218253 ClientIdentity : record .ClientIdentity ,
0 commit comments