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 <security_codesigning/requirement.h> 31#include <Security/SecCertificate.h> 32 33namespace Security { 34namespace CodeSigning { 35 36 37// 38// The Reader class provides structured access to a opExpr-type code requirement. 39// 40class Requirement::Reader { 41public: 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 const unsigned char *getHash(); 51 const unsigned char *getSHA1(); 52 53 template <class T> void getData(T *&data, size_t &length) 54 { return getData(reinterpret_cast<const void *&>(data), length); } 55 56protected: 57 void checkSize(size_t length) 58 { 59 if (mPC + length < mPC || mPC + length > mReq->length()) 60 MacOSError::throwMe(errSecCSReqInvalid); 61 } 62 63 void skip(size_t length); 64 65 Offset pc() const { return mPC; } 66 bool atEnd() const { return mPC >= mReq->length(); } 67 68private: 69 const Requirement * const mReq; 70 Offset mPC; 71}; 72 73template <class T> 74T Requirement::Reader::get() 75{ 76 checkSize(sizeof(T)); 77 const Endian<const T> *value = mReq->at<Endian<const T> >(mPC); 78 mPC += sizeof(T); 79 return *value; 80} 81 82 83} // CodeSigning 84} // Security 85 86#endif //_H_REQREADER 87