mirrored from https://www.bouncycastle.org/repositories/bc-csharp
-
Notifications
You must be signed in to change notification settings - Fork 602
Expand file tree
/
Copy pathSignerInfoGenerator.cs
More file actions
144 lines (123 loc) · 5.45 KB
/
Copy pathSignerInfoGenerator.cs
File metadata and controls
144 lines (123 loc) · 5.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using Org.BouncyCastle.Asn1.Cms;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.X509;
namespace Org.BouncyCastle.Cms
{
public class SignerInfoGenerator
{
private readonly SignerIdentifier m_sigID;
private readonly ISignatureFactory m_signatureFactory;
private readonly CmsAttributeTableGenerator m_signedGen;
private readonly CmsAttributeTableGenerator m_unsignedGen;
private readonly X509Certificate m_certificate;
internal SignerInfoGenerator(SignerIdentifier sigID, ISignatureFactory signatureFactory,
CmsAttributeTableGenerator signedGen, CmsAttributeTableGenerator unsignedGen, X509Certificate certificate)
{
m_sigID = sigID;
m_signatureFactory = signatureFactory;
m_signedGen = signedGen;
m_unsignedGen = unsignedGen;
m_certificate = certificate;
}
public X509Certificate Certificate => m_certificate;
public int GeneratedVersion => m_sigID.IsTagged ? 3 : 1;
public SignerInfoGeneratorBuilder NewBuilder()
{
SignerInfoGeneratorBuilder builder = new SignerInfoGeneratorBuilder();
builder.WithSignedAttributeGenerator(m_signedGen);
builder.WithUnsignedAttributeGenerator(m_unsignedGen);
builder.SetDirectSignature(hasNoSignedAttributes: m_signedGen == null);
return builder;
}
public ISignatureFactory SignatureFactory => m_signatureFactory;
public CmsAttributeTableGenerator SignedAttributeTableGenerator => m_signedGen;
public SignerIdentifier SignerID => m_sigID;
public CmsAttributeTableGenerator UnsignedAttributeTableGenerator => m_unsignedGen;
}
public class SignerInfoGeneratorBuilder
{
private bool m_directSignature;
private CmsAttributeTableGenerator m_signedGen;
private CmsAttributeTableGenerator m_unsignedGen;
public SignerInfoGeneratorBuilder()
{
}
/**
* If the passed in flag is true, the signer signature will be based on the data, not
* a collection of signed attributes, and no signed attributes will be included.
*
* @return the builder object
*/
public SignerInfoGeneratorBuilder SetDirectSignature(bool hasNoSignedAttributes)
{
m_directSignature = hasNoSignedAttributes;
return this;
}
/**
* Provide a custom signed attribute generator.
*
* @param signedGen a generator of signed attributes.
* @return the builder object
*/
public SignerInfoGeneratorBuilder WithSignedAttributeGenerator(CmsAttributeTableGenerator signedGen)
{
m_signedGen = signedGen;
return this;
}
/**
* Provide a generator of unsigned attributes.
*
* @param unsignedGen a generator for signed attributes.
* @return the builder object
*/
public SignerInfoGeneratorBuilder WithUnsignedAttributeGenerator(CmsAttributeTableGenerator unsignedGen)
{
m_unsignedGen = unsignedGen;
return this;
}
/**
* Build a generator with the passed in X.509 certificate issuer and serial number as the signerIdentifier.
*
* @param contentSigner operator for generating the final signature in the SignerInfo with.
* @param certificate X.509 certificate related to the contentSigner.
* @return a SignerInfoGenerator
* @throws OperatorCreationException if the generator cannot be built.
*/
// TODO[api] 'contentSigner' => 'signatureFactory'
public SignerInfoGenerator Build(ISignatureFactory contentSigner, X509Certificate certificate)
{
SignerIdentifier sigID = CmsUtilities.GetSignerIdentifier(certificate);
return CreateGenerator(contentSigner, sigID, certificate);
}
/**
* Build a generator with the passed in subjectKeyIdentifier as the signerIdentifier. If used you should
* try to follow the calculation described in RFC 5280 section 4.2.1.2.
*
* @param signerFactory operator factory for generating the final signature in the SignerInfo with.
* @param subjectKeyIdentifier key identifier to identify the public key for verifying the signature.
* @return a SignerInfoGenerator
*/
// TODO[api] 'signerFactory' => 'signatureFactory'
public SignerInfoGenerator Build(ISignatureFactory signerFactory, byte[] subjectKeyIdentifier)
{
SignerIdentifier sigID = CmsUtilities.GetSignerIdentifier(subjectKeyIdentifier);
return CreateGenerator(signerFactory, sigID, certificate: null);
}
private SignerInfoGenerator CreateGenerator(ISignatureFactory signatureFactory, SignerIdentifier sigID,
X509Certificate certificate)
{
CmsAttributeTableGenerator signedGen = m_signedGen;
CmsAttributeTableGenerator unsignedGen = m_unsignedGen;
if (m_directSignature)
{
signedGen = null;
unsignedGen = null;
}
else if (signedGen == null)
{
signedGen = new DefaultSignedAttributeTableGenerator();
}
return new SignerInfoGenerator(sigID, signatureFactory, signedGen, unsignedGen, certificate);
}
}
}