1178825Sdfr/*
2233294Sstas * Copyright (c) 2003-2005 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
5178825Sdfr *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
9178825Sdfr *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17233294Sstas * 3. Neither the name of the Institute nor the names of its contributors
18233294Sstas *    may be used to endorse or promote products derived from this software
19233294Sstas *    without specific prior written permission.
20178825Sdfr *
21233294Sstas * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22233294Sstas * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23233294Sstas * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24233294Sstas * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25233294Sstas * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26233294Sstas * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27233294Sstas * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28233294Sstas * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29233294Sstas * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30233294Sstas * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31233294Sstas * SUCH DAMAGE.
32178825Sdfr */
33178825Sdfr
34178825Sdfr#include "der_locl.h"
35178825Sdfr
36178825Sdfrint
37178825Sdfrder_heim_oid_cmp(const heim_oid *p, const heim_oid *q)
38178825Sdfr{
39178825Sdfr    if (p->length != q->length)
40178825Sdfr	return p->length - q->length;
41233294Sstas    return memcmp(p->components,
42178825Sdfr		  q->components,
43178825Sdfr		  p->length * sizeof(*p->components));
44178825Sdfr}
45178825Sdfr
46178825Sdfrint
47233294Sstasder_heim_octet_string_cmp(const heim_octet_string *p,
48178825Sdfr			  const heim_octet_string *q)
49178825Sdfr{
50178825Sdfr    if (p->length != q->length)
51178825Sdfr	return p->length - q->length;
52178825Sdfr    return memcmp(p->data, q->data, p->length);
53178825Sdfr}
54178825Sdfr
55178825Sdfrint
56233294Sstasder_printable_string_cmp(const heim_printable_string *p,
57233294Sstas			 const heim_printable_string *q)
58233294Sstas{
59233294Sstas    return der_heim_octet_string_cmp(p, q);
60233294Sstas}
61233294Sstas
62233294Sstasint
63233294Sstasder_ia5_string_cmp(const heim_ia5_string *p,
64233294Sstas		   const heim_ia5_string *q)
65233294Sstas{
66233294Sstas    return der_heim_octet_string_cmp(p, q);
67233294Sstas}
68233294Sstas
69233294Sstasint
70178825Sdfrder_heim_bit_string_cmp(const heim_bit_string *p,
71178825Sdfr			const heim_bit_string *q)
72178825Sdfr{
73178825Sdfr    int i, r1, r2;
74178825Sdfr    if (p->length != q->length)
75178825Sdfr	return p->length - q->length;
76178825Sdfr    i = memcmp(p->data, q->data, p->length / 8);
77178825Sdfr    if (i)
78178825Sdfr	return i;
79178825Sdfr    if ((p->length % 8) == 0)
80178825Sdfr	return 0;
81178825Sdfr    i = (p->length / 8);
82178825Sdfr    r1 = ((unsigned char *)p->data)[i];
83178825Sdfr    r2 = ((unsigned char *)q->data)[i];
84178825Sdfr    i = 8 - (p->length % 8);
85178825Sdfr    r1 = r1 >> i;
86178825Sdfr    r2 = r2 >> i;
87178825Sdfr    return r1 - r2;
88178825Sdfr}
89178825Sdfr
90178825Sdfrint
91178825Sdfrder_heim_integer_cmp(const heim_integer *p,
92178825Sdfr		     const heim_integer *q)
93178825Sdfr{
94178825Sdfr    if (p->negative != q->negative)
95178825Sdfr	return q->negative - p->negative;
96178825Sdfr    if (p->length != q->length)
97178825Sdfr	return p->length - q->length;
98178825Sdfr    return memcmp(p->data, q->data, p->length);
99178825Sdfr}
100178825Sdfr
101178825Sdfrint
102178825Sdfrder_heim_bmp_string_cmp(const heim_bmp_string *p, const heim_bmp_string *q)
103178825Sdfr{
104178825Sdfr    if (p->length != q->length)
105178825Sdfr	return p->length - q->length;
106178825Sdfr    return memcmp(p->data, q->data, q->length * sizeof(q->data[0]));
107178825Sdfr}
108178825Sdfr
109178825Sdfrint
110233294Sstasder_heim_universal_string_cmp(const heim_universal_string *p,
111178825Sdfr			      const heim_universal_string *q)
112178825Sdfr{
113178825Sdfr    if (p->length != q->length)
114178825Sdfr	return p->length - q->length;
115178825Sdfr    return memcmp(p->data, q->data, q->length * sizeof(q->data[0]));
116178825Sdfr}
117