Bug 460926 A11y hierachy is broken on Ubuntu 8.10 (GNOME 2.24), r=Evan.Yan sr=roc
[wine-gecko.git] / security / nss / lib / util / secasn1u.c
blob11eba599db2e4e657b14359d9c3218d73122f901
1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4 * The contents of this file are subject to the Mozilla Public License Version
5 * 1.1 (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 * http://www.mozilla.org/MPL/
9 * Software distributed under the License is distributed on an "AS IS" basis,
10 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11 * for the specific language governing rights and limitations under the
12 * License.
14 * The Original Code is the Netscape security libraries.
16 * The Initial Developer of the Original Code is
17 * Netscape Communications Corporation.
18 * Portions created by the Initial Developer are Copyright (C) 1994-2000
19 * the Initial Developer. All Rights Reserved.
21 * Contributor(s):
23 * Alternatively, the contents of this file may be used under the terms of
24 * either the GNU General Public License Version 2 or later (the "GPL"), or
25 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
38 * Utility routines to complement the ASN.1 encoding and decoding functions.
40 * $Id: secasn1u.c,v 1.4 2005/04/09 05:06:34 julien.pierre.bugs%sun.com Exp $
43 #include "secasn1.h"
47 * We have a length that needs to be encoded; how many bytes will the
48 * encoding take?
50 * The rules are that 0 - 0x7f takes one byte (the length itself is the
51 * entire encoding); everything else takes one plus the number of bytes
52 * in the length.
54 int
55 SEC_ASN1LengthLength (unsigned long len)
57 int lenlen = 1;
59 if (len > 0x7f) {
60 do {
61 lenlen++;
62 len >>= 8;
63 } while (len);
66 return lenlen;
71 * XXX Move over (and rewrite as appropriate) the rest of the
72 * stuff in dersubr.c!
77 * Find the appropriate subtemplate for the given template.
78 * This may involve calling a "chooser" function, or it may just
79 * be right there. In either case, it is expected to *have* a
80 * subtemplate; this is asserted in debug builds (in non-debug
81 * builds, NULL will be returned).
83 * "thing" is a pointer to the structure being encoded/decoded
84 * "encoding", when true, means that we are in the process of encoding
85 * (as opposed to in the process of decoding)
87 const SEC_ASN1Template *
88 SEC_ASN1GetSubtemplate (const SEC_ASN1Template *theTemplate, void *thing,
89 PRBool encoding)
91 const SEC_ASN1Template *subt = NULL;
93 PORT_Assert (theTemplate->sub != NULL);
94 if (theTemplate->sub != NULL) {
95 if (theTemplate->kind & SEC_ASN1_DYNAMIC) {
96 SEC_ASN1TemplateChooserPtr chooserp;
98 chooserp = *(SEC_ASN1TemplateChooserPtr *) theTemplate->sub;
99 if (chooserp) {
100 if (thing != NULL)
101 thing = (char *)thing - theTemplate->offset;
102 subt = (* chooserp)(thing, encoding);
104 } else {
105 subt = (SEC_ASN1Template*)theTemplate->sub;
108 return subt;
111 PRBool SEC_ASN1IsTemplateSimple(const SEC_ASN1Template *theTemplate)
113 if (!theTemplate) {
114 return PR_TRUE; /* it doesn't get any simpler than NULL */
116 /* only templates made of one primitive type or a choice of primitive
117 types are considered simple */
118 if (! (theTemplate->kind & (~SEC_ASN1_TAGNUM_MASK))) {
119 return PR_TRUE; /* primitive type */
121 if (!theTemplate->kind & SEC_ASN1_CHOICE) {
122 return PR_FALSE; /* no choice means not simple */
124 while (++theTemplate && theTemplate->kind) {
125 if (theTemplate->kind & (~SEC_ASN1_TAGNUM_MASK)) {
126 return PR_FALSE; /* complex type */
129 return PR_TRUE; /* choice of primitive types */