• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/crypto/cssm_init.h"
6 #include "base/logging.h"
7 #include "base/singleton.h"
8 
9 // When writing crypto code for Mac OS X, you may find the following
10 // documentation useful:
11 // - Common Security: CDSA and CSSM, Version 2 (with corrigenda)
12 //   http://www.opengroup.org/security/cdsa.htm
13 // - Apple Cryptographic Service Provider Functional Specification
14 // - CryptoSample: http://developer.apple.com/SampleCode/CryptoSample/
15 
16 namespace {
17 
18 class CSSMInitSingleton {
19  public:
CSSMInitSingleton()20   CSSMInitSingleton() : inited_(false), loaded_(false) {
21     static CSSM_VERSION version = {2, 0};
22     // TODO(wtc): what should our caller GUID be?
23     static const CSSM_GUID test_guid = {
24       0xFADE, 0, 0, { 1, 2, 3, 4, 5, 6, 7, 0 }
25     };
26     CSSM_RETURN crtn;
27     CSSM_PVC_MODE pvc_policy = CSSM_PVC_NONE;
28     crtn = CSSM_Init(&version, CSSM_PRIVILEGE_SCOPE_NONE, &test_guid,
29                      CSSM_KEY_HIERARCHY_NONE, &pvc_policy, NULL);
30     if (crtn) {
31       NOTREACHED();
32       return;
33     }
34     inited_ = true;
35 
36     crtn = CSSM_ModuleLoad(&gGuidAppleCSP, CSSM_KEY_HIERARCHY_NONE, NULL, NULL);
37     if (crtn) {
38       NOTREACHED();
39       return;
40     }
41     loaded_ = true;
42   }
43 
~CSSMInitSingleton()44   ~CSSMInitSingleton() {
45     CSSM_RETURN crtn;
46     if (loaded_) {
47       crtn = CSSM_ModuleUnload(&gGuidAppleCSP, NULL, NULL);
48       DCHECK(crtn == CSSM_OK);
49     }
50     if (inited_) {
51       crtn = CSSM_Terminate();
52       DCHECK(crtn == CSSM_OK);
53     }
54   }
55 
56  private:
57   bool inited_;  // True if CSSM_Init has been called successfully.
58   bool loaded_;  // True if CSSM_ModuleLoad has been called successfully.
59 };
60 
61 }  // namespace
62 
63 namespace base {
64 
EnsureCSSMInit()65 void EnsureCSSMInit() {
66   Singleton<CSSMInitSingleton>::get();
67 }
68 
CSSMMalloc(CSSM_SIZE size,void * alloc_ref)69 void* CSSMMalloc(CSSM_SIZE size, void *alloc_ref) {
70   return malloc(size);
71 }
72 
CSSMFree(void * mem_ptr,void * alloc_ref)73 void CSSMFree(void* mem_ptr, void* alloc_ref) {
74   free(mem_ptr);
75 }
76 
CSSMRealloc(void * ptr,CSSM_SIZE size,void * alloc_ref)77 void* CSSMRealloc(void* ptr, CSSM_SIZE size, void* alloc_ref) {
78   return realloc(ptr, size);
79 }
80 
CSSMCalloc(uint32 num,CSSM_SIZE size,void * alloc_ref)81 void* CSSMCalloc(uint32 num, CSSM_SIZE size, void* alloc_ref) {
82   return calloc(num, size);
83 }
84 
85 const CSSM_API_MEMORY_FUNCS kCssmMemoryFunctions = {
86   CSSMMalloc,
87   CSSMFree,
88   CSSMRealloc,
89   CSSMCalloc,
90   NULL
91 };
92 
93 }  // namespace base
94