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

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.  * secport.c - portability interfaces for security libraries
  35.  *
  36.  * This file abstracts out libc functionality that libsec depends on
  37.  * 
  38.  * NOTE - These are not public interfaces. These stubs are to allow the 
  39.  * SW FORTEZZA to link with some low level security functions without dragging
  40.  * in NSPR.
  41.  *
  42.  * $Id: nsprstub.c,v 1.2 2000/09/11 23:27:56 relyea%netscape.com Exp $
  43.  */
  44. #include "seccomon.h"
  45. #include "prmem.h"
  46. #include "prerror.h"
  47. #include "plarena.h"
  48. #include "secerr.h"
  49. #include "prmon.h"
  50. #include "prbit.h"
  51. #include "ck.h"
  52. #ifdef notdef
  53. unsigned long port_allocFailures;
  54. /* locations for registering Unicode conversion functions.  
  55.  *  Is this the appropriate location?  or should they be
  56.  *     moved to client/server specific locations?
  57.  */
  58. PORTCharConversionFunc ucs4Utf8ConvertFunc;
  59. PORTCharConversionFunc ucs2Utf8ConvertFunc;
  60. PORTCharConversionWSwapFunc  ucs2AsciiConvertFunc;
  61. void *
  62. PORT_Alloc(size_t bytes)
  63. {
  64.     void *rv;
  65.     /* Always allocate a non-zero amount of bytes */
  66.     rv = (void *)malloc(bytes ? bytes : 1);
  67.     if (!rv) {
  68. ++port_allocFailures;
  69.     }
  70.     return rv;
  71. }
  72. void *
  73. PORT_Realloc(void *oldptr, size_t bytes)
  74. {
  75.     void *rv;
  76.     rv = (void *)realloc(oldptr, bytes);
  77.     if (!rv) {
  78. ++port_allocFailures;
  79.     }
  80.     return rv;
  81. }
  82. void *
  83. PORT_ZAlloc(size_t bytes)
  84. {
  85.     void *rv;
  86.     /* Always allocate a non-zero amount of bytes */
  87.     rv = (void *)calloc(1, bytes ? bytes : 1);
  88.     if (!rv) {
  89. ++port_allocFailures;
  90.     }
  91.     return rv;
  92. }
  93. void
  94. PORT_Free(void *ptr)
  95. {
  96.     if (ptr) {
  97. free(ptr);
  98.     }
  99. }
  100. void
  101. PORT_ZFree(void *ptr, size_t len)
  102. {
  103.     if (ptr) {
  104. memset(ptr, 0, len);
  105. free(ptr);
  106.     }
  107. }
  108. /********************* Arena code follows *****************************/
  109. PLArenaPool *
  110. PORT_NewArena(unsigned long chunksize)
  111. {
  112.     PLArenaPool *arena;
  113.     
  114.     arena = (PLArenaPool*)PORT_ZAlloc(sizeof(PLArenaPool));
  115.     if ( arena != NULL ) {
  116. PR_InitArenaPool(arena, "security", chunksize, sizeof(double));
  117.     }
  118.     return(arena);
  119. }
  120. void *
  121. PORT_ArenaAlloc(PLArenaPool *arena, size_t size)
  122. {
  123.     void *p;
  124.     PL_ARENA_ALLOCATE(p, arena, size);
  125.     if (p == NULL) {
  126. ++port_allocFailures;
  127.     }
  128.     return(p);
  129. }
  130. void *
  131. PORT_ArenaZAlloc(PLArenaPool *arena, size_t size)
  132. {
  133.     void *p;
  134.     PL_ARENA_ALLOCATE(p, arena, size);
  135.     if (p == NULL) {
  136. ++port_allocFailures;
  137.     } else {
  138. PORT_Memset(p, 0, size);
  139.     }
  140.     return(p);
  141. }
  142. /* need to zeroize!! */
  143. void
  144. PORT_FreeArena(PLArenaPool *arena, PRBool zero)
  145. {
  146.     PR_FinishArenaPool(arena);
  147.     PORT_Free(arena);
  148. }
  149. void *
  150. PORT_ArenaGrow(PLArenaPool *arena, void *ptr, size_t oldsize, size_t newsize)
  151. {
  152.     PORT_Assert(newsize >= oldsize);
  153.     
  154.     PL_ARENA_GROW(ptr, arena, oldsize, ( newsize - oldsize ) );
  155.     
  156.     return(ptr);
  157. }
  158. void *
  159. PORT_ArenaMark(PLArenaPool *arena)
  160. {
  161.     void * result;
  162.     result = PL_ARENA_MARK(arena);
  163.     return result;
  164. }
  165. void
  166. PORT_ArenaRelease(PLArenaPool *arena, void *mark)
  167. {
  168.     PL_ARENA_RELEASE(arena, mark);
  169. }
  170. void
  171. PORT_ArenaUnmark(PLArenaPool *arena, void *mark)
  172. {
  173.     /* do nothing */
  174. }
  175. char *
  176. PORT_ArenaStrdup(PLArenaPool *arena,char *str) {
  177.     int len = PORT_Strlen(str)+1;
  178.     char *newstr;
  179.     newstr = (char*)PORT_ArenaAlloc(arena,len);
  180.     if (newstr) {
  181.         PORT_Memcpy(newstr,str,len);
  182.     }
  183.     return newstr;
  184. }
  185. #endif
  186. /*
  187.  * replace the nice thread-safe Error stack code with something
  188.  * that will work without all the NSPR features.
  189.  */
  190. static PRInt32 stack[2] = {0, 0};
  191. PR_IMPLEMENT(void)
  192. nss_SetError(PRUint32 value)
  193. {
  194.     stack[0] = value;
  195.     return;
  196. }
  197. PR_IMPLEMENT(PRInt32)
  198. NSS_GetError(void)
  199. {
  200.     return(stack[0]);
  201. }
  202. PR_IMPLEMENT(PRInt32 *)
  203. NSS_GetErrorStack(void)
  204. {
  205.     return(&stack[0]);
  206. }
  207. PR_IMPLEMENT(void)
  208. nss_ClearErrorStack(void)
  209. {
  210.     stack[0] = 0;
  211.     return;
  212. }
  213. #ifdef DEBUG
  214. /*
  215.  * replace the pointer tracking stuff for the same reasons.
  216.  *  If you want to turn pointer tracking on, simply ifdef out this code and 
  217.  *  link with real NSPR.
  218.  */
  219. PR_IMPLEMENT(PRStatus)
  220. nssPointerTracker_initialize(nssPointerTracker *tracker)
  221. {
  222.     return PR_SUCCESS;
  223. }
  224. PR_IMPLEMENT(PRStatus)
  225. nssPointerTracker_finalize(nssPointerTracker *tracker)
  226. {
  227.     return PR_SUCCESS;
  228. }
  229. PR_IMPLEMENT(PRStatus)
  230. nssPointerTracker_add(nssPointerTracker *tracker, const void *pointer)
  231. {
  232.      return PR_SUCCESS;
  233. }
  234. PR_IMPLEMENT(PRStatus)
  235. nssPointerTracker_remove(nssPointerTracker *tracker, const void *pointer)
  236. {
  237.      return PR_SUCCESS;
  238. }
  239. PR_IMPLEMENT(PRStatus)
  240. nssPointerTracker_verify(nssPointerTracker *tracker, const void *pointer)
  241. {
  242.      return PR_SUCCESS;
  243. }
  244. #endif
  245. PR_IMPLEMENT(PRThread *)
  246. PR_GetCurrentThread(void)
  247. {
  248.      return (PRThread *)1;
  249. }
  250. PR_IMPLEMENT(void)
  251. PR_Assert(const char *expr, const char *file, int line) {
  252.     return; 
  253. }
  254. PR_IMPLEMENT(void *)
  255. PR_Alloc(PRUint32 bytes) { return malloc(bytes); }
  256. PR_IMPLEMENT(void *)
  257. PR_Malloc(PRUint32 bytes) { return malloc(bytes); }
  258. PR_IMPLEMENT(void *)
  259. PR_Calloc(PRUint32 blocks, PRUint32 bytes) { return calloc(blocks,bytes); }
  260. PR_IMPLEMENT(void *)
  261. PR_Realloc(void * blocks, PRUint32 bytes) { return realloc(blocks,bytes); }
  262. PR_IMPLEMENT(void)
  263. PR_Free(void *ptr) { free(ptr); }
  264. #ifdef notdef
  265. /* Old template; want to expunge it eventually. */
  266. #include "secasn1.h"
  267. #include "secoid.h"
  268. const SEC_ASN1Template SECOID_AlgorithmIDTemplate[] = {
  269.     { SEC_ASN1_SEQUENCE,
  270.   0, NULL, sizeof(SECAlgorithmID) },
  271.     { SEC_ASN1_OBJECT_ID,
  272.   offsetof(SECAlgorithmID,algorithm), },
  273.     { SEC_ASN1_OPTIONAL | SEC_ASN1_ANY,
  274.   offsetof(SECAlgorithmID,parameters), },
  275.     { 0, }
  276. };
  277. PR_IMPLEMENT(PRStatus) PR_Sleep(PRIntervalTime ticks) { return PR_SUCCESS; }
  278. /* This is not atomic! */
  279. PR_IMPLEMENT(PRInt32) PR_AtomicDecrement(PRInt32 *val) { return --(*val); }
  280. PR_IMPLEMENT(PRInt32) PR_AtomicSet(PRInt32 *val) { return ++(*val); }
  281. #endif
  282. /* now make the RNG happy */ /* This is not atomic! */
  283. PR_IMPLEMENT(PRInt32) PR_AtomicIncrement(PRInt32 *val) { return ++(*val); }
  284. CK_C_INITIALIZE_ARGS_PTR nssstub_initArgs = NULL;
  285. NSSArena *nssstub_arena = NULL;
  286. PR_IMPLEMENT(void)
  287. nssSetLockArgs(CK_C_INITIALIZE_ARGS_PTR pInitArgs)
  288. {
  289.     if (nssstub_initArgs == NULL) {
  290. nssstub_initArgs = pInitArgs;
  291. /* nssstub_arena = NSSArena_Create(); */
  292.     }
  293. }
  294. #include "prlock.h"
  295. PR_IMPLEMENT(PRLock *)
  296. PR_NewLock(void) {
  297. PRLock *lock = NULL;
  298. NSSCKFWMutex *mlock = NULL;
  299. CK_RV error;
  300. mlock = nssCKFWMutex_Create(nssstub_initArgs,nssstub_arena,&error);
  301. lock = (PRLock *)mlock;
  302. /* if we don't have a lock, nssCKFWMutex can deal with things */
  303. if (lock == NULL) lock=(PRLock *) 1;
  304. return lock;
  305. }
  306. PR_IMPLEMENT(void) 
  307. PR_DestroyLock(PRLock *lock) {
  308. NSSCKFWMutex *mlock = (NSSCKFWMutex *)lock;
  309. if (lock == (PRLock *)1) return;
  310. nssCKFWMutex_Destroy(mlock);
  311. }
  312. PR_IMPLEMENT(void) 
  313. PR_Lock(PRLock *lock) {
  314. NSSCKFWMutex *mlock = (NSSCKFWMutex *)lock;
  315. if (lock == (PRLock *)1) return;
  316. nssCKFWMutex_Lock(mlock);
  317. }
  318. PR_IMPLEMENT(PRStatus) 
  319. PR_Unlock(PRLock *lock) {
  320. NSSCKFWMutex *mlock = (NSSCKFWMutex *)lock;
  321. if (lock == (PRLock *)1) return PR_SUCCESS;
  322. nssCKFWMutex_Unlock(mlock);
  323. return PR_SUCCESS;
  324. }
  325. #ifdef notdef
  326. #endif
  327. /* this implementation is here to satisfy the PRMonitor use in plarena.c.
  328. ** It appears that it doesn't need re-entrant locks.  It could have used
  329. ** PRLock instead of PRMonitor.  So, this implementation just uses 
  330. ** PRLock for a PRMonitor.
  331. */
  332. PR_IMPLEMENT(PRMonitor*) 
  333. PR_NewMonitor(void)
  334. {
  335.     return (PRMonitor *) PR_NewLock();
  336. }
  337. PR_IMPLEMENT(void) 
  338. PR_EnterMonitor(PRMonitor *mon)
  339. {
  340.     PR_Lock( (PRLock *)mon );
  341. }
  342. PR_IMPLEMENT(PRStatus) 
  343. PR_ExitMonitor(PRMonitor *mon)
  344. {
  345.     return PR_Unlock( (PRLock *)mon );
  346. }
  347. #include "prinit.h"
  348. /* This is NOT threadsafe.  It is merely a pseudo-functional stub.
  349. */
  350. PR_IMPLEMENT(PRStatus) PR_CallOnce(
  351.     PRCallOnceType *once,
  352.     PRCallOnceFN    func)
  353. {
  354.     /* This is not really atomic! */
  355.     if (1 == PR_AtomicIncrement(&once->initialized)) {
  356. once->status = (*func)();
  357.     }  else {
  358.      /* Should wait to be sure that func has finished before returning. */
  359.     }
  360.     return once->status;
  361. }
  362. /*
  363. ** Compute the log of the least power of 2 greater than or equal to n
  364. */
  365. PRIntn PR_CeilingLog2(PRUint32 i) {
  366. PRIntn log2;
  367. PR_CEILING_LOG2(log2,i);
  368. return log2;
  369. }
  370. /********************** end of arena functions ***********************/