summaryrefslogtreecommitdiffstats
path: root/src/util/gss-kernel-lib/README
blob: b2adf2b4f030f881ff7433af9bf69089ca9f1ddd (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
This directory is intended to help integrators of MIT krb5 code into
the kernel by:

1. Identifying the GSSAPI source files necessary for wrapping and
unwrapping messages.

2. Providing a test framework to ensuring that these source files do
not grow addtional dependencies without alerting the developers.

3. Providing code for importing a Lucid sec context.

Nothing is built in this directory during "make all".  The following
happens durng "make check":

1. Sources and headers are copied here from other parts of the tree.

2. Sources are compiled and built, together with some additional code
in kernel_gss.c, into a static library named libkgss.a.  Sources are
built with -DKRB5_KERNEL, which is used (very sparingly) to eliminate
dependencies such as the code to save error messages.

3. A test program is built in two parts: t_kgss_user is built against
the regular ("user-space") GSSAPI libraries, and t_kgss_kernel is
built against libkgss.a.

4. A Python test executes t_kgss_user, which runs t_kgss_kernel in a
child process and exercises the functionality of libkgss.a.

Limitations
-----------

Lucid contexts are used to transport the acceptor context from
user-space to kernel-space, because the code overhead of normal
export/import is large (it requires the libkrb5 serialization
framework).  Kernel integrators should be aware of two issues with
Lucid contexts:

1. They are not a flat data blob.  It is up to the user/kernelspace
interface to define a format for transporting the lucid context
structure.

2. Lucid contexts do not convey the do-replay or do-sequence flags
from the original context.  RPC security does not need replay or
sequence detection, so the krb5_gss_import_lucid_sec_context
implementation in kernel_gss.c simply assumes the flags should be
turned off.  If the kernel GSS code is being used for a protocol which
does need replay or sequence detection, those flags should be
determined separately and set in the krb5 GSS context.

Crypto library
--------------

libkgss.a does not include crypto code.  Almost all of the crypto
library is required for a kernel integration, so it would not be
productive to duplicate almost all of the crypto build infrastructure
to demonstrate the kernel subset.

A kernel integrator will almost certainly want to use the kernel's
native PRNG instead of the default lib/crypto/krb/prng_fortuna.c, and
may also wish to write a back end module implementing standard crypto
primitives in terms of the kernel's crypto primitives, instead of
using lib/crypto/builtin.

A few pieces of crypto functionality can be omitted from a kernel
subset.  String-to-key is not needed, and consequently neither is
PBKDF2.  PRF is not needed, unless the integrator is adding
krb5_gss_pseudo_random to the subset.  The enctype utility APIs are
not needed.  DES and DES3 keys are only used via raw enctypes, so the
functions in enc_old.c won't be reached.  Because of the way the
crypto library uses vtables internally, removing the unreached code is
not simply a matter of selecting source files, and it may be simpler
to just leave the small amount of unreached code in.

A complete inventory of crypto APIs used by the kernel subset can be
made with:

    nm libkgss.a | awk '/U .*_[ck]_/ {print $2}' | sort -u

Currently, that list is:

    krb5_c_block_size
    krb5_c_checksum_length
    krb5_c_crypto_length
    krb5_c_make_checksum
    krb5_c_padding_length
    krb5_c_random_make_octets
    krb5int_c_free_keyblock
    krb5int_c_mandatory_cksumtype
    krb5_k_create_key
    krb5_k_decrypt
    krb5_k_decrypt_iov
    krb5_k_encrypt
    krb5_k_encrypt_iov
    krb5_k_free_key
    krb5_k_key_keyblock
    krb5_k_make_checksum
    krb5_k_make_checksum_iov
    krb5_k_verify_checksum
    krb5_k_verify_checksum_iov

Debugging test failures
-----------------------

If an error occurs in t_kgss_user, it can be debugged in the same way
as any program running under the Python test framework.  Start by
re-running the Python script with the -v flag, then add a --debug
option for the failing command, then set breakpoints or step through
the process execution as necessary.

If an error occurs in t_kgss_kernel, it is harder to debug, since
t_kgss_user runs it as a subprocess.  On Linux with gdb, it is
possible to interactively debug t_kgss_kernel by starting an
interactive gdb session for t_kgss_user and doing:

    set follow-fork-mode child
    break main
    run
    cont

You should get a breakpoint in the main() of t_kgss_kernel and should
be able to set breakpoints from there.