Class PEMDecoder
PEMDecoder is a preview API of the Java platform.
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
Base64-encoded content 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
BinaryEncodablePREVIEW, 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:
PEMPREVIEW
PEMDecoder instance configured for decryption:
- ENCRYPTED PRIVATE KEY:
PrivateKeyorKeyPair(if the encoding contains a public key)
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 PEMPREVIEW 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 withFactoriesOf(Provider) or withDecryption(char[]).
The withFactoriesOf(Provider) method uses the specified provider when
obtaining KeyFactory and CertificateFactory instances used
during decoding. The withDecryption(char[]) method configures the
decoder to decrypt and decode encrypted private key PEM data using the given
password. If decryption fails, a CryptoExceptionPREVIEW 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.
The BinaryEncodable interface may evolve. When using a decode method
with switch, always include a default case rather than
relying on the classes specified in the permits clause to remain fixed.
An exhaustive switch may result in a MatchException.
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).
withFactoriesOf(provider);
BinaryEncodable pemData = pd.decode(privKeyPEM);
- Implementation Note:
- This implementation decodes non-encrypted RSA PRIVATE KEY as
PrivateKey, X509 CERTIFICATE and X.509 CERTIFICATE asX509Certificate, and CRL asX509CRL. Other implementations may recognize additional PEM types. - Since:
- 25
- External Specifications
- See Also:
-
Method Summary
Modifier and TypeMethodDescriptiondecode(InputStream is) Decodes and returns aBinaryEncodablefrom the givenInputStream.<S extends BinaryEncodablePREVIEW>
Sdecode(InputStream is, Class<S> tClass) Decodes and returns aBinaryEncodableof the specified class from the givenInputStream.Decodes and returns aBinaryEncodablefrom the givenString.<S extends BinaryEncodablePREVIEW>
SDecodes and returns aBinaryEncodableof the specified class from the given PEM string.static PEMDecoderPREVIEWof()Returns the defaultPEMDecoderinstance.withDecryption(char[] password) Returns a copy of thisPEMDecoderthat decodes and decrypts encrypted private keys using the specified password.withFactoriesOf(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.The input is interpreted as
UTF-8.- Parameters:
str- aStringcontaining PEM data- Returns:
- a
BinaryEncodable - Throws:
IllegalArgumentException- if decoding fails or no PEM data is foundNullPointerException- ifstrisnullCryptoExceptionPREVIEW- if an error occurs during decryption- Since:
- 27
-
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- if an I/O error occurs or PEM syntax is invalidEOFException- if no PEM data is found or the stream ends unexpectedlyIllegalArgumentException- if decoding failsNullPointerException- ifInputStreamisnullCryptoExceptionPREVIEW- if an error occurs during decryption- Since:
- 27
-
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.The input is interpreted as
UTF-8.- Type Parameters:
S- class type parameter that extendsBinaryEncodable- 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- if any input values arenullCryptoExceptionPREVIEW- if an error occurs during decryption- Since:
- 27
-
decode
public <S extends BinaryEncodablePREVIEW> S decode(InputStream is, Class<S> tClass) throws IOException Decodes and returns aBinaryEncodableof the specified class from 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 stream position may become inconsistent. Further decoding operations on the sameInputStreamare not recommended.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.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- if an I/O error occurs or PEM syntax is invalidEOFException- if no PEM data is found or the stream ends unexpectedlyIllegalArgumentException- if decoding failsClassCastException- iftClassdoes not represent the PEM typeNullPointerException- if any input values arenullCryptoExceptionPREVIEW- if an error occurs during decryption- Since:
- 27
- See Also:
-
withFactoriesOf
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- Since:
- 27
-
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
-
PEMDecoderwhen preview features are enabled.