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#include <security_cdsa_utilities/cssmdata.h> // for hex encoding 31#include "csutilities.h" 32 33namespace Security { 34namespace CodeSigning { 35 36 37// 38// Requirement::Reader 39// 40Requirement::Reader::Reader(const Requirement *req) 41 : mReq(req), mPC(sizeof(Requirement)) 42{ 43 assert(req); 44 if (req->kind() != exprForm) 45 MacOSError::throwMe(errSecCSReqUnsupported); 46} 47 48 49// 50// Access helpers to retrieve various data types from the data stream 51// 52void Requirement::Reader::getData(const void *&data, size_t &length) 53{ 54 length = get<uint32_t>(); 55 checkSize(length); 56 data = (mReq->at<void>(mPC)); 57 mPC += LowLevelMemoryUtilities::alignUp(length, baseAlignment); 58} 59 60string Requirement::Reader::getString() 61{ 62 const char *s; size_t length; 63 getData(s, length); 64 return string(s, length); 65} 66 67const unsigned char *Requirement::Reader::getHash() 68{ 69 const unsigned char *s; size_t length; 70 getData(s, length); 71 if (length != SHA1::digestLength) 72 MacOSError::throwMe(errSecCSReqInvalid); 73 return s; 74} 75 76const unsigned char *Requirement::Reader::getSHA1() 77{ 78 const unsigned char *digest; size_t length; 79 getData(digest, length); 80 if (length != CC_SHA1_DIGEST_LENGTH) 81 MacOSError::throwMe(errSecCSReqInvalid); 82 return digest; 83} 84 85void Requirement::Reader::skip(size_t length) 86{ 87 checkSize(length); 88 mPC += length; 89} 90 91 92} // CodeSigning 93} // Security 94