@@ -33,16 +33,13 @@ func init() {
3333 // Register Ed448 as valid algorithm for OKP key type
3434 jws .RegisterAlgorithmForKeyType (jwa .OKP (), jwa .EdDSAEd448 ())
3535
36- // Register JWK OKP curve builders for Ed448
37- jwk .RegisterOKPCurveBuilder (jwa .Ed448 (), jwk.OKPCurveBuilder {
38- BuildPublicKey : buildEd448PublicKey ,
39- BuildPrivateKey : buildEd448PrivateKey ,
40- })
36+ // Register JWK exporter for OKP:Ed448 keys (JWK → raw ed448 key)
37+ jwk .RegisterKeyExporter (jwk .KeyKind ("OKP:Ed448" ), jwk .KeyExportFunc (exportEd448Key ))
4138
4239 // Register raw key importer for Ed448 keys
4340 jwk .RegisterOKPRawKeyImporter (importEd448RawKey )
4441
45- // Register jwk.Import handlers for Ed448 key types
42+ // Register jwk.Import handlers for Ed448 key types (raw ed448 key → JWK)
4643 f := jwk .KeyImportFunc (importOKPEd448Key )
4744 jwk .RegisterKeyImporter (ed448 .PublicKey (nil ), f )
4845 jwk .RegisterKeyImporter (ed448 .PrivateKey (nil ), f )
@@ -126,25 +123,40 @@ func ed448PublicKey(dst *ed448.PublicKey, src any) error {
126123 return nil
127124}
128125
129- // --- JWK OKP key building ---
126+ // --- JWK key export (JWK → raw ed448 key) ---
130127
131- func buildEd448PublicKey (xbuf []byte ) (any , error ) {
132- if len (xbuf ) != ed448 .PublicKeySize {
133- return nil , fmt .Errorf (`ed448: wrong public key size %d (expected %d)` , len (xbuf ), ed448 .PublicKeySize )
134- }
135- return ed448 .PublicKey (xbuf ), nil
136- }
137-
138- func buildEd448PrivateKey (xbuf , dbuf []byte ) (any , error ) {
139- if len (dbuf ) != ed448 .SeedSize {
140- return nil , fmt .Errorf (`ed448: wrong private key seed size %d (expected %d)` , len (dbuf ), ed448 .SeedSize )
141- }
142- ret := ed448 .NewKeyFromSeed (dbuf )
143- pub := ret .Public ().(ed448.PublicKey ) //nolint:forcetypeassert
144- if ! bytes .Equal (xbuf , pub ) {
145- return nil , fmt .Errorf (`ed448: invalid x value given d value` )
128+ func exportEd448Key (key jwk.Key , _ any ) (any , error ) {
129+ switch key := key .(type ) {
130+ case jwk.OKPPrivateKey :
131+ x , ok := key .X ()
132+ if ! ok {
133+ return nil , fmt .Errorf (`missing "x" field` )
134+ }
135+ d , ok := key .D ()
136+ if ! ok {
137+ return nil , fmt .Errorf (`missing "d" field` )
138+ }
139+ if len (d ) != ed448 .SeedSize {
140+ return nil , fmt .Errorf (`ed448: wrong private key seed size %d (expected %d)` , len (d ), ed448 .SeedSize )
141+ }
142+ ret := ed448 .NewKeyFromSeed (d )
143+ pub := ret .Public ().(ed448.PublicKey ) //nolint:forcetypeassert
144+ if ! bytes .Equal (x , pub ) {
145+ return nil , fmt .Errorf (`ed448: invalid x value given d value` )
146+ }
147+ return ret , nil
148+ case jwk.OKPPublicKey :
149+ x , ok := key .X ()
150+ if ! ok {
151+ return nil , fmt .Errorf (`missing "x" field` )
152+ }
153+ if len (x ) != ed448 .PublicKeySize {
154+ return nil , fmt .Errorf (`ed448: wrong public key size %d (expected %d)` , len (x ), ed448 .PublicKeySize )
155+ }
156+ return ed448 .PublicKey (x ), nil
157+ default :
158+ return nil , jwk .ContinueError ()
146159 }
147- return ret , nil
148160}
149161
150162// --- JWK raw key import ---
0 commit comments