@@ -22,6 +22,8 @@ static bool key_revalidate = true;
22
22
module_param (key_revalidate , bool , 0444 );
23
23
MODULE_PARM_DESC (key_revalidate , "Require key validation at init." );
24
24
25
+ static const char zero_key [NVDIMM_PASSPHRASE_LEN ];
26
+
25
27
static void * key_data (struct key * key )
26
28
{
27
29
struct encrypted_key_payload * epayload = dereference_key_locked (key );
@@ -75,6 +77,16 @@ static struct key *nvdimm_request_key(struct nvdimm *nvdimm)
75
77
return key ;
76
78
}
77
79
80
+ static const void * nvdimm_get_key_payload (struct nvdimm * nvdimm ,
81
+ struct key * * key )
82
+ {
83
+ * key = nvdimm_request_key (nvdimm );
84
+ if (!* key )
85
+ return zero_key ;
86
+
87
+ return key_data (* key );
88
+ }
89
+
78
90
static struct key * nvdimm_lookup_user_key (struct nvdimm * nvdimm ,
79
91
key_serial_t id , int subclass )
80
92
{
@@ -105,36 +117,57 @@ static struct key *nvdimm_lookup_user_key(struct nvdimm *nvdimm,
105
117
return key ;
106
118
}
107
119
108
- static struct key * nvdimm_key_revalidate (struct nvdimm * nvdimm )
120
+ static const void * nvdimm_get_user_key_payload (struct nvdimm * nvdimm ,
121
+ key_serial_t id , int subclass , struct key * * key )
122
+ {
123
+ * key = NULL ;
124
+ if (id == 0 ) {
125
+ if (subclass == NVDIMM_BASE_KEY )
126
+ return zero_key ;
127
+ else
128
+ return NULL ;
129
+ }
130
+
131
+ * key = nvdimm_lookup_user_key (nvdimm , id , subclass );
132
+ if (!* key )
133
+ return NULL ;
134
+
135
+ return key_data (* key );
136
+ }
137
+
138
+
139
+ static int nvdimm_key_revalidate (struct nvdimm * nvdimm )
109
140
{
110
141
struct key * key ;
111
142
int rc ;
143
+ const void * data ;
112
144
113
145
if (!nvdimm -> sec .ops -> change_key )
114
- return NULL ;
146
+ return - EOPNOTSUPP ;
115
147
116
- key = nvdimm_request_key (nvdimm );
117
- if (!key )
118
- return NULL ;
148
+ data = nvdimm_get_key_payload (nvdimm , & key );
119
149
120
150
/*
121
151
* Send the same key to the hardware as new and old key to
122
152
* verify that the key is good.
123
153
*/
124
- rc = nvdimm -> sec .ops -> change_key (nvdimm , key_data (key ),
125
- key_data (key ), NVDIMM_USER );
154
+ rc = nvdimm -> sec .ops -> change_key (nvdimm , data , data , NVDIMM_USER );
126
155
if (rc < 0 ) {
127
156
nvdimm_put_key (key );
128
- key = NULL ;
157
+ return rc ;
129
158
}
130
- return key ;
159
+
160
+ nvdimm_put_key (key );
161
+ nvdimm -> sec .state = nvdimm_security_state (nvdimm , NVDIMM_USER );
162
+ return 0 ;
131
163
}
132
164
133
165
static int __nvdimm_security_unlock (struct nvdimm * nvdimm )
134
166
{
135
167
struct device * dev = & nvdimm -> dev ;
136
168
struct nvdimm_bus * nvdimm_bus = walk_to_nvdimm_bus (dev );
137
- struct key * key = NULL ;
169
+ struct key * key ;
170
+ const void * data ;
138
171
int rc ;
139
172
140
173
/* The bus lock should be held at the top level of the call stack */
@@ -160,16 +193,11 @@ static int __nvdimm_security_unlock(struct nvdimm *nvdimm)
160
193
if (!key_revalidate )
161
194
return 0 ;
162
195
163
- key = nvdimm_key_revalidate (nvdimm );
164
- if (!key )
165
- return nvdimm_security_freeze (nvdimm );
196
+ return nvdimm_key_revalidate (nvdimm );
166
197
} else
167
- key = nvdimm_request_key (nvdimm );
198
+ data = nvdimm_get_key_payload (nvdimm , & key );
168
199
169
- if (!key )
170
- return - ENOKEY ;
171
-
172
- rc = nvdimm -> sec .ops -> unlock (nvdimm , key_data (key ));
200
+ rc = nvdimm -> sec .ops -> unlock (nvdimm , data );
173
201
dev_dbg (dev , "key: %d unlock: %s\n" , key_serial (key ),
174
202
rc == 0 ? "success" : "fail" );
175
203
@@ -195,6 +223,7 @@ int nvdimm_security_disable(struct nvdimm *nvdimm, unsigned int keyid)
195
223
struct nvdimm_bus * nvdimm_bus = walk_to_nvdimm_bus (dev );
196
224
struct key * key ;
197
225
int rc ;
226
+ const void * data ;
198
227
199
228
/* The bus lock should be held at the top level of the call stack */
200
229
lockdep_assert_held (& nvdimm_bus -> reconfig_mutex );
@@ -214,11 +243,12 @@ int nvdimm_security_disable(struct nvdimm *nvdimm, unsigned int keyid)
214
243
return - EBUSY ;
215
244
}
216
245
217
- key = nvdimm_lookup_user_key (nvdimm , keyid , NVDIMM_BASE_KEY );
218
- if (!key )
246
+ data = nvdimm_get_user_key_payload (nvdimm , keyid ,
247
+ NVDIMM_BASE_KEY , & key );
248
+ if (!data )
219
249
return - ENOKEY ;
220
250
221
- rc = nvdimm -> sec .ops -> disable (nvdimm , key_data ( key ) );
251
+ rc = nvdimm -> sec .ops -> disable (nvdimm , data );
222
252
dev_dbg (dev , "key: %d disable: %s\n" , key_serial (key ),
223
253
rc == 0 ? "success" : "fail" );
224
254
@@ -235,6 +265,7 @@ int nvdimm_security_update(struct nvdimm *nvdimm, unsigned int keyid,
235
265
struct nvdimm_bus * nvdimm_bus = walk_to_nvdimm_bus (dev );
236
266
struct key * key , * newkey ;
237
267
int rc ;
268
+ const void * data , * newdata ;
238
269
239
270
/* The bus lock should be held at the top level of the call stack */
240
271
lockdep_assert_held (& nvdimm_bus -> reconfig_mutex );
@@ -249,22 +280,19 @@ int nvdimm_security_update(struct nvdimm *nvdimm, unsigned int keyid,
249
280
return - EIO ;
250
281
}
251
282
252
- if (keyid == 0 )
253
- key = NULL ;
254
- else {
255
- key = nvdimm_lookup_user_key (nvdimm , keyid , NVDIMM_BASE_KEY );
256
- if (!key )
257
- return - ENOKEY ;
258
- }
283
+ data = nvdimm_get_user_key_payload (nvdimm , keyid ,
284
+ NVDIMM_BASE_KEY , & key );
285
+ if (!data )
286
+ return - ENOKEY ;
259
287
260
- newkey = nvdimm_lookup_user_key (nvdimm , new_keyid , NVDIMM_NEW_KEY );
261
- if (!newkey ) {
288
+ newdata = nvdimm_get_user_key_payload (nvdimm , new_keyid ,
289
+ NVDIMM_NEW_KEY , & newkey );
290
+ if (!newdata ) {
262
291
nvdimm_put_key (key );
263
292
return - ENOKEY ;
264
293
}
265
294
266
- rc = nvdimm -> sec .ops -> change_key (nvdimm , key ? key_data (key ) : NULL ,
267
- key_data (newkey ), pass_type );
295
+ rc = nvdimm -> sec .ops -> change_key (nvdimm , data , newdata , pass_type );
268
296
dev_dbg (dev , "key: %d %d update%s: %s\n" ,
269
297
key_serial (key ), key_serial (newkey ),
270
298
pass_type == NVDIMM_MASTER ? "(master)" : "(user)" ,
@@ -286,8 +314,9 @@ int nvdimm_security_erase(struct nvdimm *nvdimm, unsigned int keyid,
286
314
{
287
315
struct device * dev = & nvdimm -> dev ;
288
316
struct nvdimm_bus * nvdimm_bus = walk_to_nvdimm_bus (dev );
289
- struct key * key ;
317
+ struct key * key = NULL ;
290
318
int rc ;
319
+ const void * data ;
291
320
292
321
/* The bus lock should be held at the top level of the call stack */
293
322
lockdep_assert_held (& nvdimm_bus -> reconfig_mutex );
@@ -319,11 +348,12 @@ int nvdimm_security_erase(struct nvdimm *nvdimm, unsigned int keyid,
319
348
return - EOPNOTSUPP ;
320
349
}
321
350
322
- key = nvdimm_lookup_user_key (nvdimm , keyid , NVDIMM_BASE_KEY );
323
- if (!key )
351
+ data = nvdimm_get_user_key_payload (nvdimm , keyid ,
352
+ NVDIMM_BASE_KEY , & key );
353
+ if (!data )
324
354
return - ENOKEY ;
325
355
326
- rc = nvdimm -> sec .ops -> erase (nvdimm , key_data ( key ) , pass_type );
356
+ rc = nvdimm -> sec .ops -> erase (nvdimm , data , pass_type );
327
357
dev_dbg (dev , "key: %d erase%s: %s\n" , key_serial (key ),
328
358
pass_type == NVDIMM_MASTER ? "(master)" : "(user)" ,
329
359
rc == 0 ? "success" : "fail" );
@@ -337,8 +367,9 @@ int nvdimm_security_overwrite(struct nvdimm *nvdimm, unsigned int keyid)
337
367
{
338
368
struct device * dev = & nvdimm -> dev ;
339
369
struct nvdimm_bus * nvdimm_bus = walk_to_nvdimm_bus (dev );
340
- struct key * key ;
370
+ struct key * key = NULL ;
341
371
int rc ;
372
+ const void * data ;
342
373
343
374
/* The bus lock should be held at the top level of the call stack */
344
375
lockdep_assert_held (& nvdimm_bus -> reconfig_mutex );
@@ -368,15 +399,12 @@ int nvdimm_security_overwrite(struct nvdimm *nvdimm, unsigned int keyid)
368
399
return - EBUSY ;
369
400
}
370
401
371
- if (keyid == 0 )
372
- key = NULL ;
373
- else {
374
- key = nvdimm_lookup_user_key (nvdimm , keyid , NVDIMM_BASE_KEY );
375
- if (!key )
376
- return - ENOKEY ;
377
- }
402
+ data = nvdimm_get_user_key_payload (nvdimm , keyid ,
403
+ NVDIMM_BASE_KEY , & key );
404
+ if (!data )
405
+ return - ENOKEY ;
378
406
379
- rc = nvdimm -> sec .ops -> overwrite (nvdimm , key ? key_data ( key ) : NULL );
407
+ rc = nvdimm -> sec .ops -> overwrite (nvdimm , data );
380
408
dev_dbg (dev , "key: %d overwrite submission: %s\n" , key_serial (key ),
381
409
rc == 0 ? "success" : "fail" );
382
410
0 commit comments