25
25
static int pkcs7_digest (struct pkcs7_message * pkcs7 ,
26
26
struct pkcs7_signed_info * sinfo )
27
27
{
28
+ struct public_key_signature * sig = sinfo -> sig ;
28
29
struct crypto_shash * tfm ;
29
30
struct shash_desc * desc ;
30
- size_t digest_size , desc_size ;
31
- void * digest ;
31
+ size_t desc_size ;
32
32
int ret ;
33
33
34
- kenter (",%u,%s" , sinfo -> index , sinfo -> sig . hash_algo );
34
+ kenter (",%u,%s" , sinfo -> index , sinfo -> sig -> hash_algo );
35
35
36
- if (!sinfo -> sig . hash_algo )
36
+ if (!sinfo -> sig -> hash_algo )
37
37
return - ENOPKG ;
38
38
39
39
/* Allocate the hashing algorithm we're going to need and find out how
40
40
* big the hash operational data will be.
41
41
*/
42
- tfm = crypto_alloc_shash (sinfo -> sig . hash_algo , 0 , 0 );
42
+ tfm = crypto_alloc_shash (sinfo -> sig -> hash_algo , 0 , 0 );
43
43
if (IS_ERR (tfm ))
44
44
return (PTR_ERR (tfm ) == - ENOENT ) ? - ENOPKG : PTR_ERR (tfm );
45
45
46
46
desc_size = crypto_shash_descsize (tfm ) + sizeof (* desc );
47
- sinfo -> sig . digest_size = digest_size = crypto_shash_digestsize (tfm );
47
+ sig -> digest_size = crypto_shash_digestsize (tfm );
48
48
49
49
ret = - ENOMEM ;
50
- digest = kzalloc (ALIGN (digest_size , __alignof__(* desc )) + desc_size ,
51
- GFP_KERNEL );
52
- if (!digest )
50
+ sig -> digest = kmalloc (sig -> digest_size , GFP_KERNEL );
51
+ if (!sig -> digest )
52
+ goto error_no_desc ;
53
+
54
+ desc = kzalloc (desc_size , GFP_KERNEL );
55
+ if (!desc )
53
56
goto error_no_desc ;
54
57
55
- desc = PTR_ALIGN (digest + digest_size , __alignof__(* desc ));
56
58
desc -> tfm = tfm ;
57
59
desc -> flags = CRYPTO_TFM_REQ_MAY_SLEEP ;
58
60
59
61
/* Digest the message [RFC2315 9.3] */
60
62
ret = crypto_shash_init (desc );
61
63
if (ret < 0 )
62
64
goto error ;
63
- ret = crypto_shash_finup (desc , pkcs7 -> data , pkcs7 -> data_len , digest );
65
+ ret = crypto_shash_finup (desc , pkcs7 -> data , pkcs7 -> data_len ,
66
+ sig -> digest );
64
67
if (ret < 0 )
65
68
goto error ;
66
- pr_devel ("MsgDigest = [%*ph]\n" , 8 , digest );
69
+ pr_devel ("MsgDigest = [%*ph]\n" , 8 , sig -> digest );
67
70
68
71
/* However, if there are authenticated attributes, there must be a
69
72
* message digest attribute amongst them which corresponds to the
@@ -78,14 +81,15 @@ static int pkcs7_digest(struct pkcs7_message *pkcs7,
78
81
goto error ;
79
82
}
80
83
81
- if (sinfo -> msgdigest_len != sinfo -> sig . digest_size ) {
84
+ if (sinfo -> msgdigest_len != sig -> digest_size ) {
82
85
pr_debug ("Sig %u: Invalid digest size (%u)\n" ,
83
86
sinfo -> index , sinfo -> msgdigest_len );
84
87
ret = - EBADMSG ;
85
88
goto error ;
86
89
}
87
90
88
- if (memcmp (digest , sinfo -> msgdigest , sinfo -> msgdigest_len ) != 0 ) {
91
+ if (memcmp (sig -> digest , sinfo -> msgdigest ,
92
+ sinfo -> msgdigest_len ) != 0 ) {
89
93
pr_debug ("Sig %u: Message digest doesn't match\n" ,
90
94
sinfo -> index );
91
95
ret = - EKEYREJECTED ;
@@ -97,7 +101,7 @@ static int pkcs7_digest(struct pkcs7_message *pkcs7,
97
101
* convert the attributes from a CONT.0 into a SET before we
98
102
* hash it.
99
103
*/
100
- memset (digest , 0 , sinfo -> sig . digest_size );
104
+ memset (sig -> digest , 0 , sig -> digest_size );
101
105
102
106
ret = crypto_shash_init (desc );
103
107
if (ret < 0 )
@@ -107,17 +111,14 @@ static int pkcs7_digest(struct pkcs7_message *pkcs7,
107
111
if (ret < 0 )
108
112
goto error ;
109
113
ret = crypto_shash_finup (desc , sinfo -> authattrs ,
110
- sinfo -> authattrs_len , digest );
114
+ sinfo -> authattrs_len , sig -> digest );
111
115
if (ret < 0 )
112
116
goto error ;
113
- pr_devel ("AADigest = [%*ph]\n" , 8 , digest );
117
+ pr_devel ("AADigest = [%*ph]\n" , 8 , sig -> digest );
114
118
}
115
119
116
- sinfo -> sig .digest = digest ;
117
- digest = NULL ;
118
-
119
120
error :
120
- kfree (digest );
121
+ kfree (desc );
121
122
error_no_desc :
122
123
crypto_free_shash (tfm );
123
124
kleave (" = %d" , ret );
@@ -144,12 +145,12 @@ static int pkcs7_find_key(struct pkcs7_message *pkcs7,
144
145
* PKCS#7 message - but I can't be 100% sure of that. It's
145
146
* possible this will need element-by-element comparison.
146
147
*/
147
- if (!asymmetric_key_id_same (x509 -> id , sinfo -> signing_cert_id ))
148
+ if (!asymmetric_key_id_same (x509 -> id , sinfo -> sig -> auth_ids [ 0 ] ))
148
149
continue ;
149
150
pr_devel ("Sig %u: Found cert serial match X.509[%u]\n" ,
150
151
sinfo -> index , certix );
151
152
152
- if (x509 -> pub -> pkey_algo != sinfo -> sig . pkey_algo ) {
153
+ if (x509 -> pub -> pkey_algo != sinfo -> sig -> pkey_algo ) {
153
154
pr_warn ("Sig %u: X.509 algo and PKCS#7 sig algo don't match\n" ,
154
155
sinfo -> index );
155
156
continue ;
@@ -164,7 +165,7 @@ static int pkcs7_find_key(struct pkcs7_message *pkcs7,
164
165
*/
165
166
pr_debug ("Sig %u: Issuing X.509 cert not found (#%*phN)\n" ,
166
167
sinfo -> index ,
167
- sinfo -> signing_cert_id -> len , sinfo -> signing_cert_id -> data );
168
+ sinfo -> sig -> auth_ids [ 0 ] -> len , sinfo -> sig -> auth_ids [ 0 ] -> data );
168
169
return 0 ;
169
170
}
170
171
@@ -334,7 +335,7 @@ static int pkcs7_verify_one(struct pkcs7_message *pkcs7,
334
335
}
335
336
336
337
/* Verify the PKCS#7 binary against the key */
337
- ret = public_key_verify_signature (sinfo -> signer -> pub , & sinfo -> sig );
338
+ ret = public_key_verify_signature (sinfo -> signer -> pub , sinfo -> sig );
338
339
if (ret < 0 )
339
340
return ret ;
340
341
0 commit comments