summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2011-12-23 15:20:26 +0100
committerAndreas Schneider <asn@samba.org>2012-07-17 10:58:39 +0200
commit780006db9de7a55030ba07fc5236c85bee7b4961 (patch)
tree2eb0d813d4bb95bf462169f668a253dec8336377
parenta7208de06a6b47ef0b6947d50b46efc79d1198ce (diff)
downloadsamba-780006db9de7a55030ba07fc5236c85bee7b4961.tar.gz
samba-780006db9de7a55030ba07fc5236c85bee7b4961.tar.bz2
samba-780006db9de7a55030ba07fc5236c85bee7b4961.zip
s4:librpc/rpc: add DCERPC_SCHANNEL_AES support
metze Signed-off-by: Günther Deschner <gd@samba.org>
-rw-r--r--librpc/rpc/rpc_common.h3
-rw-r--r--source4/librpc/rpc/dcerpc_schannel.c17
2 files changed, 18 insertions, 2 deletions
diff --git a/librpc/rpc/rpc_common.h b/librpc/rpc/rpc_common.h
index a28835fa63..e2b37550e1 100644
--- a/librpc/rpc/rpc_common.h
+++ b/librpc/rpc/rpc_common.h
@@ -110,6 +110,9 @@ struct dcerpc_binding {
/* handle upgrades or downgrades automatically */
#define DCERPC_SCHANNEL_AUTO (1<<23)
+/* use aes schannel with hmac-sh256 session key */
+#define DCERPC_SCHANNEL_AES (1<<24)
+
/* The following definitions come from ../librpc/rpc/dcerpc_error.c */
const char *dcerpc_errstr(TALLOC_CTX *mem_ctx, uint32_t fault_code);
diff --git a/source4/librpc/rpc/dcerpc_schannel.c b/source4/librpc/rpc/dcerpc_schannel.c
index 3a3dec068b..f3e52585ae 100644
--- a/source4/librpc/rpc/dcerpc_schannel.c
+++ b/source4/librpc/rpc/dcerpc_schannel.c
@@ -243,7 +243,13 @@ static void continue_srv_auth2(struct tevent_req *subreq)
}
s->dcerpc_schannel_auto = false;
- if (lf & NETLOGON_NEG_STRONG_KEYS) {
+ if (lf & NETLOGON_NEG_SUPPORTS_AES) {
+ ln = "aes";
+ if (rf & NETLOGON_NEG_SUPPORTS_AES) {
+ composite_error(c, s->a.out.result);
+ return;
+ }
+ } else if (lf & NETLOGON_NEG_STRONG_KEYS) {
ln = "strong";
if (rf & NETLOGON_NEG_STRONG_KEYS) {
composite_error(c, s->a.out.result);
@@ -253,7 +259,9 @@ static void continue_srv_auth2(struct tevent_req *subreq)
ln = "des";
}
- if (rf & NETLOGON_NEG_STRONG_KEYS) {
+ if (rf & NETLOGON_NEG_SUPPORTS_AES) {
+ rn = "aes";
+ } else if (rf & NETLOGON_NEG_STRONG_KEYS) {
rn = "strong";
} else {
rn = "des";
@@ -324,8 +332,13 @@ struct composite_context *dcerpc_schannel_key_send(TALLOC_CTX *mem_ctx,
if (s->pipe->conn->flags & DCERPC_SCHANNEL_128) {
s->local_negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
}
+ if (s->pipe->conn->flags & DCERPC_SCHANNEL_AES) {
+ s->local_negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
+ s->local_negotiate_flags |= NETLOGON_NEG_SUPPORTS_AES;
+ }
if (s->pipe->conn->flags & DCERPC_SCHANNEL_AUTO) {
s->local_negotiate_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
+ s->local_negotiate_flags |= NETLOGON_NEG_SUPPORTS_AES;
s->dcerpc_schannel_auto = true;
}