1818#include <linux/slab.h>
1919#include <linux/seq_file.h>
2020#include <keys/asymmetric-subtype.h>
21- #include " public_key.h"
21+ #include <crypto/ public_key.h>
2222
2323MODULE_LICENSE ("GPL" );
2424
2525const char * const pkey_algo_name [PKEY_ALGO__LAST ] = {
26- [PKEY_ALGO_DSA ] = "DSA " ,
27- [PKEY_ALGO_RSA ] = "RSA " ,
26+ [PKEY_ALGO_DSA ] = "dsa " ,
27+ [PKEY_ALGO_RSA ] = "rsa " ,
2828};
2929EXPORT_SYMBOL_GPL (pkey_algo_name );
3030
31- const struct public_key_algorithm * pkey_algo [PKEY_ALGO__LAST ] = {
32- #if defined(CONFIG_PUBLIC_KEY_ALGO_RSA ) || \
33- defined(CONFIG_PUBLIC_KEY_ALGO_RSA_MODULE )
34- [PKEY_ALGO_RSA ] = & RSA_public_key_algorithm ,
35- #endif
36- };
37- EXPORT_SYMBOL_GPL (pkey_algo );
38-
3931const char * const pkey_id_type_name [PKEY_ID_TYPE__LAST ] = {
4032 [PKEY_ID_PGP ] = "PGP" ,
4133 [PKEY_ID_X509 ] = "X509" ,
4234 [PKEY_ID_PKCS7 ] = "PKCS#7" ,
4335};
4436EXPORT_SYMBOL_GPL (pkey_id_type_name );
4537
38+ static int (* alg_verify [PKEY_ALGO__LAST ])(const struct public_key * pkey ,
39+ const struct public_key_signature * sig ) = {
40+ NULL ,
41+ rsa_verify_signature
42+ };
43+
4644/*
4745 * Provide a part of a description of the key for /proc/keys.
4846 */
@@ -53,7 +51,8 @@ static void public_key_describe(const struct key *asymmetric_key,
5351
5452 if (key )
5553 seq_printf (m , "%s.%s" ,
56- pkey_id_type_name [key -> id_type ], key -> algo -> name );
54+ pkey_id_type_name [key -> id_type ],
55+ pkey_algo_name [key -> pkey_algo ]);
5756}
5857
5958/*
@@ -62,50 +61,31 @@ static void public_key_describe(const struct key *asymmetric_key,
6261void public_key_destroy (void * payload )
6362{
6463 struct public_key * key = payload ;
65- int i ;
6664
67- if (key ) {
68- for (i = 0 ; i < ARRAY_SIZE (key -> mpi ); i ++ )
69- mpi_free (key -> mpi [i ]);
70- kfree (key );
71- }
65+ if (key )
66+ kfree (key -> key );
67+ kfree (key );
7268}
7369EXPORT_SYMBOL_GPL (public_key_destroy );
7470
7571/*
7672 * Verify a signature using a public key.
7773 */
78- int public_key_verify_signature (const struct public_key * pk ,
74+ int public_key_verify_signature (const struct public_key * pkey ,
7975 const struct public_key_signature * sig )
8076{
81- const struct public_key_algorithm * algo ;
82-
83- BUG_ON (!pk );
84- BUG_ON (!pk -> mpi [0 ]);
85- BUG_ON (!pk -> mpi [1 ]);
77+ BUG_ON (!pkey );
8678 BUG_ON (!sig );
8779 BUG_ON (!sig -> digest );
88- BUG_ON (!sig -> mpi [0 ]);
89-
90- algo = pk -> algo ;
91- if (!algo ) {
92- if (pk -> pkey_algo >= PKEY_ALGO__LAST )
93- return - ENOPKG ;
94- algo = pkey_algo [pk -> pkey_algo ];
95- if (!algo )
96- return - ENOPKG ;
97- }
80+ BUG_ON (!sig -> s );
9881
99- if (! algo -> verify_signature )
100- return - ENOTSUPP ;
82+ if (pkey -> pkey_algo >= PKEY_ALGO__LAST )
83+ return - ENOPKG ;
10184
102- if (sig -> nr_mpi != algo -> n_sig_mpi ) {
103- pr_debug ("Signature has %u MPI not %u\n" ,
104- sig -> nr_mpi , algo -> n_sig_mpi );
105- return - EINVAL ;
106- }
85+ if (!alg_verify [pkey -> pkey_algo ])
86+ return - ENOPKG ;
10787
108- return algo -> verify_signature ( pk , sig );
88+ return alg_verify [ pkey -> pkey_algo ]( pkey , sig );
10989}
11090EXPORT_SYMBOL_GPL (public_key_verify_signature );
11191
0 commit comments