2  * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved. 
   4  * The contents of this file constitute Original Code as defined in and are 
   5  * subject to the Apple Public Source License Version 1.2 (the 'License'). 
   6  * You may not use this file except in compliance with the License. Please obtain 
   7  * a copy of the License at http://www.apple.com/publicsource and read it before 
  10  * This Original Code and all software distributed under the License are 
  11  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS 
  12  * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT 
  13  * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
  14  * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the 
  15  * specific language governing rights and limitations under the License. 
  20 // csputilities - utility classes for CSP implementation 
  22 #include <Security/CSPsession.h> 
  23 #include <Security/cssmplugin.h> 
  24 #include <Security/memutils.h> 
  25 #include <stdio.h>      //@@@ debug 
  27 using LowLevelMemoryUtilities::increment
; 
  33 CSPFullPluginSession::Writer::Writer(CssmData 
*v
, uint32 n
, CssmData 
*rem
) 
  34 : vec(v
), firstVec(v
), lastVec(v 
+ n 
- 1), remData(rem
) 
  36     if (vec 
== NULL 
|| n 
== 0) 
  37         CssmError::throwMe(CSSMERR_CSP_INVALID_OUTPUT_VECTOR
);  // CDSA p.253, amended 
  42 void CSPFullPluginSession::Writer::allocate(size_t needed
, CssmAllocator 
&alloc
) 
  44     if (vec 
== firstVec 
&& !*vec
) {     // initial null vector element, wants allocation there 
  45         *vec 
= makeBuffer(needed
, alloc
); 
  46         lastVec 
= vec
;          // ignore all subsequent buffers in vector 
  49         // how much output space do we have left? 
  50         size_t size 
= currentSize
; 
  51         for (CssmData 
*v 
= vec 
+ 1; v 
<= lastVec
; v
++) 
  56             if (!*remData
) {            // have overflow, can allocate 
  57                 *remData 
= makeBuffer(needed 
- size
, alloc
); 
  60             if (size 
+ remData
->length() >= needed
) 
  61                 return; // will fit into overflow 
  63         // not enough buffer space, and can't allocate 
  64         CssmError::throwMe(CSSMERR_CSP_OUTPUT_LENGTH_ERROR
); 
  68 void CSPFullPluginSession::Writer::nextBlock(void * &ptr
, size_t &size
) 
  74 void CSPFullPluginSession::Writer::use(size_t used
) 
  76     assert(used 
<= currentSize
); 
  78     if (used 
< currentSize
) { 
  79         currentBuffer 
= increment(currentBuffer
, used
); 
  83             useData(vec
++);                             // use next vector buffer 
  84         } else if (vec 
== lastVec 
&& remData
) { 
  85             useData(remData
);                   // use remainder buffer 
  87 #if !defined(NDEBUG) && 0 
  88         } else if (vec 
== lastVec
) { 
  90         } else if (vec 
> lastVec
) { 
  91             assert(false);                              // 2nd try to overflow end 
  94             currentBuffer 
= NULL
;               // no more output buffer 
 100 void CSPFullPluginSession::Writer::put(void *addr
, size_t size
) 
 106             sz 
= size
;  // cap transfer 
 109         addr 
= increment(addr
, sz
); 
 114 size_t CSPFullPluginSession::Writer::close() 
 121 // Common algorithm utilities 
 123 void CSPFullPluginSession::setKey(CssmKey 
&key
, 
 124                                                                   const Context 
&context
, CSSM_KEYCLASS keyClass
, 
 125                                                                   CSSM_KEYATTR_FLAGS attrs
, CSSM_KEYUSE use
) 
 128     memset(&key
.KeyHeader
, 0, sizeof(key
.KeyHeader
)); 
 129     key
.KeyHeader
.HeaderVersion 
= CSSM_KEYHEADER_VERSION
; 
 130     key
.KeyHeader
.CspId 
= plugin
.myGuid(); 
 131     key
.KeyHeader
.AlgorithmId 
= context
.algorithm(); 
 132     key
.KeyHeader
.KeyClass 
= keyClass
; 
 133     key
.KeyHeader
.KeyUsage 
= use
; 
 134     key
.KeyHeader
.KeyAttr 
= attrs
; 
 136     // defaults (change as needed) 
 137     key
.KeyHeader
.WrapAlgorithmId 
= CSSM_ALGID_NONE
; 
 139     // clear key data (standard says, "Always allocate this, ignore prior contents.")