r4325: add the GENSEC_FEATURE_DCE_STYLE flag
[samba.git] / source4 / libcli / auth / gensec.c
index 3cf96de4b3e55671985a6b6951a28f800f9bdae0..8009df4e4050baf70bb343a29cb4308d5180ab04 100644 (file)
@@ -137,6 +137,7 @@ static NTSTATUS gensec_start(TALLOC_CTX *mem_ctx, struct gensec_security **gense
 
        (*gensec_security)->subcontext = False;
        (*gensec_security)->want_features = 0;
+       (*gensec_security)->have_features = 0;
        return NT_STATUS_OK;
 }
 
@@ -231,12 +232,13 @@ NTSTATUS gensec_start_mech_by_authtype(struct gensec_security *gensec_security,
                DEBUG(3, ("Could not find GENSEC backend for auth_type=%d\n", (int)auth_type));
                return NT_STATUS_INVALID_PARAMETER;
        }
+       gensec_want_feature(gensec_security, GENSEC_FEATURE_DCE_STYLE);
        if (auth_level == DCERPC_AUTH_LEVEL_INTEGRITY) {
-               gensec_want_feature(gensec_security, GENSEC_WANT_SIGN);
+               gensec_want_feature(gensec_security, GENSEC_FEATURE_SIGN);
        }
        if (auth_level == DCERPC_AUTH_LEVEL_PRIVACY) {
-               gensec_want_feature(gensec_security, GENSEC_WANT_SIGN);
-               gensec_want_feature(gensec_security, GENSEC_WANT_SEAL);
+               gensec_want_feature(gensec_security, GENSEC_FEATURE_SIGN);
+               gensec_want_feature(gensec_security, GENSEC_FEATURE_SEAL);
        }
 
        return gensec_start_mech(gensec_security);
@@ -310,8 +312,8 @@ NTSTATUS gensec_unseal_packet(struct gensec_security *gensec_security,
        if (!gensec_security->ops->unseal_packet) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       if (!(gensec_security->want_features & GENSEC_WANT_SEAL)) {
-               if (gensec_security->want_features & GENSEC_WANT_SIGN) {
+       if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) {
+               if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
                        return gensec_check_packet(gensec_security, mem_ctx, 
                                                   data, length, 
                                                   whole_pdu, pdu_length, 
@@ -335,7 +337,7 @@ NTSTATUS gensec_check_packet(struct gensec_security *gensec_security,
        if (!gensec_security->ops->check_packet) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       if (!(gensec_security->want_features & GENSEC_WANT_SIGN)) {
+       if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
                return NT_STATUS_INVALID_PARAMETER;
        }
        
@@ -351,8 +353,8 @@ NTSTATUS gensec_seal_packet(struct gensec_security *gensec_security,
        if (!gensec_security->ops->seal_packet) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       if (!(gensec_security->want_features & GENSEC_WANT_SEAL)) {
-               if (gensec_security->want_features & GENSEC_WANT_SIGN) {
+       if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) {
+               if (gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
                        return gensec_sign_packet(gensec_security, mem_ctx, 
                                                  data, length, 
                                                  whole_pdu, pdu_length, 
@@ -373,7 +375,7 @@ NTSTATUS gensec_sign_packet(struct gensec_security *gensec_security,
        if (!gensec_security->ops->sign_packet) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       if (!(gensec_security->want_features & GENSEC_WANT_SIGN)) {
+       if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
                return NT_STATUS_INVALID_PARAMETER;
        }
        
@@ -385,7 +387,7 @@ size_t gensec_sig_size(struct gensec_security *gensec_security)
        if (!gensec_security->ops->sig_size) {
                return 0;
        }
-       if (!(gensec_security->want_features & GENSEC_WANT_SIGN)) {
+       if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
                return 0;
        }
        
@@ -398,10 +400,6 @@ NTSTATUS gensec_session_key(struct gensec_security *gensec_security,
        if (!gensec_security->ops->session_key) {
                return NT_STATUS_NOT_IMPLEMENTED;
        }
-       if (!(gensec_security->want_features & GENSEC_WANT_SESSION_KEY)) {
-               return NT_STATUS_INVALID_PARAMETER;
-       }
-       
        return gensec_security->ops->session_key(gensec_security, session_key);
 }
 
@@ -474,7 +472,7 @@ void gensec_want_feature(struct gensec_security *gensec_security,
 BOOL gensec_have_feature(struct gensec_security *gensec_security,
                         uint32 feature) 
 {
-       if (gensec_security->want_features & feature) {
+       if (gensec_security->have_features & feature) {
                return True;
        }
 
@@ -770,7 +768,9 @@ NTSTATUS gensec_register(const void *_ops)
                return NT_STATUS_OBJECT_NAME_COLLISION;
        }
 
-       generic_security_ops = Realloc(generic_security_ops, sizeof(generic_security_ops[0]) * (gensec_num_backends+1));
+       generic_security_ops = realloc_p(generic_security_ops, 
+                                        const struct gensec_security_ops *, 
+                                        gensec_num_backends+1);
        if (!generic_security_ops) {
                smb_panic("out of memory in gensec_register");
        }