Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

185 строки
6.3 KiB
C

/* gsasl-mech.h --- Header file for mechanism handling in GNU SASL Library.
* Copyright (C) 2002-2022 Simon Josefsson
*
* This file is part of GNU SASL Library.
*
* GNU SASL Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* GNU SASL Library 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.
*
* You should have received a copy of the GNU Lesser General Public
* License License along with GNU SASL Library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef GSASL_MECH_H
# define GSASL_MECH_H
/**
* SECTION:gsasl-mech
* @title: gsasl-mech.h
* @short_description: register new application-defined mechanism
*
* The builtin mechanisms should suffice for most applications.
* Applications can register a new mechanism in the library using
* application-supplied functions. The mechanism will operate as the
* builtin mechanisms, and the supplied functions will be invoked when
* necessary. The application uses the normal logic, e.g., calls
* gsasl_client_start() followed by a sequence of calls to
* gsasl_step() and finally gsasl_finish().
*/
/**
* Gsasl_init_function:
* @ctx: a %Gsasl libgsasl handle.
*
* The implementation of this function pointer should fail if the
* mechanism for some reason is not available for further use.
*
* Return value: Returns %GSASL_OK iff successful.
**/
typedef int (*Gsasl_init_function) (Gsasl * ctx);
/**
* Gsasl_done_function:
* @ctx: a %Gsasl libgsasl handle.
*
* The implementation of this function pointer deallocate all
* resources associated with the mechanism.
**/
typedef void (*Gsasl_done_function) (Gsasl * ctx);
/**
* Gsasl_start_function:
* @sctx: a %Gsasl_session session handle.
* @mech_data: pointer to void* with mechanism-specific data.
*
* The implementation of this function should start a new
* authentication process.
*
* Return value: Returns %GSASL_OK iff successful.
**/
typedef int (*Gsasl_start_function) (Gsasl_session * sctx, void **mech_data);
/**
* Gsasl_step_function:
* @sctx: a %Gsasl_session session handle.
* @mech_data: pointer to void* with mechanism-specific data.
* @input: input byte array.
* @input_len: size of input byte array.
* @output: newly allocated output byte array.
* @output_len: pointer to output variable with size of output byte array.
*
* The implementation of this function should perform one step of the
* authentication process.
*
* This reads data from the other end (from @input and @input_len),
* processes it (potentially invoking callbacks to the application),
* and writes data to server (into newly allocated variable @output
* and @output_len that indicate the length of @output).
*
* The contents of the @output buffer is unspecified if this functions
* returns anything other than %GSASL_OK or %GSASL_NEEDS_MORE. If
* this function return %GSASL_OK or %GSASL_NEEDS_MORE, however, the
* @output buffer is allocated by this function, and it is the
* responsibility of caller to deallocate it by calling
* gsasl_free(@output).
*
* Return value: Returns %GSASL_OK if authenticated terminated
* successfully, %GSASL_NEEDS_MORE if more data is needed, or error
* code.
**/
typedef int (*Gsasl_step_function) (Gsasl_session * sctx, void *mech_data,
const char *input, size_t input_len,
char **output, size_t *output_len);
/**
* Gsasl_finish_function:
* @sctx: a %Gsasl_session session handle.
* @mech_data: pointer to void* with mechanism-specific data.
*
* The implementation of this function should release all resources
* associated with the particular authentication process.
**/
typedef void (*Gsasl_finish_function) (Gsasl_session * sctx, void *mech_data);
/**
* Gsasl_code_function:
* @sctx: a %Gsasl_session session handle.
* @mech_data: pointer to void* with mechanism-specific data.
* @input: input byte array.
* @input_len: size of input byte array.
* @output: newly allocated output byte array.
* @output_len: pointer to output variable with size of output byte array.
*
* The implementation of this function should perform data encoding or
* decoding for the mechanism, after authentication has completed.
* This might mean that data is integrity or privacy protected.
*
* The @output buffer is allocated by this function, and it is the
* responsibility of caller to deallocate it by calling
* gsasl_free(@output).
*
* Return value: Returns %GSASL_OK if encoding was successful,
* otherwise an error code.
**/
typedef int (*Gsasl_code_function) (Gsasl_session * sctx, void *mech_data,
const char *input, size_t input_len,
char **output, size_t *output_len);
/**
* Gsasl_mechanism_functions:
* @init: a Gsasl_init_function().
* @done: a Gsasl_done_function().
* @start: a Gsasl_start_function().
* @step: a Gsasl_step_function().
* @finish: a Gsasl_finish_function().
* @encode: a Gsasl_code_function().
* @decode: a Gsasl_code_function().
*
* Holds all function pointers to implement a mechanism, in either
* client or server mode.
*/
struct Gsasl_mechanism_functions
{
Gsasl_init_function init;
Gsasl_done_function done;
Gsasl_start_function start;
Gsasl_step_function step;
Gsasl_finish_function finish;
Gsasl_code_function encode;
Gsasl_code_function decode;
};
typedef struct Gsasl_mechanism_functions Gsasl_mechanism_functions;
/**
* Gsasl_mechanism:
* @name: string holding name of mechanism, e.g., "PLAIN".
* @client: client-side #Gsasl_mechanism_functions structure.
* @server: server-side #Gsasl_mechanism_functions structure.
*
* Holds all implementation details about a mechanism.
*/
struct Gsasl_mechanism
{
const char *name;
struct Gsasl_mechanism_functions client;
struct Gsasl_mechanism_functions server;
};
typedef struct Gsasl_mechanism Gsasl_mechanism;
/* Register new mechanism: register.c. */
extern _GSASL_API int gsasl_register (Gsasl * ctx,
const Gsasl_mechanism * mech);
#endif /* GSASL_MECH_H */