gssapi_mechanism_base.hpp 4.59 KB
Newer Older
1
/*
2
    Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3

4
    This file is part of libzmq, the ZeroMQ core engine in C++.
5

6 7 8
    libzmq is free software; you can redistribute it and/or modify it under
    the terms of the GNU Lesser General Public License (LGPL) as published
    by the Free Software Foundation; either version 3 of the License, or
9 10
    (at your option) any later version.

11 12 13 14 15 16 17 18 19 20 21 22 23 24
    As a special exception, the Contributors give you permission to link
    this library with independent modules to produce an executable,
    regardless of the license terms of these independent modules, and to
    copy and distribute the resulting executable under terms of your choice,
    provided that you also meet, for each linked independent module, the
    terms and conditions of the license of that module. An independent
    module is a module which is not derived from or based on this library.
    If you modify this library, you must extend this exception to your
    version of the library.

    libzmq 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 Lesser General Public
    License for more details.
25 26 27 28 29 30 31 32

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef __ZMQ_GSSAPI_MECHANISM_BASE_HPP_INCLUDED__
#define __ZMQ_GSSAPI_MECHANISM_BASE_HPP_INCLUDED__

Chris Laws's avatar
Chris Laws committed
33 34
#ifdef HAVE_LIBGSSAPI_KRB5

35
#if HAVE_GSSAPI_GSSAPI_GENERIC_H
36
#include <gssapi/gssapi_generic.h>
37
#endif
38
#include <gssapi/gssapi_krb5.h>
39

40
#include "mechanism_base.hpp"
41
#include "options.hpp"
42

43 44 45 46 47
namespace zmq
{

    class msg_t;

48
    /// Commonalities between clients and servers are captured here.
Mike Gatny's avatar
Mike Gatny committed
49 50 51
    /// For example, clients and servers both need to produce and
    /// process context-level GSSAPI tokens (via INITIATE commands)
    /// and per-message GSSAPI tokens (via MESSAGE commands).
52
    class gssapi_mechanism_base_t : public virtual mechanism_base_t
53
    {
54 55 56
      public:
        gssapi_mechanism_base_t (session_base_t *session_,
                                 const options_t &options_);
57 58
        virtual ~gssapi_mechanism_base_t () = 0;

59
      protected:
Mike Gatny's avatar
Mike Gatny committed
60 61
        //  Produce a context-level GSSAPI token (INITIATE command)
        //  during security context initialization.
62
        int produce_initiate (msg_t *msg_, void *data_, size_t data_len_);
Chris Laws's avatar
Chris Laws committed
63

Mike Gatny's avatar
Mike Gatny committed
64 65
        //  Process a context-level GSSAPI token (INITIATE command)
        //  during security context initialization.
66
        int process_initiate (msg_t *msg_, void **data_, size_t &data_len_);
67 68

        // Produce a metadata ready msg (READY) to conclude handshake
69
        int produce_ready (msg_t *msg_);
70 71 72

        // Process a metadata ready msg (READY)
        int process_ready (msg_t *msg_);
Chris Laws's avatar
Chris Laws committed
73

Mike Gatny's avatar
Mike Gatny committed
74 75
        //  Encode a per-message GSSAPI token (MESSAGE command) using
        //  the established security context.
76
        int encode_message (msg_t *msg_);
Chris Laws's avatar
Chris Laws committed
77

Mike Gatny's avatar
Mike Gatny committed
78 79
        //  Decode a per-message GSSAPI token (MESSAGE command) using
        //  the  established security context.
80
        int decode_message (msg_t *msg_);
Chris Laws's avatar
Chris Laws committed
81

82 83 84
	//  Convert ZMQ_GSSAPI_NT values to GSSAPI name_type
	static const gss_OID convert_nametype (int zmq_name_type_);

Mike Gatny's avatar
Mike Gatny committed
85 86
        //  Acquire security context credentials from the
        //  underlying mechanism.
Chris Busbey's avatar
Chris Busbey committed
87
        static int acquire_credentials (char * principal_name_,
88
                                        gss_cred_id_t * cred_,
89
					gss_OID name_type_);
90 91

    protected:
Mike Gatny's avatar
Mike Gatny committed
92
        //  Opaque GSSAPI token for outgoing data
93
        gss_buffer_desc send_tok;
Chris Laws's avatar
Chris Laws committed
94

Mike Gatny's avatar
Mike Gatny committed
95
        //  Opaque GSSAPI token for incoming data
96
        gss_buffer_desc recv_tok;
Chris Laws's avatar
Chris Laws committed
97

Chris Busbey's avatar
Chris Busbey committed
98
        //  Opaque GSSAPI representation of principal
99
        gss_name_t target_name;
Chris Laws's avatar
Chris Laws committed
100

101
        //  Human-readable principal name
Chris Busbey's avatar
Chris Busbey committed
102
        char * principal_name;
103

Mike Gatny's avatar
Mike Gatny committed
104
        //  Status code returned by GSSAPI functions
105
        OM_uint32 maj_stat;
106

Mike Gatny's avatar
Mike Gatny committed
107
        //  Status code returned by the underlying mechanism
108
        OM_uint32 min_stat;
109

Mike Gatny's avatar
Mike Gatny committed
110 111
        //  Status code returned by the underlying mechanism
        //  during context initialization
112
        OM_uint32 init_sec_min_stat;
113

Mike Gatny's avatar
Mike Gatny committed
114
        //  Flags returned by GSSAPI (ignored)
115
        OM_uint32 ret_flags;
Chris Laws's avatar
Chris Laws committed
116

Mike Gatny's avatar
Mike Gatny committed
117
        //  Flags returned by GSSAPI (ignored)
118
        OM_uint32 gss_flags;
Chris Laws's avatar
Chris Laws committed
119

Mike Gatny's avatar
Mike Gatny committed
120
        //  Credentials used to establish security context
121
        gss_cred_id_t cred;
122

Mike Gatny's avatar
Mike Gatny committed
123
        //  Opaque GSSAPI representation of the security context
124
        gss_ctx_id_t context;
125 126 127

        //  If true, use gss to encrypt messages. If false, only utilize gss for auth.
        bool do_encryption;
128 129 130
    };

}
Chris Laws's avatar
Chris Laws committed
131

132
#endif
133

Chris Laws's avatar
Chris Laws committed
134
#endif