OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
DER_Digest.c
Go to the documentation of this file.
1/* Copyright (c) 2005-2008,2010 Apple Inc. All Rights Reserved. */
2
3/*
4 * DER_Digest.h - DER encode a DigestInfo
5 *
6 * Created Nov. 9 2005 by dmitch
7 */
8
9#include "DER_Digest.h"
10
11/*
12 * Create an encoded DigestInfo based on the specified SHA1 digest.
13 * The digest must be 20 bytes long.
14 *
15 * Result is placed in caller's buffer, which must be at least of
16 * length DER_DIGEST_INFO_LEN bytes.
17 *
18 * The *resultLen parameter is the available size in the result
19 * buffer on input, and the actual length of the encoded DigestInfo
20 * on output.
21 *
22 * In the interest of saving code space, this just drops the caller's
23 * digest into an otherwise hard-coded, fixed, encoded SHA1 DigestInfo.
24 * Nothing is variable so we know the whole thing. It looks like this:
25 *
26 * SEQUENCE OF <33> {
27 * SEQUENCE OF <9> {
28 * OID <5>: OID : < 06 05 2B 0E 03 02 1A >
29 * NULL
30 * }
31 * OCTET STRING <20>:
32 * 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
33 * 55 55 55 55
34 * }
35 *
36 *
37 * tower.local:digestInfo> hexdump -x /tmp/encodedDigest
38 * 0000000 3021 3009 0605 2b0e 0302 1a05 0004 1455
39 * 0000010 5555 5555 5555 5555 5555 5555 5555 5555
40 * *
41 * 0000020
42 */
43
44static const unsigned char encodedSha1Digest[] =
45{
46 0x30, 0x21, /* top level sequence length 33 */
47 0x30, 0x09, /* algorithm ID, sequence length 9 */
48 0x06, 0x05, /* alg OID, length 5, SHA1 */
49 0x2b, 0x0e, 0x03, 0x02, 0x1a,
50 0x05, 0x00, /* NULL parameters */
51 0x04, 0x14 /* integer length 20 */
52 /* digest follows */
53};
54
56 const DERByte *sha1Digest,
57 DERSize sha1DigestLen,
58 DERByte *result, /* encoded result RETURNED here */
59 DERSize *resultLen) /* IN/OUT */
60{
61 DERSize totalLen = sizeof(encodedSha1Digest) + DER_SHA1_DIGEST_LEN;
62
63 if((sha1Digest == NULL) || (sha1DigestLen != DER_SHA1_DIGEST_LEN) ||
64 (result == NULL) || (resultLen == NULL)) {
65 return DR_ParamErr;
66 }
67 if(*resultLen < DER_SHA1_DIGEST_INFO_LEN) {
68 return DR_BufOverflow;
69 }
70 DERMemmove(result, encodedSha1Digest, sizeof(encodedSha1Digest));
71 DERMemmove(result + sizeof(encodedSha1Digest), sha1Digest, DER_SHA1_DIGEST_LEN);
72 *resultLen = totalLen;
73 return DR_Success;
74}
75
76/*
77 joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)
78 csor(3) nistalgorithm(4) hashAlgs(2) sha256(1)
79
80 future ones to add: sha384(2) sha512(3) sha224(4)
81*/
82static const unsigned char encodedSha256Digest[] =
83{
84 0x30, 0x31, /* top level sequence length 49 */
85 0x30, 0x0d, /* algorithm ID, sequence length 13 */
86 0x06, 0x09,
87 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
88 0x05, 0x00, /* NULL parameters */
89 0x04, 0x20 /* integer length 32 */
90 /* digest follows */
91};
92
94 const DERByte *sha256Digest,
95 DERSize sha256DigestLen,
96 DERByte *result, /* encoded result RETURNED here */
97 DERSize *resultLen) /* IN/OUT */
98{
99 DERSize totalLen = sizeof(encodedSha256Digest) + DER_SHA256_DIGEST_LEN;
100
101 if((sha256Digest == NULL) || (sha256DigestLen != DER_SHA256_DIGEST_LEN) ||
102 (result == NULL) || (resultLen == NULL)) {
103 return DR_ParamErr;
104 }
105 if(*resultLen < DER_SHA256_DIGEST_INFO_LEN) {
106 return DR_BufOverflow;
107 }
108 DERMemmove(result, encodedSha256Digest, sizeof(encodedSha256Digest));
109 DERMemmove(result + sizeof(encodedSha256Digest), sha256Digest, DER_SHA256_DIGEST_LEN);
110 *resultLen = totalLen;
111 return DR_Success;
112}
113
114
115/* Same thing, MD5/MD2 */
116static const unsigned char encodedMdDigest[] =
117{
118 0x30, 0x20, /* top level sequence length 32 */
119 0x30, 0x0c, /* algorithm ID, sequence length 12 */
120 0x06, 0x08, /* alg OID, length 8, MD2/MD5 */
121 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02,
122 0x05, /* 5 = MD5, 2 = MD2 */
123 0x05, 0x00, /* NULL parameters */
124 0x04, 0x10 /* integer length 16 */
125 /* digest follows */
126};
127
128#define WHICH_DIGEST_INDEX 13
129#define WHICH_DIGEST_MD2 2
130#define WHICH_DIGEST_MD5 5
131
133 WhichDigest whichDigest,
134 const DERByte *mdDigest,
135 DERSize mdDigestLen,
136 DERByte *result, /* encoded result RETURNED here */
137 DERSize *resultLen) /* IN/OUT */
138{
139 DERSize totalLen = sizeof(encodedMdDigest) + DER_MD_DIGEST_LEN;
140
141 if((mdDigest == NULL) || (mdDigestLen != DER_MD_DIGEST_LEN) ||
142 (result == NULL) || (resultLen == NULL)) {
143 return DR_ParamErr;
144 }
145 if(*resultLen < totalLen) {
146 return DR_BufOverflow;
147 }
148 DERMemmove(result, encodedMdDigest, sizeof(encodedMdDigest));
149 DERMemmove(result + sizeof(encodedMdDigest), mdDigest, DER_MD_DIGEST_LEN);
150 switch(whichDigest) {
151 case WD_MD2:
153 break;
154 case WD_MD5:
156 break;
157 default:
158 return DR_ParamErr;
159 }
160 *resultLen = totalLen;
161 return DR_Success;
162}
#define WHICH_DIGEST_INDEX
Definition DER_Digest.c:128
#define WHICH_DIGEST_MD5
Definition DER_Digest.c:130
DERReturn DEREncodeSHA256DigestInfo(const DERByte *sha256Digest, DERSize sha256DigestLen, DERByte *result, DERSize *resultLen)
Definition DER_Digest.c:93
DERReturn DEREncodeMDDigestInfo(WhichDigest whichDigest, const DERByte *mdDigest, DERSize mdDigestLen, DERByte *result, DERSize *resultLen)
Definition DER_Digest.c:132
#define WHICH_DIGEST_MD2
Definition DER_Digest.c:129
DERReturn DEREncodeSHA1DigestInfo(const DERByte *sha1Digest, DERSize sha1DigestLen, DERByte *result, DERSize *resultLen)
Definition DER_Digest.c:55
#define DER_SHA256_DIGEST_INFO_LEN
Definition DER_Digest.h:39
WhichDigest
Definition DER_Digest.h:53
@ WD_MD5
Definition DER_Digest.h:55
@ WD_MD2
Definition DER_Digest.h:54
#define DER_MD_DIGEST_LEN
Definition DER_Digest.h:50
#define DER_SHA256_DIGEST_LEN
Definition DER_Digest.h:38
#define DER_SHA1_DIGEST_LEN
Definition DER_Digest.h:29
#define DER_SHA1_DIGEST_INFO_LEN
Definition DER_Digest.h:30
DERReturn
Definition libDER.h:20
@ DR_Success
Definition libDER.h:21
@ DR_ParamErr
Definition libDER.h:27
@ DR_BufOverflow
Definition libDER.h:28
size_t DERSize
#define DERMemmove(dst, src, len)
uint8_t DERByte