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
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.
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 $
47 * We have a length that needs to be encoded; how many bytes will the
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
55 SEC_ASN1LengthLength (unsigned long len
)
71 * XXX Move over (and rewrite as appropriate) the rest of the
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
,
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
;
101 thing
= (char *)thing
- theTemplate
->offset
;
102 subt
= (* chooserp
)(thing
, encoding
);
105 subt
= (SEC_ASN1Template
*)theTemplate
->sub
;
111 PRBool
SEC_ASN1IsTemplateSimple(const SEC_ASN1Template
*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 */