/ OSX / libsecurity_codesigning / lib / reqreader.cpp
reqreader.cpp
  1  /*
  2   * Copyright (c) 2007,2011 Apple Inc. All Rights Reserved.
  3   * 
  4   * @APPLE_LICENSE_HEADER_START@
  5   * 
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   * 
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   * 
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  //
 25  // reqreader - Requirement language (exprOp) reader/scanner
 26  //
 27  #include "reqreader.h"
 28  #include <Security/SecTrustSettingsPriv.h>
 29  #include <security_utilities/memutils.h>
 30  
 31  #if TARGET_OS_OSX
 32  #include <security_cdsa_utilities/cssmdata.h>	// for hex encoding
 33  #endif
 34  
 35  #include "csutilities.h"
 36  
 37  namespace Security {
 38  namespace CodeSigning {
 39  
 40  
 41  //
 42  // Requirement::Reader
 43  //
 44  Requirement::Reader::Reader(const Requirement *req)
 45  	: mReq(req), mPC(sizeof(Requirement))
 46  {
 47  	assert(req);
 48  	if (req->kind() != exprForm)
 49  		MacOSError::throwMe(errSecCSReqUnsupported);
 50  }
 51  
 52  
 53  //
 54  // Access helpers to retrieve various data types from the data stream
 55  //
 56  void Requirement::Reader::getData(const void *&data, size_t &length)
 57  {
 58  	length = get<uint32_t>();
 59  	checkSize(length);
 60  	data = (mReq->at<void>(mPC));
 61  	mPC += LowLevelMemoryUtilities::alignUp(length, baseAlignment);
 62  }
 63  
 64  string Requirement::Reader::getString()
 65  {
 66  	const char *s; size_t length;
 67  	getData(s, length);
 68  	return string(s, length);
 69  }
 70  
 71  CFDataRef Requirement::Reader::getHash()
 72  {
 73  	const unsigned char *s; size_t length;
 74  	getData(s, length);
 75  	return makeCFData(s, length);
 76  }
 77  
 78  CFAbsoluteTime Requirement::Reader::getAbsoluteTime()
 79  {
 80  	// timestamps are saved as 64bit ints internally for
 81  	// portability, but CoreFoundation wants CFAbsoluteTimes,
 82  	// which are doubles.
 83  	// This cuts off subseconds.
 84  	return static_cast<CFAbsoluteTime>(get<int64_t>());
 85  }
 86  
 87  const unsigned char *Requirement::Reader::getSHA1()
 88  {
 89  	const unsigned char *digest; size_t length;
 90  	getData(digest, length);
 91  	if (length != CC_SHA1_DIGEST_LENGTH)
 92  		MacOSError::throwMe(errSecCSReqInvalid);
 93  	return digest;
 94  }
 95  
 96  void Requirement::Reader::skip(size_t length)
 97  {
 98  	checkSize(length);
 99  	mPC += length;
100  }
101  
102  
103  }	// CodeSigning
104  }	// Security