summaryrefslogtreecommitdiffstats
path: root/crypto.4
blob: e907e2f7742bda407ae2bea12b397632e5cd7ec5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
.\" A man page for /dev/crypto(4). -*- nroff -*-
.\"
.\" Copyright (C) 2010 Red Hat, Inc. All rights reserved.
.\"
.\" This copyrighted material is made available to anyone wishing to use,
.\" modify, copy, or redistribute it subject to the terms and conditions of the
.\" GNU General Public License v.2 or (at your option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful, but WITHOUT
.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
.\" more details.
.\"
.\" You should have received a copy of the GNU General Public License along
.\" with this program; if not, write to the Free Software Foundation, Inc.,
.\" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
.\"
.\" Author: Miloslav Trmač <mitr@redhat.com>
.TH CRYPTO 4 2010-08-02 Linux "Linux Programmer's Manual"

.SH NAME
/dev/crypto \- kernel cryptographic module interface

.SH SYNOPSIS

.B #include <ncr.h>
.br
.B int fd = open("/dev/crypto", O_RDWR);
.br
.B int res = ioctl(fd, \fINCRIO...\fP, &\fIdata\fP);

.SH DESCRIPTION
The
.I /dev/crypto
device file provides an
.BR ioctl (2)
interface to the kernel-space crypto implementation.

Each
.BR open (2)
of the
.I /dev/crypto
file establishes a separate namespace within which crypto operations work.
The namespace can be shared across threads and processes
by sharing the open file description.
Last close of the open file description automatically destroys all objects
allocated within the namespace.

All
.BR ioctl (2)s
have the same form:
The user sets up a data structure with input data,
and passes a pointer to the data structure as the third parameter to
.BR ioctl (2).
On success, output data is available in the same structure.

The following operations are defined:

.TP
.B NCRIO_KEY_INIT
Allocate a kernel-space key object.
The parameter is not used on input
(key attributes are set later, when the key material is initialized).
On success, an integer descriptor for the key object
(valid within the current
.I /dev/crypto
namespace)
is stored in the provided area.

There is a per-process and per-user (not per-namespace) limit
on the number key objects that can be allocated.

.TP
.B NCRIO_KEY_DEINIT
Deallocate a kernel-space key object.
The parameter specifies the integer descriptor of the key object.
After all other operations using this key object (if any) terminate,
the key material will be cleared and the object will be freed.
Note that this may happen both before this operation returns,
and after it returns, depending on other references to this key object.

.TP
.B NCRIO_KEY_GENERATE
Clear existing key material in the specified key object,
and generate new key material.

The parameter points to \fBstruct ncr_key_generate_st\fP, which specifies:

.RS
.IP \fBdesc\fP
The key descriptor
.IP \fBparams.algorithm\fP
The crypto algorithm with which the key will be used
.IP \fBparams.keyflags\fP
Key flags, a combination of
.B NCR_KEY_FLAG_EXPORTABLE
(the key material can be exported in plaintext to user space)
and
.B NCR_KEY_FLAG_WRAPPABLE
(the key material can be wrapped and the result made available to user space).
.IP \fBparams.params\fP
Algorithm-specific key parameters:
For symmetric keys, key length in bits.
For RSA keys, the public exponent and modulus length in bits.
For DSA keys,
.I p
and
.I q
length in bits.
For DH keys, the prime and group generator.
.RE

.IP
Currently only symmetric keys can be generated using this operation.

In addition to generating the key material,
the "persistent" key ID is reset to a random value.

.TP
.B NCRIO_KEY_GENERATE_PAIR
Similar to \fBNCRIO_KEY_GENERATE\fP,
except that a pair of public/private keys is generated.

The parameter points to \fBstruct ncr_key_generate_st\fP as specified above,
with the additional member
.B desc2
used to specify the key descriptor for the public key.

The
.B NCR_KEY_FLAG_EXPORTABLE
and
.B NCR_KEY_FLAG_WRAPPABLE
flags are automatically set on the public key.

.TP
.B NCRIO_KEY_DERIVE
Derive a new key using one key and additional data.

The parameter points to \fBstruct ncr_key_derivation_params_st\fP,
which specifies:

.RS
.IP \fBderive\fP
The derivation algorithm.
Currently only
.B NCR_DERIVE_DH
is supported.
.IP \fBnewkey\fP
The descriptor of the resulting key
.IP \fBkeyflags\fP
Flags to use for the resulting key
.IP \fBkey\fP
The source key descriptor
.IP \fBparams\fP
Key type-specific parameters.
For \fBNCR_DERIVE_DH\fP,
.B params.params.dh.pub
and
.B params.params.dh.pub_size
specify the peer's public key.
.RE

.TP
.B NCRIO_KEY_EXPORT

Export key material in the specified key object to user space.
Only keys with the
.B NCR_KEY_FLAG_EXPORTABLE
flag can be exported using this operation.

The parameter points to \fBstruct ncr_key_data_st\fP, which specifies:

.RS
.IP \fBkey\fP
The key descriptor
.IP \fBidata\fP
Destination buffer
.IP \fBidata_size\fP
Buffer size
.RE

.IP
Symmetric keys are written directly into the destination buffer.
Public and private keys are formatted using ASN.1,
except for DH public keys, which are written a raw binary number.

On success, the
.B idata_size
member is set to the size of the exported key.

.TP
.B NCRIO_KEY_IMPORT
Clear existing key material in the specified key object,
and import key material from user space.

The parameter points to \fBstruct ncr_key_data_st\fP, which specifies:

.RS
.IP \fBkey\fP
The key descriptor
.IP \fBidata\fP
Source data
.IP \fBidata_size\fP
Source data size
.IP \fBkey_id\fP
New "persistent" key ID.
.IP \fBkey_id_size\fP
Size of data in \fBkey_id\fP.
.IP \fBtype\fP
Key type, one of \fBNCR_KEY_TYPE_SECRET\fP, \fBNCR_KEY_TYPE_PUBLIC\fP and
\fBNCR_KEY_TYPE_PRIVATE\fP.
.IP \fBalgorithm\fP
The crypto algorithm with which the key will be used
.IP \fBflags\fP
Key flags
.RE

.IP
The data format is the same as in the
.B NCRIO_KEY_EXPORT
operation.

.TP
.B NCRIO_KEY_GET_INFO
Get metadata of an existing key.

The parameter points to \fBstruct ncr_key_info_st\fP,
which specifies \fBkey\fP, the key descriptor.
On success, the following members are set:

.RS
.IP \fBflags\fP
Key flags
.IP \fBtype\fP
Key type
.IP \fBalgorithm\fP
Key algorithm
.RE

.TP
.B NCRIO_KEY_WRAP
Wrap one key using another, and write the result to user space.
Only keys with the
.B NCR_KEY_FLAG_WRAPPABLE
flag can be wrapped using this operation.

The parameter points to \fBstruct ncr_key_wrap_st\fP, which specifies:

.RS
.IP \fBalgorithm\fP
The wrapping algorithm to use, one of
.B NCR_WALG_AES_RFC3394
and \fBNCR_WALG_AES_RFC5649\fP.
.IP \fBkeytowrap\fP
The descriptor of the key to wrap
.IP \fBkey\fP
The descriptor of the key used for wrapping
.IP \fBparams\fP
Key type-specific parameters.
For the currently supported wrapping algorithms,
.B params.params.cipher.iv
and
.B params.params.cipher.iv_size
specify the IV.
.IP \fBio\fP
Destination buffer
.IP \fBio_size\fP
Size of the destination buffer
.RE

.IP
Currently only secret keys can be wrapped,
using one of the above-mentioned AES-based algorithms.

On success, the
.B io_size
member is set to the size of the wrapped key.

.TP
.B NCRIO_KEY_UNWRAP
Unwrap user-space data into a kernel-space key using another key.

The parameter points to \fBstruct ncr_key_wrap_st\fP, which specifies:

.RS
.IP \fBalgorithm\fP
The wrapping algorithm to use.
.IP \fBkeytowrap\fP
The descriptor of the target key object
.IP \fBkey\fP
The descriptor of the key used for wrapping
.IP \fBparams\fP
Key type-specific parameters.
For the currently supported wrapping algorithms,
.B params.params.cipher.iv
and
.B params.params.cipher.iv_size
specify the IV.
.IP \fBio\fP
Pointer to the wrapped key
.IP \fBio_size\fP
Size of the wrapped key
.RE

.IP
The unwrapped key will have the
.B NCR_KEY_FLAG_WRAPPABLE
flag set, and the
.B NCR_KEY_FLAG_EXPORTABLE
flag clear.

.TP
.B NCRIO_KEY_STORAGE_WRAP
Wrap a key object and associated metadata using the system-wide storage master
key,
and write the result to user space.

Only keys with the
.B NCR_KEY_FLAG_WRAPPABLE
flag can be wrapped using this operation.

The parameter points to \fBstruct ncr_key_storage_wrap_st\fP, which specifies:

.RS
.IP \fBkeytowrap\fP
The descriptor of the key to wrap
.IP \fBio\fP
Destination buffer
.IP \fBio_size\fP
Size of the destination buffer
.RE

.IP
On success, the
.B io_size
member is set to the size of the wrapped key.

Both symmetric and asymmetric keys can be wrapped using this operation.
The wrapped data includes the following information in addition to the raw key
material:

.RS
.IP \(bu
Key type
.IP \(bu
Key flags
.IP \(bu
Key algorithm
.IP \(bu
"Persistent" key ID.
.RE

.TP
.B NCRIO_KEY_STORAGE_UNWRAP
Unwrap key and associated metadata created using \fBNCRIO_KEY_STORAGE_WRAP\fP,
and restore the information into a specified key object.

The parameter points to \fBstruct ncr_key_storage_wrap_st\fP, which specifies:

.RS
.IP \fBkeytowrap\fP
The target key descriptor
.IP \fBio\fP
Wrapped data
.IP \fBio_size\fP
Size of the wrapped data
.RE

.IP
See
.B NCRIO_KEY_STORAGE_WRAP
above for the list of attributes that will be restored.

.TP
.B NCRIO_SESSION_INIT
Allocate a session for performing crypto operations.

The parameter points to \fBstruct ncr_session_st\fP, which specifies:

.RS
.IP \fBalgorithm\fP
The crypto algorithm to use.
.IP \fBkey\fP
The key to use for the operation, if required.
.IP \fBparams\fP
Parameters for the operation.
For symmetric ciphers, the IV.
For RSA operations, the format, used hash algorithms and PSS salt length.
for DSA, the signature hash algorithm.
.IP \fBop\fP
The operation to perform, one of \fBNCR_OP_ENCRYPT\fP, \fBNCR_OP_DECRYPT\fP,
\fBNCR_OP_SIGN\fP and \fBNCR_OP_VERIFY\FP.  Use
.B NCR_OP_SIGN
for computing an unkeyed hash as well as keyed hashes and signatures.
.RE

.IP
On success, an integer descriptor for the created session
(valid within the current
.I /dev/crypto
namespace)
is stored into the
.B ses
member.

.TP
.B NCRIO_SESSION_UPDATE
Update an existing crypto session with new data
(for operations, such as hashing, for which data can be supplied in pieces),
or perform a single operation using the session context (for operations, such
as public key encryption, that work on separate units of data).

The parameter points to \fBstruct ncr_session_op_st\fP, which specifies:

.RS
.IP \fBses\fP
The integer descriptor of the session.
.IP \fBtype\fP
Type of the data references used for this operation, either
.B NCR_KEY_DATA
or
.B NCR_DIRECT_DATA.
.IP "\fBdata.udata.input\fP, \fBdata.udata.input_size\fP"
If \fBtype == NCR_DIRECT_DATA\fP, input data for the operation.
.IP \fBdata.kdata.input\fP
If \fBtype == NCR_KEY_DATA\fP, integer key descriptor serving as input for
the operation.
This can be currently used only to compute or verify a signature or hash
of a symmetric key:
the keying material is directly used as input data for the underlying hash.
.IP "\fBdata.udata.output\fP, \fBdata,udata.output_size\fP"
If \fBtype == NCR_DIRECT_DATA\fP, output buffer for the operation.
.IP "\fBdata.kdata.output\fP, \fBdata,kdata.output_size\fP"
If \fBtype == NCR_KEY_DATA\fP, output buffer for the operation.
.RE

.IP
For the
.B NCR_OP_ENCRYPT
and
.B NCR_OP_DECRYPT
operations using symmetric ciphers,
the operation is performed on the input data,
resulting in an output data block of the same size;
for operations using public-key cryptography,
a single operation is performed on the input data,
resulting in output data.
In both cases,
the relevant
.B output_data
member is set to the size of valid output data on success.

For the
.B NCR_OP_SIGN
and
.B NCR_OP_VERIFY
operations,
the input data is supplied to the underlying hash function;
no output data is produced.

.TP
.B NCRIO_SESSION_FINAL
Finalize an existing crypto session and deallocate it.

The parameter points to \fBstruct ncr_session_op_st\fP, as described in the
.B NCRIO_SESSION_UPDATE
section above.
If the parameter specifies valid input data,
it is processed as if using \fBNCRIO_SESSION_UPDATE\fP;
thus, the last update operation can be performed together with the finalization
in one step.

There is no specific finalization operation performed for
.B NCR_OP_ENCRYPT
and \fBNCR_OP_DECRYPT\fP.

For the
.B NCR_OP_SIGN
operation,
the signature is created and written as output data.

For the
.B NCR_OP_VERIFY
operation,
a signature specified as input using the
.I output data
fields is verified;
the result of this operation
(\fBNCR_SUCCESS\fP or \fBNCR_VERIFICATION_FAILED\fP)
will be stored into the
.B err
member.
(Note that the
.BR ioctl (2)
operation will indicate success even if the signature verification fails,
as long all inputs were specified correctly.)

The session will be deallocated even if the
.B NCRIO_SESSION_FINAL
operation reports an error,
as long as valid session descriptor was specified.

.TP
.B NCRIO_SESSION_ONCE
Perform an one-shot crypto operation,
allocating a temporary session,
supplying a single instance of data,
and finalizing the session in one operation.

The parameter points to \fBstruct ncr_session_once_op_st\fP,
which includes arguments for one
.B NCRIO_SESSION_INIT
and one
.B NCRIO_SESSION_FINAL
operation.
The
.B ses
member for the
.B NCRIO_SESSION_FINAL
sub-operation is ignored,
the sub-operation automatically uses the temporary session.

.TP
.B NCRIO_MASTER_KEY_SET
Set the system-wide storage master key.
Only a process with EUID 0 and the
.B CAP_SYS_ADMIN
capability is allowed to perform this operation.
Once a master key is set,
it can be changed only by rebooting the system
and setting a different key.

The parameter points to \fBstruct ncr_master_key_st\fP, which specifies:
.RS
.IP \fBkey\fP
Pointer to the key material in user space.
.IP \fBkey_size\fP
Size of the key material in bytes.
.RE

Currently only an AES key with size 16, 24, or 32 bytes is acceptable.

.SH CONFIGURATION
The
.B NCRIO_KEY_STORAGE_WRAP
and
.B NCRIO_KEY_STORAGE_UNWRAP
.BR ioctl ()s
work only after a storage master key is configured by the system
administrator.
See \fBNCRIO_MASTER_KEY_SET\fP above.

.SH FILES
.I /dev/crypto