diff options
Diffstat (limited to 'pkix/src/main/java/org/spongycastle/cms/KeyTransRecipientInfoGenerator.java')
-rw-r--r-- | pkix/src/main/java/org/spongycastle/cms/KeyTransRecipientInfoGenerator.java | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/pkix/src/main/java/org/spongycastle/cms/KeyTransRecipientInfoGenerator.java b/pkix/src/main/java/org/spongycastle/cms/KeyTransRecipientInfoGenerator.java new file mode 100644 index 00000000..c78a4ff8 --- /dev/null +++ b/pkix/src/main/java/org/spongycastle/cms/KeyTransRecipientInfoGenerator.java @@ -0,0 +1,58 @@ +package org.spongycastle.cms; + +import org.spongycastle.asn1.DEROctetString; +import org.spongycastle.asn1.cms.IssuerAndSerialNumber; +import org.spongycastle.asn1.cms.KeyTransRecipientInfo; +import org.spongycastle.asn1.cms.RecipientIdentifier; +import org.spongycastle.asn1.cms.RecipientInfo; +import org.spongycastle.operator.AsymmetricKeyWrapper; +import org.spongycastle.operator.GenericKey; +import org.spongycastle.operator.OperatorException; + +public abstract class KeyTransRecipientInfoGenerator + implements RecipientInfoGenerator +{ + protected final AsymmetricKeyWrapper wrapper; + + private IssuerAndSerialNumber issuerAndSerial; + private byte[] subjectKeyIdentifier; + + protected KeyTransRecipientInfoGenerator(IssuerAndSerialNumber issuerAndSerial, AsymmetricKeyWrapper wrapper) + { + this.issuerAndSerial = issuerAndSerial; + this.wrapper = wrapper; + } + + protected KeyTransRecipientInfoGenerator(byte[] subjectKeyIdentifier, AsymmetricKeyWrapper wrapper) + { + this.subjectKeyIdentifier = subjectKeyIdentifier; + this.wrapper = wrapper; + } + + public final RecipientInfo generate(GenericKey contentEncryptionKey) + throws CMSException + { + byte[] encryptedKeyBytes; + try + { + encryptedKeyBytes = wrapper.generateWrappedKey(contentEncryptionKey); + } + catch (OperatorException e) + { + throw new CMSException("exception wrapping content key: " + e.getMessage(), e); + } + + RecipientIdentifier recipId; + if (issuerAndSerial != null) + { + recipId = new RecipientIdentifier(issuerAndSerial); + } + else + { + recipId = new RecipientIdentifier(new DEROctetString(subjectKeyIdentifier)); + } + + return new RecipientInfo(new KeyTransRecipientInfo(recipId, wrapper.getAlgorithmIdentifier(), + new DEROctetString(encryptedKeyBytes))); + } +}
\ No newline at end of file |