2 * Copyright (c) 2014, 2015 JANET(UK)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of JANET(UK) nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31 * OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "../GSSException.h"
40 GSSOID::GSSOID(std::string oid_str)
42 init( GSSBuffer(oid_str) );
45 GSSOID::GSSOID(char *oid_str)
47 init( GSSBuffer(oid_str) );
50 GSSOID::GSSOID(GSSBuffer oid_str)
55 GSSOID::GSSOID(gss_OID gssoid)
58 this->gssInternal = true;
61 GSSOID::GSSOID ( const GSSOID &gssoid )
63 this->oid = gssoid.oid;
64 this->gssInternal = true;
67 void GSSOID::release()
69 OM_uint32 major, minor;
70 if ( (!this->gssInternal) && (oid != GSS_C_NO_OID) )
72 major = gss_release_oid(&minor, &(this->oid));
75 throw GSSException("Error in releasing a GSS OID", major, minor);
85 void GSSOID::init(GSSBuffer oid_str)
88 OM_uint32 major, minor;
94 major = gss_str_to_oid(&minor, oid_str.toGss(), &(this->oid));
97 throw GSSException("Error creating GSS OID", major, minor);
99 this->gssInternal = false;
105 std::string GSSOID::toString() const
108 OM_uint32 major, minor;
113 if (oid->length == 0)
114 return std::string("");
117 major = gss_oid_to_str(&minor, this->oid, &buf);
118 if (GSS_ERROR(major))
120 throw GSSException("Error in creating a string representation of a GSS OID",
123 ret = std::string((char *)buf.value);
126 major = gss_release_buffer(&minor, &buf);
127 if (GSS_ERROR(major))
129 throw GSSException("Error releasing a gss_buffer",
137 JSONObject *GSSOID::toJSONValue() const
139 std::string val = this->toString();
140 JSONObject *ret = new JSONObject( val.c_str() );
144 bool GSSOID::setValue ( GSSBuffer buf )
150 bool GSSOID::setValue ( gss_OID gssOID )
153 this->gssInternal = true;
157 bool GSSOID::matchesBaseOID ( const gss_OID_desc &base_oid )
160 unsigned char *elements = reinterpret_cast <unsigned char*>(oid->elements);
164 /* Main processing */
165 // We can't match the prefex if we're not longer than the prefix.
166 if (oid->length <= base_oid.length)
169 // Match the prefix itself.
170 if (memcmp(oid->elements, base_oid.elements, base_oid.length) != 0)
173 // Constrain the suffix to a single OID segment.
174 // The break between segments is signified whenever an octet has 0 in
175 // its high-order bit. Check that no octet between the prefix and the
176 // last octet has 0 in its high-order bit
177 for (size_t i = base_oid.length;
181 if( !(elements[i] & 0x80) )
185 // Add a sanity check that the last octet has 0 in its high-order bit.
186 if( elements[oid->length - 1] & 0x80 )
190 // No memory allocated, just typecast - nothing to clean up