VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/crypto/pkcs7-core.cpp@ 56290

Last change on this file since 56290 was 56290, checked in by vboxsync, 10 years ago

IPRT: Updated (C) year.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1/* $Id: pkcs7-core.cpp 56290 2015-06-09 14:01:31Z vboxsync $ */
2/** @file
3 * IPRT - Crypto - PKCS \#7, Core APIs.
4 */
5
6/*
7 * Copyright (C) 2006-2015 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27
28/*******************************************************************************
29* Header Files *
30*******************************************************************************/
31#include "internal/iprt.h"
32#include <iprt/crypto/pkcs7.h>
33
34#include <iprt/err.h>
35#include <iprt/string.h>
36#include <iprt/crypto/tsp.h>
37
38#include "pkcs7-internal.h"
39
40
41/*
42 * PCKS #7 SignerInfo
43 */
44
45RTDECL(PCRTASN1TIME) RTCrPkcs7SignerInfo_GetSigningTime(PCRTCRPKCS7SIGNERINFO pThis, PCRTCRPKCS7SIGNERINFO *ppSignerInfo)
46{
47 /*
48 * Check the immediate level, unless we're continuing a previous search.
49 * Note! We ASSUME a single signing time attribute, which simplifies the interface.
50 */
51 uint32_t cAttrsLeft;
52 PCRTCRPKCS7ATTRIBUTE pAttr;
53 if (!ppSignerInfo || *ppSignerInfo == NULL)
54 {
55 cAttrsLeft = pThis->AuthenticatedAttributes.cItems;
56 pAttr = pThis->AuthenticatedAttributes.paItems;
57 while (cAttrsLeft-- > 0)
58 {
59 if ( pAttr->enmType == RTCRPKCS7ATTRIBUTETYPE_SIGNING_TIME
60 && pAttr->uValues.pSigningTime->cItems > 0)
61 {
62 if (ppSignerInfo)
63 *ppSignerInfo = pThis;
64 return &pAttr->uValues.pSigningTime->paItems[0];
65 }
66 pAttr++;
67 }
68 }
69 else if (*ppSignerInfo == pThis)
70 *ppSignerInfo = NULL;
71
72 /*
73 * Check counter signatures.
74 */
75 cAttrsLeft = pThis->UnauthenticatedAttributes.cItems;
76 pAttr = pThis->UnauthenticatedAttributes.paItems;
77 while (cAttrsLeft-- > 0)
78 {
79 if (pAttr->enmType == RTCRPKCS7ATTRIBUTETYPE_COUNTER_SIGNATURES)
80 {
81 uint32_t cSignatures = pAttr->uValues.pCounterSignatures->cItems;
82 PCRTCRPKCS7SIGNERINFO pSignature = pAttr->uValues.pCounterSignatures->paItems;
83
84 /* Skip past the previous counter signature. */
85 if (ppSignerInfo && *ppSignerInfo != NULL)
86 while (cSignatures > 0)
87 {
88 cSignatures--;
89 if (pSignature == *ppSignerInfo)
90 {
91 *ppSignerInfo = NULL;
92 pSignature++;
93 break;
94 }
95 pSignature++;
96 }
97
98 /* Search the counter signatures (if any remaining). */
99 while (cSignatures-- > 0)
100 {
101 uint32_t cCounterAttrsLeft = pSignature->AuthenticatedAttributes.cItems;
102 PCRTCRPKCS7ATTRIBUTE pCounterAttr = pSignature->AuthenticatedAttributes.paItems;
103 while (cCounterAttrsLeft-- > 0)
104 {
105 if ( pCounterAttr->enmType == RTCRPKCS7ATTRIBUTETYPE_SIGNING_TIME
106 && pCounterAttr->uValues.pSigningTime->cItems > 0)
107 {
108 if (ppSignerInfo)
109 *ppSignerInfo = pSignature;
110 return &pCounterAttr->uValues.pSigningTime->paItems[0];
111 }
112 pCounterAttr++;
113 }
114 pSignature++;
115 }
116 }
117 pAttr++;
118 }
119
120 /*
121 * No signing timestamp found.
122 */
123 if (ppSignerInfo)
124 *ppSignerInfo = NULL;
125
126 return NULL;
127}
128
129
130RTDECL(PCRTASN1TIME) RTCrPkcs7SignerInfo_GetMsTimestamp(PCRTCRPKCS7SIGNERINFO pThis, PCRTCRPKCS7CONTENTINFO *ppContentInfo)
131{
132 /*
133 * Assume there is only one, so no need to enumerate anything here.
134 */
135 uint32_t cAttrsLeft = pThis->UnauthenticatedAttributes.cItems;
136 PCRTCRPKCS7ATTRIBUTE pAttr = pThis->UnauthenticatedAttributes.paItems;
137 while (cAttrsLeft-- > 0)
138 {
139 if (pAttr->enmType == RTCRPKCS7ATTRIBUTETYPE_MS_TIMESTAMP)
140 {
141 uint32_t cLeft = pAttr->uValues.pContentInfos->cItems;
142 PCRTCRPKCS7CONTENTINFO pContentInfo = &pAttr->uValues.pContentInfos->paItems[0];
143 while (cLeft-- > 0)
144 {
145 if (RTAsn1ObjId_CompareWithString(&pContentInfo->ContentType, RTCRPKCS7SIGNEDDATA_OID) == 0)
146 {
147 if (RTAsn1ObjId_CompareWithString(&pContentInfo->u.pSignedData->ContentInfo.ContentType,
148 RTCRTSPTSTINFO_OID) == 0)
149 {
150 if (ppContentInfo)
151 *ppContentInfo = pContentInfo;
152 return &pContentInfo->u.pSignedData->ContentInfo.u.pTstInfo->GenTime;
153 }
154 }
155
156 pContentInfo++;
157 }
158 }
159 pAttr++;
160 }
161
162 /*
163 * No signature was found.
164 */
165 if (ppContentInfo)
166 *ppContentInfo = NULL;
167
168 return NULL;
169}
170
171
172/*
173 * PCKS #7 ContentInfo.
174 */
175
176RTDECL(bool) RTCrPkcs7ContentInfo_IsSignedData(PCRTCRPKCS7CONTENTINFO pThis)
177{
178 return RTAsn1ObjId_CompareWithString(&pThis->ContentType, RTCRPKCS7SIGNEDDATA_OID) == 0;
179}
180
181
182/*
183 * Set of some kind of certificate supported by PKCS #7 or CMS.
184 */
185
186RTDECL(PCRTCRX509CERTIFICATE)
187RTCrPkcs7SetOfCerts_FindX509ByIssuerAndSerialNumber(PCRTCRPKCS7SETOFCERTS pCertificates,
188 PCRTCRX509NAME pIssuer, PCRTASN1INTEGER pSerialNumber)
189{
190 for (uint32_t i = 0; i < pCertificates->cItems; i++)
191 if ( pCertificates->paItems[i].enmChoice == RTCRPKCS7CERTCHOICE_X509
192 && RTCrX509Certificate_MatchIssuerAndSerialNumber(pCertificates->paItems[i].u.pX509Cert, pIssuer, pSerialNumber))
193 return pCertificates->paItems[i].u.pX509Cert;
194 return NULL;
195}
196
197
198/*
199 * Generate the standard core code.
200 */
201#include <iprt/asn1-generator-core.h>
202
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette