@@ -45,6 +45,7 @@ void public_key_free(struct public_key *key)
4545{
4646 if (key ) {
4747 kfree (key -> key );
48+ kfree (key -> params );
4849 kfree (key );
4950 }
5051}
@@ -94,6 +95,12 @@ int software_key_determine_akcipher(const char *encoding,
9495 return - ENOPKG ;
9596}
9697
98+ static u8 * pkey_pack_u32 (u8 * dst , u32 val )
99+ {
100+ memcpy (dst , & val , sizeof (val ));
101+ return dst + sizeof (val );
102+ }
103+
97104/*
98105 * Query information about a key.
99106 */
@@ -103,6 +110,7 @@ static int software_key_query(const struct kernel_pkey_params *params,
103110 struct crypto_akcipher * tfm ;
104111 struct public_key * pkey = params -> key -> payload .data [asym_crypto ];
105112 char alg_name [CRYPTO_MAX_ALG_NAME ];
113+ u8 * key , * ptr ;
106114 int ret , len ;
107115
108116 ret = software_key_determine_akcipher (params -> encoding ,
@@ -115,14 +123,22 @@ static int software_key_query(const struct kernel_pkey_params *params,
115123 if (IS_ERR (tfm ))
116124 return PTR_ERR (tfm );
117125
126+ key = kmalloc (pkey -> keylen + sizeof (u32 ) * 2 + pkey -> paramlen ,
127+ GFP_KERNEL );
128+ if (!key )
129+ goto error_free_tfm ;
130+ memcpy (key , pkey -> key , pkey -> keylen );
131+ ptr = key + pkey -> keylen ;
132+ ptr = pkey_pack_u32 (ptr , pkey -> algo );
133+ ptr = pkey_pack_u32 (ptr , pkey -> paramlen );
134+ memcpy (ptr , pkey -> params , pkey -> paramlen );
135+
118136 if (pkey -> key_is_private )
119- ret = crypto_akcipher_set_priv_key (tfm ,
120- pkey -> key , pkey -> keylen );
137+ ret = crypto_akcipher_set_priv_key (tfm , key , pkey -> keylen );
121138 else
122- ret = crypto_akcipher_set_pub_key (tfm ,
123- pkey -> key , pkey -> keylen );
139+ ret = crypto_akcipher_set_pub_key (tfm , key , pkey -> keylen );
124140 if (ret < 0 )
125- goto error_free_tfm ;
141+ goto error_free_key ;
126142
127143 len = crypto_akcipher_maxsize (tfm );
128144 info -> key_size = len * 8 ;
@@ -137,6 +153,8 @@ static int software_key_query(const struct kernel_pkey_params *params,
137153 KEYCTL_SUPPORTS_SIGN );
138154 ret = 0 ;
139155
156+ error_free_key :
157+ kfree (key );
140158error_free_tfm :
141159 crypto_free_akcipher (tfm );
142160 pr_devel ("<==%s() = %d\n" , __func__ , ret );
@@ -155,6 +173,7 @@ static int software_key_eds_op(struct kernel_pkey_params *params,
155173 struct crypto_wait cwait ;
156174 struct scatterlist in_sg , out_sg ;
157175 char alg_name [CRYPTO_MAX_ALG_NAME ];
176+ char * key , * ptr ;
158177 int ret ;
159178
160179 pr_devel ("==>%s()\n" , __func__ );
@@ -173,14 +192,23 @@ static int software_key_eds_op(struct kernel_pkey_params *params,
173192 if (!req )
174193 goto error_free_tfm ;
175194
195+ key = kmalloc (pkey -> keylen + sizeof (u32 ) * 2 + pkey -> paramlen ,
196+ GFP_KERNEL );
197+ if (!key )
198+ goto error_free_req ;
199+
200+ memcpy (key , pkey -> key , pkey -> keylen );
201+ ptr = key + pkey -> keylen ;
202+ ptr = pkey_pack_u32 (ptr , pkey -> algo );
203+ ptr = pkey_pack_u32 (ptr , pkey -> paramlen );
204+ memcpy (ptr , pkey -> params , pkey -> paramlen );
205+
176206 if (pkey -> key_is_private )
177- ret = crypto_akcipher_set_priv_key (tfm ,
178- pkey -> key , pkey -> keylen );
207+ ret = crypto_akcipher_set_priv_key (tfm , key , pkey -> keylen );
179208 else
180- ret = crypto_akcipher_set_pub_key (tfm ,
181- pkey -> key , pkey -> keylen );
209+ ret = crypto_akcipher_set_pub_key (tfm , key , pkey -> keylen );
182210 if (ret )
183- goto error_free_req ;
211+ goto error_free_key ;
184212
185213 sg_init_one (& in_sg , in , params -> in_len );
186214 sg_init_one (& out_sg , out , params -> out_len );
@@ -210,6 +238,8 @@ static int software_key_eds_op(struct kernel_pkey_params *params,
210238 if (ret == 0 )
211239 ret = req -> dst_len ;
212240
241+ error_free_key :
242+ kfree (key );
213243error_free_req :
214244 akcipher_request_free (req );
215245error_free_tfm :
@@ -229,6 +259,7 @@ int public_key_verify_signature(const struct public_key *pkey,
229259 struct akcipher_request * req ;
230260 struct scatterlist src_sg [2 ];
231261 char alg_name [CRYPTO_MAX_ALG_NAME ];
262+ char * key , * ptr ;
232263 int ret ;
233264
234265 pr_devel ("==>%s()\n" , __func__ );
@@ -252,14 +283,23 @@ int public_key_verify_signature(const struct public_key *pkey,
252283 if (!req )
253284 goto error_free_tfm ;
254285
286+ key = kmalloc (pkey -> keylen + sizeof (u32 ) * 2 + pkey -> paramlen ,
287+ GFP_KERNEL );
288+ if (!key )
289+ goto error_free_req ;
290+
291+ memcpy (key , pkey -> key , pkey -> keylen );
292+ ptr = key + pkey -> keylen ;
293+ ptr = pkey_pack_u32 (ptr , pkey -> algo );
294+ ptr = pkey_pack_u32 (ptr , pkey -> paramlen );
295+ memcpy (ptr , pkey -> params , pkey -> paramlen );
296+
255297 if (pkey -> key_is_private )
256- ret = crypto_akcipher_set_priv_key (tfm ,
257- pkey -> key , pkey -> keylen );
298+ ret = crypto_akcipher_set_priv_key (tfm , key , pkey -> keylen );
258299 else
259- ret = crypto_akcipher_set_pub_key (tfm ,
260- pkey -> key , pkey -> keylen );
300+ ret = crypto_akcipher_set_pub_key (tfm , key , pkey -> keylen );
261301 if (ret )
262- goto error_free_req ;
302+ goto error_free_key ;
263303
264304 sg_init_table (src_sg , 2 );
265305 sg_set_buf (& src_sg [0 ], sig -> s , sig -> s_size );
@@ -272,6 +312,8 @@ int public_key_verify_signature(const struct public_key *pkey,
272312 crypto_req_done , & cwait );
273313 ret = crypto_wait_req (crypto_akcipher_verify (req ), & cwait );
274314
315+ error_free_key :
316+ kfree (key );
275317error_free_req :
276318 akcipher_request_free (req );
277319error_free_tfm :
0 commit comments