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