1 /* ***** BEGIN LICENSE BLOCK *****
2 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3 *
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/
8 *
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.
13 *
14 * The Original Code is the Netscape security libraries.
15 *
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.
20 *
21 * Contributor(s):
22 *
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.
34 *
35 * ***** END LICENSE BLOCK ***** */
36 /*
37 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
38 * Use is subject to license terms.
39 *
40 * Sun elects to use this software under the MPL license.
41 */
42
43 /*
44 * Support routines for SECItem data structure.
45 *
46 * $Id: secitem.c,v 1.14 2006/05/22 22:24:34 wtchang%redhat.com Exp $
47 */
48
49 #include <sys/types.h>
50 #include <sys/systm.h>
51 #include <sys/param.h>
52 #ifdef _KERNEL
53 #include <sys/kmem.h>
54 #else
55 #include <string.h>
56 #include <strings.h>
57 #include <assert.h>
58 #endif
59 #include "ec.h"
60 #include "ecl-curve.h"
61 #include "ecc_impl.h"
62
63 void SECITEM_FreeItem(SECItem *, PRBool);
64
65 SECItem *
SECITEM_AllocItem(PRArenaPool * arena,SECItem * item,unsigned int len,int kmflag)66 SECITEM_AllocItem(PRArenaPool *arena, SECItem *item, unsigned int len,
67 int kmflag)
68 {
69 SECItem *result = NULL;
70 void *mark = NULL;
71
72 if (arena != NULL) {
73 mark = PORT_ArenaMark(arena);
74 }
75
76 if (item == NULL) {
77 if (arena != NULL) {
78 result = PORT_ArenaZAlloc(arena, sizeof(SECItem), kmflag);
79 } else {
80 result = PORT_ZAlloc(sizeof(SECItem), kmflag);
81 }
82 if (result == NULL) {
83 goto loser;
84 }
85 } else {
86 PORT_Assert(item->data == NULL);
87 result = item;
88 }
89
90 result->len = len;
91 if (len) {
92 if (arena != NULL) {
93 result->data = PORT_ArenaAlloc(arena, len, kmflag);
94 } else {
95 result->data = PORT_Alloc(len, kmflag);
96 }
97 if (result->data == NULL) {
98 goto loser;
99 }
100 } else {
101 result->data = NULL;
102 }
103
104 if (mark) {
105 PORT_ArenaUnmark(arena, mark);
106 }
107 return(result);
108
109 loser:
110 if ( arena != NULL ) {
111 if (mark) {
112 PORT_ArenaRelease(arena, mark);
113 }
114 if (item != NULL) {
115 item->data = NULL;
116 item->len = 0;
117 }
118 } else {
119 if (result != NULL) {
120 SECITEM_FreeItem(result, (item == NULL) ? PR_TRUE : PR_FALSE);
121 }
122 /*
123 * If item is not NULL, the above has set item->data and
124 * item->len to 0.
125 */
126 }
127 return(NULL);
128 }
129
130 SECStatus
SECITEM_CopyItem(PRArenaPool * arena,SECItem * to,const SECItem * from,int kmflag)131 SECITEM_CopyItem(PRArenaPool *arena, SECItem *to, const SECItem *from,
132 int kmflag)
133 {
134 to->type = from->type;
135 if (from->data && from->len) {
136 if ( arena ) {
137 to->data = (unsigned char*) PORT_ArenaAlloc(arena, from->len,
138 kmflag);
139 } else {
140 to->data = (unsigned char*) PORT_Alloc(from->len, kmflag);
141 }
142
143 if (!to->data) {
144 return SECFailure;
145 }
146 PORT_Memcpy(to->data, from->data, from->len);
147 to->len = from->len;
148 } else {
149 to->data = 0;
150 to->len = 0;
151 }
152 return SECSuccess;
153 }
154
155 void
SECITEM_FreeItem(SECItem * zap,PRBool freeit)156 SECITEM_FreeItem(SECItem *zap, PRBool freeit)
157 {
158 if (zap) {
159 #ifdef _KERNEL
160 kmem_free(zap->data, zap->len);
161 #else
162 free(zap->data);
163 #endif
164 zap->data = 0;
165 zap->len = 0;
166 if (freeit) {
167 #ifdef _KERNEL
168 kmem_free(zap, sizeof (SECItem));
169 #else
170 free(zap);
171 #endif
172 }
173 }
174 }
175