|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--iaik.pkcs.pkcs7.EncryptedDataStream | +--iaik.pkcs.pkcs7.EncryptedData
This class represents the non-stream implemention of the PKCS#7
EncryptedData
type.
Each PKCS#7 content type is associated with a specific object identifier, derived from:
pkcs-7 OBJECT IDENTIFIER ::= { iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) 7 }
The object identifier for the EncryptedData
content type is
defined as:
encryptedData OBJECT IDENTIFIER ::= { pkcs-7 6 }
which corresponds to the OID string "1.2.840.1.113549.1.7.6".
The PKCS#7
Cryptographic Message Standard specifies the EncryptedData
content type for providing a syntax for building encrypted contents. The
encrypted-data content type consists of encrypted content of any type (Version 1.5):
EncryptedData ::= SEQUENCE { version Version, encryptedContentInfo EncryptedContentInfo }
The encryptedContentInfo
field specifies the type of the content
being encrypted, the content-encryption algorithm used for encrypting the content,
and the result of the content encryption. If the encrypted content value
is not present in the encryptedContent
field, it has to be
supplied by other means:
EncryptedContentInfo ::= SEQUENCE { contentType ContentType, contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier, encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL }
EncryptedContent ::= OCTET STRING
The key that is used for encrypting the content is not included in the
EncryptedData
structure, it is assumed to be managed by other
means.
When creating a new EncryptedData
instance
the encrypted content has to be supplied as EncryptedContentInfo
object.
Example:
//create a EncryptedContentInfo for the data to be encrypted, supplied as byte array: byte[] data = ...; EncryptedContentInfo eci = new EncryptedContentInfo(ObjectID.pkcs7_data, data); //generate secret key and use it for encrypting the content : SecretKey key = eci.setupCipher(AlgorithmID.des_EDE3_CBC); //create an EncryptedData for the EncryptedContentInfo: EncryptedData encrypted_data = new EncryptedData(eci); //Prepare the EncryptedData for transmission by transforming it into an ASN1Object or //immediately performing the DER encoding: ASN1Object = encrypted_data.toASN1Object(); //respectively byte[] encoding = encrypted_data.getEncoded();For initiating a constructed encoding of the inherent encrypted content, use the corresponding
writeTo
method of the parent
EncryptedDataStream
class,
or set a positive blocksize value for the inherent EncryptedContentInfo by means of
the setBlockSize
method of the EncryptedContentInfo
class.
If a positive blocksize is specified, the encrypted content of the inherent
EncryptedContentInfo will be encoded as indefinite primitive
octet string instead of using the default primitive definite encoding scheme:
0x24 0x80 0x04 <blocksize> <first encrypted content block> 0x04 <blocksize> <second encrypted content block> 0x04 <blocksize> <third encrypted content block> ... 0x00 0x00instead of:
0x04 <length> <encrypted content>The indefinte constrcuted encoding scheme may be preferable when intending to be compatible to the encoding practice of some particular application (for instance some versions of Netscape Navigator).
Decrypting goes the reverse way: From the DER encoded encryptedData
a new EncryptedData
is created and parsed for the inherent
EncryptedContentInfo
. From the EncryptedContentInfo
the encrypted content is obtained and decrypted using the same secret key:
//if the EncryptedData is given as DER encoding, first decode it to an ASN1Object: ASN1Object obj = DerCoder.decode(encoding); EncryptedData encryptedData = new EncryptedDataStream(obj); EncryptedContentInfo eci = (EncryptedContentInfo)encryptedData.getEncryptedContentInfo(); //decrypt the encrypted content using the right secret key: eci.setupCipher(key); //get the recovered data: byte[] data = eci.getContent();
This class additonally supports specific constructors and methods allowing to easily use
the EncryptedData content type for password based encrypting data -- the intended
usage of PKCS#7 EncryptedData. Please remark that the follwoing proceeding only
may be used when doing a password based encryption. In all other situations you
have to follow the way described above. However, you also may create your
own EncryptedContentInfo
even when doing a PBE encryption.
If you want to use PBE encryption but not creating an EncryptedContentInfo
by yourself you first have to supply the data to be read from an
byte array, subsequently setup the cipher for PBE-encryption and finally call
a toASN1Object
, getEncoded
or writeTo
method
for preparing the EncryptedData object for transmission by transforming it into an
ASN1Object or immediately encoding it, e.g.:
EncryptedData(byte[] data)
constructor for
creating a new EncryptedData
object and supplying the data to be
encrypted from a byte array:
//the data to be encrypted supplied from a byte array: byte[] data = ...; EncryptedData encrypted_data = new EncryptedData(data);
setupCipher(AlgorithmID contentEA, char[] password)
thereby specifying the PBE-algorithm to be
used and the password, e.g.:
AlgorithmID pbeAlgorithm = AlgorithmID.pbeWithSHAAnd3_KeyTripleDES_CBC; char[] password = ...; encrypted_data.setupCipher(pbeAlgorithm, password);
toASN1Object
method, the latter by using the
getEncoded
method:
ASN1Object obj = encrypted_data.toASN1Object();respectively
byte[] encoding = encrypted_data.getEncoded();You alternatively may use a proper
writeTo
method of the parent
EncryptedDataStream
class for immediately
encoding this EncryptedData object to an output stream.
When a positve block size is specified for encoding the EncryptedData to a stream,
the encrypted content is BER encoded as indefinite constructed octet string being
composed of a series of definite primitive encoded octet strings of
blockSize
length:
0x24 0x80 0x04 <blocksize> <first encrypted content block> 0x04 <blocksize> <second encrypted content block> 0x04 <blocksize> <third encrypted content block> ... 0x00 0x00instead of:
0x04 <length> <encrypted content>The indefinte constrcuted encoding scheme also may be preferable when intending to be compatible to the encoding practice of some particular application (for instance some versions of Netscape Navigator).
EncryptedData(ASN1Object obj)
constructor to parse
the internal structure. Before reading the recovered content by
means of the getInputStream
method, the cipher has to be
initialized for decryption with the password by calling the setupCipher(char[] password)
method:
EncryptedDataStream encrypted_data = new EncryptedDataStream(encoded_stream);
EncryptedContentInfoStream eci = (EncryptedContentInfoStream)encrypted_data.getEncryptedContentInfo(); System.out.println("Content type: "+eci.getContentType().getName()); System.out.println("Content encryption algorithm: "+eci.getContentEncryptionAlgorithm().getName());
char[] password = ...; encrypted_data.setupCipher(password);Unlike the stream supporting
EncryptedDataStream
class where the setupCipher
method
only initializes the cipher for decryption, whole the encrypted-content decryption
already is performed inside the setupCipher
method of this class.
byte[] content = encrypted_data.getContent();
EncryptedContentInfo
Fields inherited from class iaik.pkcs.pkcs7.EncryptedDataStream |
block_size, version |
Constructor Summary | |
protected |
EncryptedData()
Default constructor for dynamic object creation in ContentInfo. |
|
EncryptedData(ASN1Object obj)
Creates an EncryptedData object from the given ASN1 object. |
|
EncryptedData(byte[] data)
Creates a new PKCS#7 EncryptedData object where the content to be encrypted is read from the supplied byte array. |
|
EncryptedData(EncryptedContentInfo encryptedContentInfo)
Creates a PKCS#7 EncryptedData from an EncryptedContentInfo. |
|
EncryptedData(InputStream is)
Creates a new EncryptedData where the DER encoded data is read from the given InputStream. |
Method Summary | |
void |
decode(ASN1Object obj)
Decodes the given EncryptedData ASN1 object. |
void |
decode(InputStream is)
Reads and decodes the EncryptedData from a DerInputStream. |
byte[] |
getContent()
Returns the content as byte array. |
byte[] |
getEncoded()
Returns the DER encoding of this EncryptedData in a byte array. |
Object |
getEncryptedContentInfo()
Returns the encrypted content info of this EncryptedData
object.
|
InputStream |
getInputStream()
Returns an InputStream for reading the content. |
void |
setupCipher(AlgorithmID contentEA,
char[] password,
int iterationCount)
Setups the cipher for PBE-encrypting the content. |
void |
setupCipher(char[] password)
Uses the given password to setup the cipher for decrypting the content. |
protected ASN1Object |
toASN1Object(int blockSize)
Returns this PKCS#7 EncryptedData as ASN1Object where a constructed
OCTET STRING is used for encoding the encrypted content. |
String |
toString(boolean detailed)
Returns a string giving some - if requested - detailed information about this EncryptedData object. |
Methods inherited from class iaik.pkcs.pkcs7.EncryptedDataStream |
getBlockSize, getContentType, getVersion, setBlockSize, setupCipher, toASN1Object, toString, writeTo, writeTo |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Methods inherited from interface iaik.pkcs.pkcs7.ContentStream |
getBlockSize, getContentType, setBlockSize, toASN1Object |
Constructor Detail |
protected EncryptedData()
public EncryptedData(EncryptedContentInfo encryptedContentInfo)
encryptedContentInfo
- the already created encrypted content infopublic EncryptedData(byte[] data)
This constructor only shall be used when intending to PBE encrypt the
data by subsequently calling method setupCipher
thereby supplying PBE-algorithm and
password to be used.
This constructor shall not be used in situations where the desired content
encryption algorithm is not a PBE algorithm. In such cases the EncryptedData(EncryptedContentInfo)
constructor shall be used to be supplied with a precomputed EncryptedContentInfo.
Consult the EncryptedContentInfo
class documentation for more information about
EncryptedContentInfo handling.
data
- the byte array containing the data to encryptpublic EncryptedData(ASN1Object obj) throws PKCSParsingException
The ASN1Object supplied to this constructor represents an already
exisiting EncryptedData
object that may have
been created by calling toASN1Object
.
obj
- the ASN1Object representing an already exisiting EncryptedData object.PKCSParsingException
- if an error occurs when parsing the given ASN1Objectpublic EncryptedData(InputStream is) throws IOException, PKCSParsingException
is
- the InputStream holding a DER encoded PKCS#7 EncryptedData objectIOException
- if an I/O error occurs during reading from the InputStreamPKCSParsingException
- if an error occurs while parsing the objectMethod Detail |
public void decode(ASN1Object obj) throws PKCSParsingException
decode
in interface Content
obj
- the ASN1Object representing an already exisiting EncryptedData objectPKCSParsingException
- if an error occurs when parsing the given ASN1Objectpublic void decode(InputStream is) throws IOException, PKCSParsingException
DerInputStream
,
internally a DerInputStream is created before parsing the data.decode
in interface ContentStream
decode
in class EncryptedDataStream
is
- the InputStream holding a DER encoded PKCS#7 EncryptedData objectIOException
- if an I/O error occurs during reading from the InputStreamPKCSParsingException
- if an error occurs while parsing the objectpublic void setupCipher(AlgorithmID contentEA, char[] password, int iterationCount) throws NoSuchAlgorithmException, InvalidKeyException
EncryptedData
object by means of the EncryptedData(byte[])
constructor.
EncryptedDataStream
class, where the cipher only is initialized, in this class this method already
performs the content encryption.
The iterationCount
parameter has the following meaning: when deriving
the symmetric key and the IV a hash is calculated iterationCount times
on the password and on the salt thus increasing the cost for breaking
the cipher using brute force methods.
setupCipher
in class EncryptedDataStream
contentEA
- the PBE-algorithm to be usedpassword
- the passworditerationCount
- the iteration count for key derivationNoSuchAlgorithmException
- if the algorithm is not supportedInvalidKeyException
- if the key cannot be derived from the passwordpublic void setupCipher(char[] password) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidParameterSpecException, InvalidKeyException
Unlike the stream supporting EncryptedDataStream
class where the setupCipher
method
only initializes the cipher for decryption, whole the encrypted-content decryption
already is performed inside the setupCipher
method of this class.
Attention! This method only can be used when the content
has been encrypted using a PBE cipher. Otherwise the setupCipher(Key key, AlgorithmParameterSpec)
method of the EncryptedContentInfo
class has to be used to setup the cipher for content decryption.
setupCipher
in class EncryptedDataStream
password
- the passwordNoSuchAlgorithmException
- if the algorithm is not supportedInvalidKeyException
- if the key cannot be derived from the passwordInvalidAlgorithmParameterException
- if the paramters cannot be retrieved
from the algorithm IDInvalidParameterSpecException
- if the paramters cannot be set uppublic InputStream getInputStream()
The returned content depends on whether creating a new EncryptedData or parsing an existing one:
getInputStream
method
of the parent EncryptedDataStream
class for returning the content of this EncryptedData
object. There should be
no real necessity for using this method since the content bytes immediately
can be obtained by the getContent
method.
However, in contrast to the equivalent getInputStream
method of the
parent EncryptedDataStream
class, this method may be called arbitrarly
often; it only returns a ByteArrayInputStream that is initialized with the content
bytes.getInputStream
in class EncryptedDataStream
public byte[] getContent()
The returned content depends on whether creating a new EncryptedData or parsing an existing one:
protected ASN1Object toASN1Object(int blockSize) throws PKCSException
EncryptedData
as ASN1Object where a constructed
OCTET STRING is used for encoding the encrypted content.toASN1Object
in class EncryptedDataStream
blockSize
- the block size defining the encoding scheme - and specifying the
length of each primitive encoded octet string component, if positiveEncryptedData
as ASN1ObjectPKCSException
- if the ASN1Object could not be createdpublic Object getEncryptedContentInfo()
EncryptedData
object.
When calling this method for obtaining the inherent EncryptedContentInfo
an explicit cast to EncryptedContentInfo
has to be made:
EncryptedContentInfo eci = (EncryptedContentInfo)encrypted_data.getEncryptedContentInfo();
getEncryptedContentInfo
in class EncryptedDataStream
public byte[] getEncoded() throws PKCSException
EncryptedContentInfo
structure has been set to a positive value, the encrypted content is
encoded as indefinite constructed octet string being composed of a certain
number of definite primitive encoded octet strings of blockSize
length. If no - or a not-positive - blockSize value has been specified
whole the encrypted content will be encoded as definite primitive octet string.PKCSException
- if an error occurs during the encoding procedurepublic String toString(boolean detailed)
EncryptedData
object.toString
in interface ContentStream
toString
in class EncryptedDataStream
detailed
- - whether or not to give detailed information
|
This Javadoc may contain text parts from Internet Standard specifications (RFC 2459, 3280, 3039, 2560, 1521, 821, 822, 2253, 1319, 1321, ,2630, 2631, 2268, 3058, 2984, 2104, 2144, 2040, 2311, 2279, see copyright note) and RSA Data Security Public-Key Cryptography Standards (PKCS#1,3,5,7,8,9,10,12, see copyright note). | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |