#define KRB_KEYTYPE(key) ((key)->enctype)
+enum gss_eap_token_type {
+ TOK_TYPE_NONE = 0x0000, /* no token */
+ TOK_TYPE_MIC = 0x0404, /* RFC 4121 MIC token */
+ TOK_TYPE_WRAP = 0x0504, /* RFC 4121 wrap token */
+ TOK_TYPE_EXPORT_NAME = 0x0401, /* RFC 2743 exported name */
+ TOK_TYPE_EXPORT_NAME_COMPOSITE = 0x0402, /* draft-ietf-kitten-gss-naming */
+ TOK_TYPE_DELETE_CONTEXT = 0x0405, /* RFC 2743 delete context */
+ TOK_TYPE_EAP_RESP = 0x0601, /* draft-howlett-eap-gss */
+ TOK_TYPE_EAP_REQ = 0x0602, /* draft-howlett-eap-gss */
+ TOK_TYPE_GSS_CB = 0x0603, /* draft-howlett-eap-gss */
+};
+
+/* util_buffer.c */
+OM_uint32
+makeStringBuffer(OM_uint32 *minor,
+ const char *string,
+ gss_buffer_t buffer);
+
+OM_uint32
+bufferToString(OM_uint32 *minor,
+ const gss_buffer_t buffer,
+ char **pString);
+
+OM_uint32
+duplicateBuffer(OM_uint32 *minor,
+ const gss_buffer_t src,
+ gss_buffer_t dst);
+
+/* util_cksum.c */
int
gssEapSign(krb5_context context,
krb5_cksumtype type,
int iov_count,
int *valid);
+OM_uint32
+gssEapEncodeGssChannelBindings(OM_uint32 *minor,
+ gss_channel_bindings_t chanBindings,
+ gss_buffer_t encodedBindings);
+
/* util_context.c */
OM_uint32 gssEapAllocContext(OM_uint32 *minor, gss_ctx_id_t *pCtx);
OM_uint32 gssEapReleaseContext(OM_uint32 *minor, gss_ctx_id_t *pCtx);
+OM_uint32
+gssEapMakeToken(OM_uint32 *minor,
+ gss_ctx_id_t ctx,
+ const gss_buffer_t innerToken,
+ enum gss_eap_token_type tokenType,
+ gss_buffer_t outputToken);
+
+OM_uint32
+gssEapVerifyToken(OM_uint32 *minor,
+ gss_ctx_id_t ctx,
+ const gss_buffer_t inputToken,
+ enum gss_eap_token_type tokenType,
+ gss_buffer_t innerInputToken);
+
/* util_cred.c */
OM_uint32 gssEapAllocCred(OM_uint32 *minor, gss_cred_id_t *pCred);
OM_uint32 gssEapReleaseCred(OM_uint32 *minor, gss_cred_id_t *pCred);
+OM_uint32
+gssEapAcquireCred(OM_uint32 *minor,
+ const gss_name_t desiredName,
+ const gss_buffer_t password,
+ OM_uint32 timeReq,
+ const gss_OID_set desiredMechs,
+ int cred_usage,
+ gss_cred_id_t *pCred,
+ gss_OID_set *pActualMechs,
+ OM_uint32 *timeRec);
+
+int gssEapCredAvailable(gss_cred_id_t cred, gss_OID mech);
+
/* util_crypt.c */
int
gssEapEncrypt(krb5_context context, int dce_style, size_t ec,
OM_uint32
gssEapDeriveRFC3961Key(OM_uint32 *minor,
- gss_buffer_t msk,
+ const unsigned char *key,
+ size_t keyLength,
krb5_enctype enctype,
krb5_keyblock *pKey);
} while (0)
/* util_mech.c */
-void
+int
gssEapInternalizeOid(const gss_OID oid,
gss_OID *const pInternalizedOid);
int
gssEapIsMechanismOid(const gss_OID oid);
+int
+gssEapIsConcreteMechanismOid(const gss_OID oid);
+
+OM_uint32
+gssEapValidateMechs(OM_uint32 *minor,
+ const gss_OID_set mechs);
+
/* util_name.c */
+enum gss_eap_attribute_type {
+ ATTR_TYPE_NONE = 0,
+ ATTR_TYPE_SAML_AAA_ASSERTION = 1,
+ ATTR_TYPE_SAML_ATTR = 2,
+ ATTR_TYPE_RADIUS_AVP = 3
+};
+
OM_uint32 gssEapAllocName(OM_uint32 *minor, gss_name_t *pName);
OM_uint32 gssEapReleaseName(OM_uint32 *minor, gss_name_t *pName);
OM_uint32 gssEapExportName(OM_uint32 *minor,
gss_OID input_name_type,
gss_name_t *output_name);
+enum gss_eap_attribute_type
+gssEapAttributePrefixToType(const gss_buffer_t prefix);
+gss_buffer_t
+gssEapAttributeTypeToPrefix(enum gss_eap_attribute_type type);
+OM_uint32
+decomposeAttributeName(OM_uint32 *minor,
+ const gss_buffer_t attribute,
+ gss_buffer_t prefix,
+ gss_buffer_t suffix);
+OM_uint32
+composeAttributeName(OM_uint32 *minor,
+ const gss_buffer_t prefix,
+ const gss_buffer_t suffix,
+ gss_buffer_t attribute);
+
/* util_oid.c */
OM_uint32
composeOid(OM_uint32 *minor_status,
gss_OID_desc *oid,
int *suffix) ;
+OM_uint32
+duplicateOid(OM_uint32 *minor_status,
+ const gss_OID_desc * const oid,
+ gss_OID *new_oid);
+
+OM_uint32
+duplicateOidSet(OM_uint32 *minor,
+ const gss_OID_set src,
+ gss_OID_set *dst);
+
static inline int
oidEqual(const gss_OID_desc *o1, const gss_OID_desc *o2)
{
int do_replay, int do_sequence, int wide_nums);
/* util_token.c */
-enum gss_eap_token_type {
- TOK_TYPE_EAP_RESP = 0x0601,
- TOK_TYPE_EAP_REQ = 0x0602,
- TOK_TYPE_GSS_CB = 0x0603,
- TOK_TYPE_MIC = 0x0404,
- TOK_TYPE_WRAP = 0x0504,
- TOK_TYPE_DELETE = 0x0405,
- TOK_TYPE_NONE = 0xFFFF
-};
-
size_t
tokenSize(const gss_OID_desc *mech, size_t body_size);
unsigned char **buf,
enum gss_eap_token_type tok_type);
-int
-verifyTokenHeader(const gss_OID_desc * mech,
+OM_uint32
+verifyTokenHeader(OM_uint32 *minor,
+ gss_OID mech,
size_t *body_size,
unsigned char **buf_in,
size_t toksize_in,
return ((uint64_t)load_uint32_be(p) << 32) | load_uint32_be(p + 4);
}
-static OM_uint32
-makeStringBuffer(OM_uint32 *minor,
- const char *string,
- gss_buffer_t buffer)
-{
- size_t len = strlen(string);
-
- buffer->value = GSSEAP_MALLOC(len + 1);
- if (buffer->value == NULL) {
- *minor = ENOMEM;
- return GSS_S_FAILURE;
- }
- memcpy(buffer->value, string, len + 1);
- buffer->length = len;
-
- *minor = 0;
- return GSS_S_COMPLETE;
-}
-
-static OM_uint32
-bufferToString(OM_uint32 *minor,
- const gss_buffer_t buffer,
- char **pString)
+static inline void
+store_buffer(gss_buffer_t buffer, void *vp, int wide_nums)
{
- char *s;
-
- s = GSSEAP_MALLOC(buffer->length + 1);
- if (s == NULL) {
- *minor = ENOMEM;
- return GSS_S_FAILURE;
- }
- memcpy(s, buffer->value, buffer->length);
- s[buffer->length] = '\0';
-
- *pString = s;
+ unsigned char *p = (unsigned char *)vp;
- *minor = 0;
- return GSS_S_COMPLETE;
+ if (wide_nums)
+ store_uint64_be(buffer->length, p);
+ else
+ store_uint32_be(buffer->length, p);
+ if (buffer->value != NULL)
+ memcpy(p + 4, buffer->value, buffer->length);
}
+
#endif /* _UTIL_H_ */