secitem.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:5k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. /*
  34.  * Support routines for SECItem data structure.
  35.  *
  36.  * $Id: secitem.c,v 1.2 2000/04/06 22:38:27 repka%netscape.com Exp $
  37.  */
  38. #include "seccomon.h"
  39. #include "secitem.h"
  40. #include "base64.h"
  41. #include "secerr.h"
  42. SECItem *
  43. SECITEM_AllocItem(PRArenaPool *arena, SECItem *item, unsigned int len)
  44. {
  45.     SECItem *result = NULL;
  46.     void *mark;
  47.     if (arena != NULL) {
  48. mark = PORT_ArenaMark(arena);
  49.     }
  50.     if (item == NULL) {
  51. if (arena != NULL) {
  52.     result = PORT_ArenaZAlloc(arena, sizeof(SECItem));
  53. } else {
  54.     result = PORT_ZAlloc(sizeof(SECItem));
  55. }
  56. if (result == NULL) {
  57.     goto loser;
  58. }
  59.     } else {
  60. PORT_Assert(item->data == NULL);
  61. result = item;
  62.     }
  63.     result->len = len;
  64.     if (len) {
  65. if (arena != NULL) {
  66.     result->data = PORT_ArenaAlloc(arena, len);
  67. } else {
  68.     result->data = PORT_Alloc(len);
  69. }
  70.     }
  71.     if (arena != NULL) {
  72. PORT_ArenaUnmark(arena, mark);
  73.     }
  74.     return(result);
  75. loser:
  76.     if (arena != NULL) {
  77. PORT_ArenaRelease(arena, mark);
  78. if (item != NULL) {
  79.     item->data = NULL;
  80.     item->len = 0;
  81. }
  82.     } else {
  83. if (result != NULL) {
  84.     SECITEM_FreeItem(result, (item == NULL) ? PR_TRUE : PR_FALSE);
  85. }
  86.     }
  87.     return(NULL);
  88. }
  89. SECStatus
  90. SECITEM_ReallocItem(PRArenaPool *arena, SECItem *item, unsigned int oldlen,
  91.     unsigned int newlen)
  92. {
  93.     PORT_Assert(item != NULL);
  94.     if (item == NULL) {
  95. /* XXX Set error.  But to what? */
  96. return SECFailure;
  97.     }
  98.     /*
  99.      * If no old length, degenerate to just plain alloc.
  100.      */
  101.     if (oldlen == 0) {
  102. PORT_Assert(item->data == NULL || item->len == 0);
  103. if (newlen == 0) {
  104.     /* Nothing to do.  Weird, but not a failure.  */
  105.     return SECSuccess;
  106. }
  107. item->len = newlen;
  108. if (arena != NULL) {
  109.     item->data = PORT_ArenaAlloc(arena, newlen);
  110. } else {
  111.     item->data = PORT_Alloc(newlen);
  112. }
  113.     } else {
  114. if (arena != NULL) {
  115.     item->data = PORT_ArenaGrow(arena, item->data, oldlen, newlen);
  116. } else {
  117.     item->data = PORT_Realloc(item->data, newlen);
  118. }
  119.     }
  120.     if (item->data == NULL) {
  121. return SECFailure;
  122.     }
  123.     return SECSuccess;
  124. }
  125. SECComparison
  126. SECITEM_CompareItem(const SECItem *a, const SECItem *b)
  127. {
  128.     unsigned m;
  129.     SECComparison rv;
  130.     m = ( ( a->len < b->len ) ? a->len : b->len );
  131.     
  132.     rv = (SECComparison) PORT_Memcmp(a->data, b->data, m);
  133.     if (rv) {
  134. return rv;
  135.     }
  136.     if (a->len < b->len) {
  137. return SECLessThan;
  138.     }
  139.     if (a->len == b->len) {
  140. return SECEqual;
  141.     }
  142.     return SECGreaterThan;
  143. }
  144. PRBool
  145. SECITEM_ItemsAreEqual(const SECItem *a, const SECItem *b)
  146. {
  147.     if (SECITEM_CompareItem(a, b) == SECEqual)
  148. return PR_TRUE;
  149.     return PR_FALSE;
  150. }
  151. SECItem *
  152. SECITEM_DupItem(const SECItem *from)
  153. {
  154.     SECItem *to;
  155.     
  156.     if ( from == NULL ) {
  157. return(NULL);
  158.     }
  159.     
  160.     to = (SECItem *)PORT_Alloc(sizeof(SECItem));
  161.     if ( to == NULL ) {
  162. return(NULL);
  163.     }
  164.     to->data = (unsigned char *)PORT_Alloc(from->len);
  165.     if ( to->data == NULL ) {
  166. PORT_Free(to);
  167. return(NULL);
  168.     }
  169.     to->len = from->len;
  170.     PORT_Memcpy(to->data, from->data, to->len);
  171.     
  172.     return(to);
  173. }
  174. SECStatus
  175. SECITEM_CopyItem(PRArenaPool *arena, SECItem *to, const SECItem *from)
  176. {
  177.     if (from->data && from->len) {
  178. if ( arena ) {
  179.     to->data = (unsigned char*) PORT_ArenaAlloc(arena, from->len);
  180. } else {
  181.     to->data = (unsigned char*) PORT_Alloc(from->len);
  182. }
  183. if (!to->data) {
  184.     return SECFailure;
  185. }
  186. PORT_Memcpy(to->data, from->data, from->len);
  187. to->len = from->len;
  188.     } else {
  189. to->data = 0;
  190. to->len = 0;
  191.     }
  192.     return SECSuccess;
  193. }
  194. void
  195. SECITEM_FreeItem(SECItem *zap, PRBool freeit)
  196. {
  197.     if (zap) {
  198. PORT_Free(zap->data);
  199. zap->data = 0;
  200. zap->len = 0;
  201. if (freeit) {
  202.     PORT_Free(zap);
  203. }
  204.     }
  205. }
  206. void
  207. SECITEM_ZfreeItem(SECItem *zap, PRBool freeit)
  208. {
  209.     if (zap) {
  210. PORT_ZFree(zap->data, zap->len);
  211. zap->data = 0;
  212. zap->len = 0;
  213. if (freeit) {
  214.     PORT_ZFree(zap, sizeof(SECItem));
  215. }
  216.     }
  217. }