@@ -80,12 +80,20 @@ impl InternalClaims {
8080 }
8181}
8282
83+ /// Test keypair holder with both the signing key and JWKs
84+ pub struct InternalKeyPair {
85+ pub signing_key : SigningKey ,
86+ pub private_jwk : Jwk ,
87+ pub public_jwk : Jwk ,
88+ }
89+
8390/// Generate an Ed25519 keypair for internal JWT testing
8491///
85- /// Returns (private_jwk, public_jwk) where:
86- /// - private_jwk contains the 'd' parameter for signing
87- /// - public_jwk contains only the public 'x' parameter for verification
88- pub fn generate_internal_keypair ( ) -> ( Jwk , Jwk ) {
92+ /// Returns InternalKeyPair containing:
93+ /// - signing_key: The actual Ed25519 signing key
94+ /// - private_jwk: JWK with kid for the private key
95+ /// - public_jwk: JWK for verification (goes in JWKS)
96+ pub fn generate_internal_keypair ( ) -> InternalKeyPair {
8997 let signing_key = SigningKey :: generate ( & mut OsRng ) ;
9098 let verifying_key = signing_key. verifying_key ( ) ;
9199
@@ -96,7 +104,7 @@ pub fn generate_internal_keypair() -> (Jwk, Jwk) {
96104
97105 let kid = uuid:: Uuid :: new_v4 ( ) . to_string ( ) ;
98106
99- // Create private JWK (for signing)
107+ // Create private JWK (for signing - stores kid )
100108 let private_jwk = Jwk {
101109 kty : "OKP" . to_string ( ) ,
102110 crv : Some ( "Ed25519" . to_string ( ) ) ,
@@ -120,27 +128,25 @@ pub fn generate_internal_keypair() -> (Jwk, Jwk) {
120128 use_ : Some ( "sig" . to_string ( ) ) ,
121129 } ;
122130
123- ( private_jwk, public_jwk)
131+ InternalKeyPair {
132+ signing_key,
133+ private_jwk,
134+ public_jwk,
135+ }
124136}
125137
126- /// Generate an internal JWT signed with a new Ed25519 key
127- ///
128- /// Note: For testing purposes, this generates a fresh signing key each time.
129- /// The kid from the provided JWK is used in the JWT header.
138+ /// Generate an internal JWT signed with the provided keypair
130139///
131140/// # Arguments
132141///
133- /// * `private_key_jwk ` - The JWK containing the kid to use
142+ /// * `keypair ` - The InternalKeyPair containing the signing key
134143/// * `claims` - The claims to include in the JWT
135144///
136145/// # Returns
137146///
138147/// A signed JWT string
139- pub fn generate_internal_jwt ( private_key_jwk : & Jwk , claims : InternalClaims ) -> String {
140- // For testing, generate a fresh Ed25519 signing key
141- // This is acceptable for tests where we just need a valid JWT structure
142- let signing_key = SigningKey :: generate ( & mut OsRng ) ;
143- let private_bytes = signing_key. to_bytes ( ) ;
148+ pub fn generate_internal_jwt ( keypair : & InternalKeyPair , claims : InternalClaims ) -> String {
149+ let private_bytes = keypair. signing_key . to_bytes ( ) ;
144150
145151 // Create PKCS8 DER encoding for Ed25519
146152 // Ed25519 private keys in PKCS#8 format have this structure
@@ -158,7 +164,7 @@ pub fn generate_internal_jwt(private_key_jwk: &Jwk, claims: InternalClaims) -> S
158164
159165 // Create JWT header with kid
160166 let mut header = Header :: new ( Algorithm :: EdDSA ) ;
161- header. kid = Some ( private_key_jwk . kid . clone ( ) ) ;
167+ header. kid = Some ( keypair . private_jwk . kid . clone ( ) ) ;
162168
163169 // Encode JWT
164170 encode ( & header, & claims, & encoding_key) . expect ( "Failed to encode JWT" )
@@ -188,20 +194,20 @@ mod tests {
188194
189195 #[ test]
190196 fn test_generate_keypair ( ) {
191- let ( private_jwk , public_jwk ) = generate_internal_keypair ( ) ;
197+ let keypair = generate_internal_keypair ( ) ;
192198
193- // Both should have same kid
194- assert_eq ! ( private_jwk. kid, public_jwk. kid) ;
199+ // Both JWKs should have same kid
200+ assert_eq ! ( keypair . private_jwk. kid, keypair . public_jwk. kid) ;
195201
196202 // Both should be OKP/Ed25519
197- assert_eq ! ( private_jwk. kty, "OKP" ) ;
198- assert_eq ! ( private_jwk. crv, Some ( "Ed25519" . to_string( ) ) ) ;
199- assert_eq ! ( public_jwk. kty, "OKP" ) ;
200- assert_eq ! ( public_jwk. crv, Some ( "Ed25519" . to_string( ) ) ) ;
203+ assert_eq ! ( keypair . private_jwk. kty, "OKP" ) ;
204+ assert_eq ! ( keypair . private_jwk. crv, Some ( "Ed25519" . to_string( ) ) ) ;
205+ assert_eq ! ( keypair . public_jwk. kty, "OKP" ) ;
206+ assert_eq ! ( keypair . public_jwk. crv, Some ( "Ed25519" . to_string( ) ) ) ;
201207
202208 // Both should have x parameter
203- assert ! ( private_jwk. x. is_some( ) ) ;
204- assert ! ( public_jwk. x. is_some( ) ) ;
209+ assert ! ( keypair . private_jwk. x. is_some( ) ) ;
210+ assert ! ( keypair . public_jwk. x. is_some( ) ) ;
205211 }
206212
207213 #[ test]
@@ -221,8 +227,8 @@ mod tests {
221227
222228 #[ test]
223229 fn test_create_internal_jwks ( ) {
224- let ( _private , public ) = generate_internal_keypair ( ) ;
225- let jwks = create_internal_jwks ( vec ! [ public ] ) ;
230+ let keypair = generate_internal_keypair ( ) ;
231+ let jwks = create_internal_jwks ( vec ! [ keypair . public_jwk ] ) ;
226232
227233 assert_eq ! ( jwks. keys. len( ) , 1 ) ;
228234 assert_eq ! ( jwks. issuer, "https://internal.inferadb.com" ) ;
@@ -231,9 +237,9 @@ mod tests {
231237
232238 #[ test]
233239 fn test_generate_jwt ( ) {
234- let ( private , _public ) = generate_internal_keypair ( ) ;
240+ let keypair = generate_internal_keypair ( ) ;
235241 let claims = InternalClaims :: default ( ) ;
236- let jwt = generate_internal_jwt ( & private , claims) ;
242+ let jwt = generate_internal_jwt ( & keypair , claims) ;
237243
238244 // JWT should have 3 parts
239245 assert_eq ! ( jwt. split( '.' ) . count( ) , 3 ) ;
0 commit comments