1616
1717#define DH_KPP_SECRET_MIN_SIZE (sizeof(struct kpp_secret) + 4 * sizeof(int))
1818
19- static inline u8 * dh_pack_data (void * dst , const void * src , size_t size )
19+ static inline u8 * dh_pack_data (u8 * dst , u8 * end , const void * src , size_t size )
2020{
21+ if (!dst || size > end - dst )
22+ return NULL ;
2123 memcpy (dst , src , size );
2224 return dst + size ;
2325}
@@ -42,27 +44,27 @@ EXPORT_SYMBOL_GPL(crypto_dh_key_len);
4244int crypto_dh_encode_key (char * buf , unsigned int len , const struct dh * params )
4345{
4446 u8 * ptr = buf ;
47+ u8 * const end = ptr + len ;
4548 struct kpp_secret secret = {
4649 .type = CRYPTO_KPP_SECRET_TYPE_DH ,
4750 .len = len
4851 };
4952
50- if (unlikely (!buf ))
53+ if (unlikely (!len ))
5154 return - EINVAL ;
5255
53- if (len != crypto_dh_key_len (params ))
56+ ptr = dh_pack_data (ptr , end , & secret , sizeof (secret ));
57+ ptr = dh_pack_data (ptr , end , & params -> key_size ,
58+ sizeof (params -> key_size ));
59+ ptr = dh_pack_data (ptr , end , & params -> p_size , sizeof (params -> p_size ));
60+ ptr = dh_pack_data (ptr , end , & params -> q_size , sizeof (params -> q_size ));
61+ ptr = dh_pack_data (ptr , end , & params -> g_size , sizeof (params -> g_size ));
62+ ptr = dh_pack_data (ptr , end , params -> key , params -> key_size );
63+ ptr = dh_pack_data (ptr , end , params -> p , params -> p_size );
64+ ptr = dh_pack_data (ptr , end , params -> q , params -> q_size );
65+ ptr = dh_pack_data (ptr , end , params -> g , params -> g_size );
66+ if (ptr != end )
5467 return - EINVAL ;
55-
56- ptr = dh_pack_data (ptr , & secret , sizeof (secret ));
57- ptr = dh_pack_data (ptr , & params -> key_size , sizeof (params -> key_size ));
58- ptr = dh_pack_data (ptr , & params -> p_size , sizeof (params -> p_size ));
59- ptr = dh_pack_data (ptr , & params -> q_size , sizeof (params -> q_size ));
60- ptr = dh_pack_data (ptr , & params -> g_size , sizeof (params -> g_size ));
61- ptr = dh_pack_data (ptr , params -> key , params -> key_size );
62- ptr = dh_pack_data (ptr , params -> p , params -> p_size );
63- ptr = dh_pack_data (ptr , params -> q , params -> q_size );
64- dh_pack_data (ptr , params -> g , params -> g_size );
65-
6668 return 0 ;
6769}
6870EXPORT_SYMBOL_GPL (crypto_dh_encode_key );
0 commit comments