1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/mock_gssapi_library_posix.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/third_party/gssapi/gssapi.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace test {
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct GssNameMockImpl {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gss_OID_desc name_type;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace test
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// gss_OID helpers.
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NOTE: gss_OID's do not own the data they point to, which should be static.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ClearOid(gss_OID dest) {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest->length = 0;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest->elements = NULL;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetOid(gss_OID dest, const void* src, size_t length) {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearOid(dest);
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest->length = length;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (length)
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    dest->elements = const_cast<void*>(src);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CopyOid(gss_OID dest, const gss_OID_desc* src) {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearOid(dest);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetOid(dest, src->elements, src->length);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// gss_buffer_t helpers.
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ClearBuffer(gss_buffer_t dest) {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest->length = 0;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete [] reinterpret_cast<char*>(dest->value);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest->value = NULL;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetBuffer(gss_buffer_t dest, const void* src, size_t length) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearBuffer(dest);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest->length = length;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (length) {
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    dest->value = new char[length];
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    memcpy(dest->value, src, length);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid CopyBuffer(gss_buffer_t dest, const gss_buffer_t src) {
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearBuffer(dest);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetBuffer(dest, src->value, src->length);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string BufferToString(const gss_buffer_t src) {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string dest;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return dest;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* string = reinterpret_cast<char*>(src->value);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest.assign(string, src->length);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return dest;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid BufferFromString(const std::string& src, gss_buffer_t dest) {
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetBuffer(dest, src.c_str(), src.length());
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// gss_name_t helpers.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ClearName(gss_name_t dest) {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test::GssNameMockImpl* name = reinterpret_cast<test::GssNameMockImpl*>(dest);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  name->name.clear();
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearOid(&name->name_type);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetName(gss_name_t dest, const void* src, size_t length) {
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearName(dest);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test::GssNameMockImpl* name = reinterpret_cast<test::GssNameMockImpl*>(dest);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  name->name.assign(reinterpret_cast<const char*>(src), length);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string NameToString(const gss_name_t& src) {
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string dest;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!src)
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return dest;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test::GssNameMockImpl* string =
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      reinterpret_cast<test::GssNameMockImpl*>(src);
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  dest = string->name;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return dest;
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid NameFromString(const std::string& src, gss_name_t dest) {
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dest)
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SetName(dest, src.c_str(), src.length());
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace test {
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGssContextMockImpl::GssContextMockImpl()
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  : lifetime_rec(0),
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ctx_flags(0),
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    locally_initiated(0),
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    open(0) {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearOid(&mech_type);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGssContextMockImpl::GssContextMockImpl(const GssContextMockImpl& other)
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  : src_name(other.src_name),
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    targ_name(other.targ_name),
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    lifetime_rec(other.lifetime_rec),
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ctx_flags(other.ctx_flags),
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    locally_initiated(other.locally_initiated),
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    open(other.open) {
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CopyOid(&mech_type, &other.mech_type);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGssContextMockImpl::GssContextMockImpl(const char* src_name_in,
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const char* targ_name_in,
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       OM_uint32 lifetime_rec_in,
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const gss_OID_desc& mech_type_in,
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       OM_uint32 ctx_flags_in,
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       int locally_initiated_in,
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       int open_in)
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : src_name(src_name_in ? src_name_in : ""),
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      targ_name(targ_name_in ? targ_name_in : ""),
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lifetime_rec(lifetime_rec_in),
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ctx_flags(ctx_flags_in),
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      locally_initiated(locally_initiated_in),
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      open(open_in) {
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CopyOid(&mech_type, &mech_type_in);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGssContextMockImpl::~GssContextMockImpl() {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearOid(&mech_type);
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid GssContextMockImpl::Assign(
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GssContextMockImpl& other) {
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (&other == this)
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  src_name = other.src_name;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  targ_name = other.targ_name;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  lifetime_rec = other.lifetime_rec;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CopyOid(&mech_type, &other.mech_type);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ctx_flags = other.ctx_flags;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  locally_initiated = other.locally_initiated;
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  open = other.open;
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMockGSSAPILibrary::SecurityContextQuery::SecurityContextQuery()
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : expected_package(),
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      response_code(0),
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      minor_response_code(0),
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      context_info() {
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  expected_input_token.length = 0;
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  expected_input_token.value = NULL;
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  output_token.length = 0;
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  output_token.value = NULL;
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMockGSSAPILibrary::SecurityContextQuery::SecurityContextQuery(
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& in_expected_package,
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    OM_uint32 in_response_code,
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    OM_uint32 in_minor_response_code,
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const test::GssContextMockImpl& in_context_info,
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* in_expected_input_token,
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const char* in_output_token)
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : expected_package(in_expected_package),
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      response_code(in_response_code),
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      minor_response_code(in_minor_response_code),
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      context_info(in_context_info) {
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (in_expected_input_token) {
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    expected_input_token.length = strlen(in_expected_input_token);
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    expected_input_token.value = const_cast<char*>(in_expected_input_token);
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    expected_input_token.length = 0;
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    expected_input_token.value = NULL;
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (in_output_token) {
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    output_token.length = strlen(in_output_token);
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    output_token.value = const_cast<char*>(in_output_token);
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } else {
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    output_token.length = 0;
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    output_token.value = NULL;
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenMockGSSAPILibrary::SecurityContextQuery::~SecurityContextQuery() {}
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockGSSAPILibrary::MockGSSAPILibrary() {
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochMockGSSAPILibrary::~MockGSSAPILibrary() {
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid MockGSSAPILibrary::ExpectSecurityContext(
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::string& expected_package,
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    OM_uint32 response_code,
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    OM_uint32 minor_response_code,
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const GssContextMockImpl& context_info,
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const gss_buffer_desc& expected_input_token,
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const gss_buffer_desc& output_token) {
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SecurityContextQuery security_query;
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_query.expected_package = expected_package;
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_query.response_code = response_code;
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_query.minor_response_code = minor_response_code;
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_query.context_info.Assign(context_info);
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_query.expected_input_token = expected_input_token;
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  security_query.output_token = output_token;
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  expected_security_queries_.push_back(security_query);
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool MockGSSAPILibrary::Init() {
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// These methods match the ones in the GSSAPI library.
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::import_name(
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_buffer_t input_name_buffer,
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_OID input_name_type,
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_name_t* output_name) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!output_name)
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_BAD_NAME;
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!input_name_buffer)
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_CALL_BAD_STRUCTURE;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!input_name_type)
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_BAD_NAMETYPE;
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssNameMockImpl* output = new GssNameMockImpl;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (output == NULL)
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_FAILURE;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output->name_type.length = 0;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output->name_type.elements = NULL;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Save the data.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  output->name = BufferToString(input_name_buffer);
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CopyOid(&output->name_type, input_name_type);
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *output_name = output;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::release_name(
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_name_t* input_name) {
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!input_name)
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_BAD_NAME;
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!*input_name)
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_COMPLETE;
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssNameMockImpl* name = *reinterpret_cast<GssNameMockImpl**>(input_name);
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearName(*input_name);
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delete name;
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *input_name = NULL;
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::release_buffer(
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_buffer_t buffer) {
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!buffer)
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_BAD_NAME;
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ClearBuffer(buffer);
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::display_name(
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OM_uint32* minor_status,
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const gss_name_t input_name,
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gss_buffer_t output_name_buffer,
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gss_OID* output_name_type) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!input_name)
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_BAD_NAME;
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!output_name_buffer)
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_CALL_BAD_STRUCTURE;
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!output_name_type)
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_CALL_BAD_STRUCTURE;
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string name(NameToString(input_name));
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BufferFromString(name, output_name_buffer);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssNameMockImpl* internal_name =
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *reinterpret_cast<GssNameMockImpl**>(input_name);
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (output_name_type)
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *output_name_type = internal_name ? &internal_name->name_type : NULL;
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::display_status(
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32 status_value,
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int status_type,
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_OID mech_type,
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* message_context,
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_buffer_t status_string) {
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string msg = base::StringPrintf("Value: %u, Type %u",
3463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       status_value,
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       status_type);
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (message_context)
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *message_context = 0;
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BufferFromString(msg, status_string);
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::init_sec_context(
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_cred_id_t initiator_cred_handle,
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_ctx_id_t* context_handle,
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_name_t target_name,
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_OID mech_type,
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32 req_flags,
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32 time_req,
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_channel_bindings_t input_chan_bindings,
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_buffer_t input_token,
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_OID* actual_mech_type,
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_buffer_t output_token,
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* ret_flags,
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* time_rec) {
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!context_handle)
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_CALL_BAD_STRUCTURE;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssContextMockImpl** internal_context_handle =
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      reinterpret_cast<test::GssContextMockImpl**>(context_handle);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create it if necessary.
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!*internal_context_handle) {
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *internal_context_handle = new GssContextMockImpl;
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(*internal_context_handle);
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssContextMockImpl& context = **internal_context_handle;
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (expected_security_queries_.empty()) {
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_UNAVAILABLE;
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SecurityContextQuery security_query = expected_security_queries_.front();
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  expected_security_queries_.pop_front();
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(std::string("Negotiate"), security_query.expected_package);
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OM_uint32 major_status = security_query.response_code;
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = security_query.minor_response_code;
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  context.src_name = security_query.context_info.src_name;
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  context.targ_name = security_query.context_info.targ_name;
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  context.lifetime_rec = security_query.context_info.lifetime_rec;
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CopyOid(&context.mech_type, &security_query.context_info.mech_type);
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  context.ctx_flags = security_query.context_info.ctx_flags;
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  context.locally_initiated = security_query.context_info.locally_initiated;
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  context.open = security_query.context_info.open;
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!input_token) {
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(security_query.expected_input_token.length);
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(input_token->length, security_query.expected_input_token.length);
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (input_token->length) {
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      EXPECT_EQ(0, memcmp(input_token->value,
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          security_query.expected_input_token.value,
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          input_token->length));
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CopyBuffer(output_token, &security_query.output_token);
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (actual_mech_type)
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CopyOid(*actual_mech_type, mech_type);
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (ret_flags)
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *ret_flags = req_flags;
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return major_status;
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::wrap_size_limit(
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const gss_ctx_id_t context_handle,
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int conf_req_flag,
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_qop_t qop_req,
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32 req_output_size,
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* max_input_size) {
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ADD_FAILURE();
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_UNAVAILABLE;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::delete_sec_context(
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      OM_uint32* minor_status,
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_ctx_id_t* context_handle,
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      gss_buffer_t output_token) {
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!context_handle)
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_CALL_BAD_STRUCTURE;
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssContextMockImpl** internal_context_handle =
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      reinterpret_cast<GssContextMockImpl**>(context_handle);
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (*internal_context_handle) {
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    delete *internal_context_handle;
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *internal_context_handle = NULL;
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOM_uint32 MockGSSAPILibrary::inquire_context(
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OM_uint32* minor_status,
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const gss_ctx_id_t context_handle,
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gss_name_t* src_name,
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gss_name_t* targ_name,
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OM_uint32* lifetime_rec,
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gss_OID* mech_type,
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    OM_uint32* ctx_flags,
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int* locally_initiated,
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int* open) {
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (minor_status)
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *minor_status = 0;
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!context_handle)
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GSS_S_CALL_BAD_STRUCTURE;
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssContextMockImpl* internal_context_ptr =
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      reinterpret_cast<GssContextMockImpl*>(context_handle);
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GssContextMockImpl& context = *internal_context_ptr;
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (src_name)
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NameFromString(context.src_name, *src_name);
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (targ_name)
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NameFromString(context.targ_name, *targ_name);
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (lifetime_rec)
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *lifetime_rec = context.lifetime_rec;
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (mech_type)
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    CopyOid(*mech_type, &context.mech_type);
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (ctx_flags)
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *ctx_flags = context.ctx_flags;
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (locally_initiated)
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *locally_initiated = context.locally_initiated;
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (open)
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *open = context.open;
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GSS_S_COMPLETE;
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace test
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace net
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
482