Class PEMDecoder
PEMDecoder implements a decoder for Privacy-Enhanced Mail (PEM) data.
PEM is a textual encoding used to store and transfer cryptographic
objects, such as asymmetric keys, certificates, and certificate revocation
lists (CRLs). It is defined in RFC 1421 and RFC 7468. PEM consists of a
Base64-encoded binary encoding enclosed by a type-identifying header
and footer.
The decode(String) and decode(InputStream) methods
return an instance of a class that matches the PEM type and implements
BinaryEncodable, as follows:
- CERTIFICATE :
X509Certificate - X509 CRL :
X509CRL - PUBLIC KEY :
PublicKey - PRIVATE KEY :
PrivateKeyorKeyPair(if the encoding contains a public key) - ENCRYPTED PRIVATE KEY :
EncryptedPrivateKeyInfo - Other types :
PEM
PEMDecoder instance configured for decryption:
- ENCRYPTED PRIVATE KEY :
PrivateKeyorKeyPair(if the encoding contains a public key)
For PublicKey and PrivateKey types, algorithm-specific
subclasses are returned if supported, such as ECPublicKey or
ECPrivateKey for Elliptic Curve keys.
If the PEM type has no corresponding class, decode(String) and
decode(InputStream) will return a PEM object.
The decode(String, Class) and decode(InputStream, Class)
methods accept a class parameter specifying the desired BinaryEncodable
type. These methods avoid the need for casting and are useful when multiple
representations are possible. For example, if the PEM contains both public and
private keys, specifying PrivateKey.class returns only the private key.
If X509EncodedKeySpec.class is provided, the public key encoding is
returned as a X509EncodedKeySpec. To retrieve a PEM object,
use PEM.class. If the specified class does not
match the PEM content, a ClassCastException is thrown.
In addition to the types listed above, these methods support the
following PEM types and BinaryEncodable classes when specified as
parameters:
- PUBLIC KEY :
X509EncodedKeySpec - PRIVATE KEY :
PKCS8EncodedKeySpec - PRIVATE KEY :
PublicKey(if the encoding contains a public key) - PRIVATE KEY :
X509EncodedKeySpec(if the encoding contains a public key)
PEMDecoder instance configured for decryption:
- ENCRYPTED PRIVATE KEY :
PKCS8EncodedKeySpec - ENCRYPTED PRIVATE KEY :
PublicKey(if the encoding contains a public key) - ENCRYPTED PRIVATE KEY :
X509EncodedKeySpec(if the encoding contains a public key)
A new PEMDecoder instance is created when configured
with withFactory(Provider) or withDecryption(char[]).
The withFactory(Provider) method uses the specified provider
to produce cryptographic objects from KeyFactory and
CertificateFactory. The withDecryption(char[]) method configures the
decoder to decrypt and decode encrypted private key PEM data using the given
password. If decryption fails, an IllegalArgumentException is thrown.
If an encrypted PEM is processed by a decoder not configured
for decryption, an EncryptedPrivateKeyInfo is returned.
A PEMDecoder configured for decryption can also decode unencrypted PEM.
This class is immutable and thread-safe.
Example: decode a private key:
PEMDecoder pd = PEMDecoder.of();
PrivateKey priKey = pd.decode(priKeyPEM, PrivateKey.class);
Example: configure decryption and a factory provider:
PEMDecoder pd = PEMDecoder.of().withDecryption(password).
withFactory(provider);
BinaryEncodable pemData = pd.decode(privKeyPEM);
- Implementation Note:
- This implementation decodes RSA PRIVATE KEY as
PrivateKey, X509 CERTIFICATE and X.509 CERTIFICATE asX509Certificate, and CRL asX509CRL. Other implementations may recognize additional PEM types. - Since:
- 27
- External Specifications
- See Also:
-
Method Summary
Modifier and TypeMethodDescriptiondecode(InputStream is) Decodes and returns aBinaryEncodablefrom the givenInputStream.<S extends BinaryEncodable>
Sdecode(InputStream is, Class<S> tClass) Decodes and returns aBinaryEncodableof the specified class for the givenInputStream.Decodes and returns aBinaryEncodablefrom the givenString.<S extends BinaryEncodable>
SDecodes and returns aBinaryEncodableof the specified class from the given PEM string.static PEMDecoderof()Returns the defaultPEMDecoderinstance.withDecryption(char[] password) Returns a copy of thisPEMDecoderthat decodes and decrypts encrypted private keys using the specified password.withFactory(Provider provider) Returns a copy of thisPEMDecoderinstance that usesKeyFactoryandCertificateFactoryimplementations from the specifiedProviderto produce cryptographic objects.Methods declared in class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitModifier and TypeMethodDescriptionprotected Objectclone()Creates and returns a copy of this object.booleanIndicates whether some other object is "equal to" this one.protected voidfinalize()Deprecated, for removal: This API element is subject to removal in a future version.Finalization is deprecated and subject to removal in a future release.final Class<?> getClass()Returns the runtime class of thisObject.inthashCode()Returns a hash code value for this object.final voidnotify()Wakes up a single thread that is waiting on this object's monitor.final voidWakes up all threads that are waiting on this object's monitor.toString()Returns a string representation of the object.final voidwait()Causes the current thread to wait until it is awakened, typically by being notified or interrupted.final voidwait(long timeoutMillis) Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.final voidwait(long timeoutMillis, int nanos) Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.
-
Method Details
-
of
Returns the defaultPEMDecoderinstance.- Returns:
- the default
PEMDecoder
-
decode
Decodes and returns aBinaryEncodablefrom the givenString.This method reads the
Stringuntil PEM data is found or the end of theStringis reached. If no PEM data is found, anIllegalArgumentExceptionis thrown.A
BinaryEncodableis returned that best represents the decoded content. If the PEM type is not supported, aPEMobject is returned containing the type identifier, Base64-encoded data, and any leading data preceding the PEM header. ForBinaryEncodabletypes other thanPEM, leading data is ignored.Input consumed by this method is read in as
UTF-8.- Parameters:
str- aStringcontaining PEM data- Returns:
- a
BinaryEncodable - Throws:
IllegalArgumentException- if decoding fails or no PEM data is foundNullPointerException- ifstrisnullCryptoException- if an error occurs during decryption
-
decode
Decodes and returns aBinaryEncodablefrom the givenInputStream.This method reads from the
InputStreamuntil the end of a PEM footer or the end of the stream. If an I/O error occurs, the stream position may become inconsistent. Further decoding operations on the sameInputStreamare not recommended.A
BinaryEncodableis returned that best represents the decoded content. If the PEM type is not supported, aPEMobject is returned containing the type identifier, Base64-encoded data, and any leading data preceding the PEM header. ForBinaryEncodabletypes other thanPEM, leading data is ignored.If no PEM data is found, an
EOFExceptionis thrown.- Parameters:
is-InputStreamcontaining PEM data- Returns:
- a
BinaryEncodable - Throws:
IOException- on IO or PEM syntax error where theInputStreamdid not complete decodingEOFException- if no PEM data is found or the stream ends unexpectedlyIllegalArgumentException- if decoding failsNullPointerException- whenisisnullCryptoException- if an error occurs during decryption
-
decode
Decodes and returns aBinaryEncodableof the specified class from the given PEM string.tClassmust be an appropriate class for the PEM type.This method reads the
Stringuntil PEM data is found or the end of theStringis reached. If no PEM data is found, anIllegalArgumentExceptionis thrown.If
tClassisPEM.class, aPEMobject is returned containing the type identifier, Base64-encoded data, and any leading data preceding the PEM header. ForBinaryEncodabletypes other thanPEM, leading data is ignored.Input consumed by this method is read in as
UTF-8.- Type Parameters:
S- the requestedBinaryEncodabletype- Parameters:
str- theStringcontaining PEM datatClass- the returned object class that extends or implementsBinaryEncodable- Returns:
- a
BinaryEncodablespecified bytClass - Throws:
IllegalArgumentException- on error in decoding or no PEM data foundClassCastException- iftClassdoes not represent the PEM typeNullPointerException- when any input values arenullCryptoException- if an error occurs during decryption
-
decode
Decodes and returns aBinaryEncodableof the specified class for the givenInputStream.tClassmust be an appropriate class for the PEM type.This method reads from the
InputStreamuntil the end of a PEM footer or the end of the stream. If an I/O error occurs, the read position in the stream may become inconsistent. It is recommended to perform no further decoding operations on theInputStream.If the class parameter is
PEM.class, aPEMobject is returned containing the type identifier, Base64-encoded data, and any leading data preceding the PEM header. ForBinaryEncodabletypes other thanPEM, leading data is ignored and not returned as part of theBinaryEncodableobject.If no PEM data is found, an
EOFExceptionis thrown.- Type Parameters:
S- class type parameter that extendsBinaryEncodable- Parameters:
is- anInputStreamcontaining PEM datatClass- the returned object class that extends or implementsBinaryEncodable- Returns:
- a
BinaryEncodableof typetClass - Throws:
IOException- on IO or PEM syntax error where theInputStreamdid not complete decodingEOFException- if no PEM data is found or the stream ends unexpectedlyIllegalArgumentException- if decoding failsClassCastException- iftClassdoes not represent the PEM typeNullPointerException- if any input values arenullCryptoException- if an error occurs during decryption- See Also:
-
withFactory
Returns a copy of thisPEMDecoderinstance that usesKeyFactoryandCertificateFactoryimplementations from the specifiedProviderto produce cryptographic objects. Any errors using theProviderwill occur during decoding.- Parameters:
provider- the factoryProvider- Returns:
- a new
PEMDecoderinstance configured with theProvider - Throws:
NullPointerException- ifproviderisnull
-
withDecryption
Returns a copy of thisPEMDecoderthat decodes and decrypts encrypted private keys using the specified password. Unencrypted PEM can also be decoded by the returned instance.- Parameters:
password- the password to decrypt the encrypted PEM data. This array is cloned and stored in the new instance.- Returns:
- a new
PEMDecoderinstance configured for decryption - Throws:
NullPointerException- ifpasswordisnull
-