/ OSX / libsecurity_codesigning / lib / reqreader.h
reqreader.h
 1  /*
 2   * Copyright (c) 2007,2011,2013 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  #ifndef _H_REQREADER
28  #define _H_REQREADER
29  
30  #include "requirement.h"
31  #include <Security/SecCertificate.h>
32  
33  namespace Security {
34  namespace CodeSigning {
35  
36  
37  //
38  // The Reader class provides structured access to a opExpr-type code requirement.
39  //
40  class Requirement::Reader {
41  public:
42  	Reader(const Requirement *req);
43  	
44  	const Requirement *requirement() const { return mReq; }
45  	
46  	template <class T> T get();
47  	void getData(const void *&data, size_t &length);
48  	
49  	std::string getString();
50  	CFDataRef getHash();
51  	CFAbsoluteTime getAbsoluteTime();
52  	const unsigned char *getSHA1();
53  	
54  	template <class T> void getData(T *&data, size_t &length)
55  	{ return getData(reinterpret_cast<const void *&>(data), length); }
56  
57  protected:
58  	void checkSize(size_t length)
59  	{
60  		if (mPC + length < mPC || mPC + length > mReq->length())
61  			MacOSError::throwMe(errSecCSReqInvalid);
62  	}
63  	
64  	void skip(size_t length);
65  	
66  	Offset pc() const { return mPC; }
67  	bool atEnd() const { return mPC >= mReq->length(); }
68  	
69  private:
70  	const Requirement * const mReq;
71  	Offset mPC;
72  };
73  
74  template <class T>
75  T Requirement::Reader::get()
76  {
77  	checkSize(sizeof(T));
78  	const Endian<const T> *value = mReq->at<Endian<const T> >(mPC);
79  	mPC += sizeof(T);
80  	return *value;
81  }
82  
83  
84  }	// CodeSigning
85  }	// Security
86  
87  #endif //_H_REQREADER