File 2231-public_key-Update-included-macros-and-records-in-pub.patch of Package erlang

From 75884b33cc76abc35b462c497b65bc9d541d1672 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Thu, 15 May 2025 09:15:30 +0200
Subject: [PATCH] public_key: Update included macros and records in public
 include file

Retain backwards compatibility.
---
 lib/public_key/include/public_key.hrl      | 153 +++++++++++++++++----
 lib/public_key/src/Makefile                |   1 +
 lib/public_key/src/pubkey_pbe.erl          |  21 +--
 lib/public_key/src/pubkey_pem.erl          |  17 +--
 lib/public_key/src/pubkey_translation.erl  |  10 +-
 lib/public_key/src/public_key.erl          |  66 ++++-----
 lib/public_key/src/public_key_internal.hrl |  18 +++
 7 files changed, 197 insertions(+), 89 deletions(-)

diff --git a/lib/public_key/include/public_key.hrl b/lib/public_key/include/public_key.hrl
index 55ffa989e9..52e68282b1 100644
--- a/lib/public_key/include/public_key.hrl
+++ b/lib/public_key/include/public_key.hrl
@@ -200,12 +200,6 @@
          extensions = asn1_NOVALUE
         }).
 
--record('AlgorithmIdentifier',
-        {
-         algorithm,
-         parameters = asn1_NOVALUE
-        }).
-
 %%%
 %%% Erlang alternate representation of PKIX certificate
 %%%
@@ -237,32 +231,17 @@
          parameters = asn1_NOVALUE
         }).
 
--define('id-dsa-with-sha1', {1,2,840,10040,4,3}).
--define('id-dsaWithSHA1', {1,3,14,3,2,27}).     %Probably obsolete.
--define('md2WithRSAEncryption', {1,2,840,113549,1,1,2}).
--define('md5WithRSAEncryption', {1,2,840,113549,1,1,4}).
--define('sha1WithRSAEncryption', {1,2,840,113549,1,1,5}).
--define('sha-1WithRSAEncryption', {1,3,14,3,2,29}). %Probably obsolete.
--define('sha224WithRSAEncryption', {1,2,840,113549,1,1,14}).
--define('sha256WithRSAEncryption', {1,2,840,113549,1,1,11}).
--define('sha512WithRSAEncryption', {1,2,840,113549,1,1,13}).
--define('ecdsa-with-SHA1', {1,2,840,10045,4,1}).
 
-%% Undocumented but used by test suite.
--define('id-dsa-with-sha224', {2,16,840,1,101,3,4,3,1}).
--define('id-dsa-with-sha256', {2,16,840,1,101,3,4,3,2}).
+%% Hash functions
+
 -define('id-sha1', {1,3,14,3,2,26}).
 -define('id-sha224', {2,16,840,1,101,3,4,2,4}).
 -define('id-sha256', {2,16,840,1,101,3,4,2,1}).
 -define('id-sha384', {2,16,840,1,101,3,4,2,2}).
 -define('id-sha512', {2,16,840,1,101,3,4,2,3}).
--define('sha384WithRSAEncryption', {1,2,840,113549,1,1,12}).
--define('id-RSASSA-PSS', {1,2,840,113549,1,1,10}).
--define('ecdsa-with-SHA256', {1,2,840,10045,4,3,2}).
--define('ecdsa-with-SHA384', {1,2,840,10045,4,3,3}).
--define('ecdsa-with-SHA512', {1,2,840,10045,4,3,4}).
--define('rSASSA-PSS-Default-Identifier', {'RSASSA-AlgorithmIdentifier',{1,2,840,113549,1,1,10},{'RSASSA-PSS-params',{'HashAlgorithm',{1,3,14,3,2,26},'NULL'},{'MaskGenAlgorithm',{1,2,840,113549,1,1,8},{'HashAlgorithm',{1,3,14,3,2,26},'NULL'}},20,1}}).
--define('id-mgf1', {1,2,840,113549,1,1,8}).
+
+
+
 
 -record('AttributeTypeAndValue',
         {
@@ -285,7 +264,8 @@
 -define('id-at-serialNumber', {2,5,4,5}).
 -define('id-at-pseudonym', {2,5,4,65}).
 
-%% Not documented but used by the test suite.
+%% Should we document ?
+-define('id-domainComponent', {0,9,2342,19200300,100,1,25}).
 -define('id-emailAddress', {1,2,840,113549,1,9,1}).
 -define('id-at-organizationalUnitName', {2,5,4,11}).
 
@@ -305,20 +285,59 @@
          subjectPublicKey
         }).
 
+%% OTP certificate  format
 -record('PublicKeyAlgorithm',
         {
          algorithm,
          parameters = asn1_NOVALUE
         }).
 
+%% plain certificate format
+-record('AlgorithmIdentifier',
+        {
+         algorithm,
+         parameters = asn1_NOVALUE
+        }).
+
+
 %%%
 %%% Public-key algorithms
 %%%
+
+%% Digital signatures
+%% Modern
+-define('id-RSASSA-PSS', {1,2,840,113549,1,1,10}).
+-define('rSASSA-PSS-Default-Identifier', {'RSASSA-AlgorithmIdentifier',{1,2,840,113549,1,1,10},{'RSASSA-PSS-params',{'HashAlgorithm',{1,3,14,3,2,26},'NULL'},{'MaskGenAlgorithm',{1,2,840,113549,1,1,8},{'HashAlgorithm',{1,3,14,3,2,26},'NULL'}},20,1}}).
+-define('id-mgf1', {1,2,840,113549,1,1,8}).
+-define('id-ecPublicKey', {1,2,840,10045,2,1}).
+-define('ecdsa-with-SHA256', {1,2,840,10045,4,3,2}).
+-define('ecdsa-with-SHA384', {1,2,840,10045,4,3,3}).
+-define('ecdsa-with-SHA512', {1,2,840,10045,4,3,4}).
+
+%% Legacy
 -define('rsaEncryption', {1,2,840,113549,1,1,1}).
+-define('md2WithRSAEncryption', {1,2,840,113549,1,1,2}).
+-define('md5WithRSAEncryption', {1,2,840,113549,1,1,4}).
+-define('sha1WithRSAEncryption', {1,2,840,113549,1,1,5}).
+-define('sha224WithRSAEncryption', {1,2,840,113549,1,1,14}).
+-define('sha256WithRSAEncryption', {1,2,840,113549,1,1,11}).
+-define('sha384WithRSAEncryption', {1,2,840,113549,1,1,12}).
+-define('sha512WithRSAEncryption', {1,2,840,113549,1,1,13}).
+-define('sha512-224WithRSAEncryption', {1,2,840,113549,1,1,15}).
+-define('sha512-256WithRSAEncryption', {1,2,840,113549,1,1,16}).
+-define('sha-1WithRSAEncryption', {1,3,14,3,2,29}).
+-define('id-hmacWithSHA1', {1,2,840,113549,2,7}).
+-define('ecdsa-with-SHA1', {1,2,840,10045,4,1}).
 -define('id-dsa', {1,2,840,10040,4,1}).
+-define('id-dsaWithSHA1', {1,3,14,3,2,27}).
+-define('id-dsa-with-sha1', {1,2,840,10040,4,3}).
+-define('id-dsa-with-sha224', {2,16,840,1,101,3,4,3,1}).
+-define('id-dsa-with-sha256', {2,16,840,1,101,3,4,3,2}).
+
+%% Key exchange
 -define('dhpublicnumber', {1,2,840,10046,2,1}).
 -define('id-keyExchangeAlgorithm', {2,16,840,1,101,2,1,1,22}).
--define('id-ecPublicKey', {1,2,840,10045,2,1}).
+
 
 -record('Extension',
         {
@@ -672,6 +691,8 @@
         }).
 
 -define('id-pkix-ocsp-nonce', {1,3,6,1,5,5,7,48,1,2}).
+-define('id-ad-ocsp', {1,3,6,1,5,5,7,48,1}).
+-define('id-pe-authorityInfoAccess', {1,3,6,1,5,5,7,1,1}).
 
 %%%
 %%% Undocumented but used by SSL.
@@ -699,11 +720,83 @@
          parameters = asn1_NOVALUE
         }).
 
-%% used by SSL test suite
+-record('EncryptedPrivateKeyInfo', 
+        {
+         encryptionAlgorithm,
+         encryptedData
+        }).
 
+-record('EncryptedPrivateKeyInfo_encryptionAlgorithm',
+        {algorithm,
+         parameters
+        }).
+
+-record('OneAsymmetricKey', {
+  version,
+  privateKeyAlgorithm,
+  privateKey,
+  attributes = asn1_NOVALUE,
+  %% with extensions
+  publicKey = asn1_NOVALUE
+  %% end of extensions
+}).
+
+%% Password based encryption
+-define('id-PBES2', {1,2,840,113549,1,5,13}).
 -define('id-PBKDF2', {1,2,840,113549,1,5,12}).
--define('id-hmacWithSHA1', {1,2,840,113549,2,7}).
+
+-define('id-hmacWithSHA224', {1,2,840,113549,2,8}).
+-define('id-hmacWithSHA256', {1,2,840,113549,2,9}).
+-define('id-hmacWithSHA384', {1,2,840,113549,2,10}).
+-define('id-hmacWithSHA512', {1,2,840,113549,2,11}).
+
+-define('id-aes128-CBC', {2,16,840,1,101,3,4,1,2}).
+-define('id-aes192-CBC', {2,16,840,1,101,3,4,1,22}).
 -define('id-aes256-CBC', {2,16,840,1,101,3,4,1,42}).
+-define('rc2CBC', {1,2,840,113549,3,2}).
+
+-record('RC2-CBC-Parameter', {
+  rc2ParameterVersion = asn1_NOVALUE,
+  iv
+}).
+
+-record('PBES2-params', {
+  keyDerivationFunc,
+  encryptionScheme
+}).
+
+-record('PBES2-params_keyDerivationFunc', {
+  algorithm,
+  parameters = asn1_NOVALUE
+}).
+
+-record('PBES2-params_encryptionScheme', {
+  algorithm,
+  parameters = asn1_NOVALUE
+}).
+
+-record('PBEParameter', {
+  salt,
+  iterationCount
+}).
+
+-record('PBKDF2-params', {
+  salt,
+  iterationCount,
+  keyLength = asn1_NOVALUE,
+  prf = asn1_DEFAULT
+}).
+
+-record('PBKDF2-params_prf', {
+  algorithm,
+  parameters = asn1_NOVALUE
+}).
+
+-record('EncryptionAlgorithmIdentifier', {
+  algorithm,
+  parameters = asn1_NOVALUE
+}).
+
 
 %%%
 %%% Undocumented but used by SSH.
diff --git a/lib/public_key/src/Makefile b/lib/public_key/src/Makefile
index 9649c8b83b..ae0d380df7 100644
--- a/lib/public_key/src/Makefile
+++ b/lib/public_key/src/Makefile
@@ -93,6 +93,7 @@ ERL_COMPILE_FLAGS += $(PUB_KEY_ERL_FLAGS) \
 $(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(HRL_FILES)
 
 $(EBIN)/pubkey_ssh.$(EMULATOR): pubkey_moduli.hrl
+$(TARGET_FILES): $(HRL_FILES)
 
 pubkey_moduli.hrl: ../priv/moduli
 	escript ../priv/convert.escript $< $@
diff --git a/lib/public_key/src/pubkey_pbe.erl b/lib/public_key/src/pubkey_pbe.erl
index 242f42397d..9347a22d68 100644
--- a/lib/public_key/src/pubkey_pbe.erl
+++ b/lib/public_key/src/pubkey_pbe.erl
@@ -25,18 +25,19 @@
 -moduledoc false.
 
 -include("PKCS-FRAME.hrl").
-
 -include("PKCS-1.hrl").
-
--define('id-aes128-CBC', {2,16,840,1,101,3,4,1,2}).
--define('id-aes192-CBC', {2,16,840,1,101,3,4,1,22}).
--define('id-aes256-CBC', {2,16,840,1,101,3,4,1,42}).
+-include("CMSAesRsaesOaep-2009.hrl").
 
 -export([encode/4, decode/4, decrypt_parameters/1, encrypt_parameters/1]). 
 -export([pbdkdf1/4, pbdkdf2/7]).
 
 -define(ASN1_OCTET_STR_TAG, 4).
 
+-record('EncryptedPrivateKeyInfo_encryptionAlgorithm',
+        {algorithm,
+         parameters
+        }).
+
 %%====================================================================
 %% Internal application API
 %%====================================================================
@@ -114,17 +115,17 @@ pbdkdf2(Password, Salt, Count, DerivedKeyLen, Prf, PrfHash, PrfOutputLen)->
     blocks(NumBlocks, NumLastBlockOctets, 1, Password, Salt, 
 	   Count, Prf, PrfHash, PrfOutputLen, <<>>).
 %%--------------------------------------------------------------------
--spec decrypt_parameters(#'EncryptionAlgorithmIdentifier'{}) ->
+-spec decrypt_parameters(#'EncryptedPrivateKeyInfo_encryptionAlgorithm'{}) ->
           {Cipher::string(), #'PBES2-params'{}}.
 
 %% Description: Performs ANS1-decoding of encryption parameters.
 %%--------------------------------------------------------------------
-decrypt_parameters(#'EncryptionAlgorithmIdentifier'{
+decrypt_parameters(#'EncryptedPrivateKeyInfo_encryptionAlgorithm'{
 		      algorithm = Oid, parameters = Param}) ->
     decrypt_parameters(Oid, decode_handle_open_type_wrapper(Param)).
 %%--------------------------------------------------------------------
 -spec encrypt_parameters({Cipher::string(), Params::term()}) -> 
-          #'EncryptionAlgorithmIdentifier'{}.
+          #'EncryptedPrivateKeyInfo_encryptionAlgorithm'{}.
 %%
 %% Description: Performs ANS1-decoding of encryption parameters.
 %%--------------------------------------------------------------------
@@ -211,13 +212,13 @@ decrypt_parameters(?'pbeWithMD5AndDES-CBC', DekParams) ->
 
 encrypt_parameters(_Cipher, #'PBES2-params'{} = Params) ->
     {ok, Der} ='PKCS-FRAME':encode('PBES2-params', Params),
-    #'EncryptionAlgorithmIdentifier'{
+    #'EncryptedPrivateKeyInfo_encryptionAlgorithm'{
        algorithm = ?'id-PBES2', 
        parameters = encode_handle_open_type_wrapper(Der)};
 
 encrypt_parameters(Cipher, {#'PBEParameter'{} = Params, Hash}) ->
     {ok, Der} ='PKCS-FRAME':encode('PBEParameter', Params),
-    #'EncryptionAlgorithmIdentifier'{
+    #'EncryptedPrivateKeyInfo_encryptionAlgorithm'{
        algorithm = pbe1_oid(Cipher, Hash), 
        parameters = encode_handle_open_type_wrapper(Der)}.
 
diff --git a/lib/public_key/src/pubkey_pem.erl b/lib/public_key/src/pubkey_pem.erl
index 527c9b888a..f5232ec01a 100644
--- a/lib/public_key/src/pubkey_pem.erl
+++ b/lib/public_key/src/pubkey_pem.erl
@@ -44,22 +44,7 @@
 -module(pubkey_pem).
 -moduledoc false.
 
--record('PBEParameter', {
-  salt,
-  iterationCount
-}).
-
--record('PBES2-params', {
-  keyDerivationFunc,
-  encryptionScheme
-}).
-
--record('EncryptedPrivateKeyInfo', {
-  encryptionAlgorithm,
-  encryptedData
-}).
-
--include("public_key.hrl").
+-include("PKCS-FRAME.hrl").
 
 -export([encode/1, decode/1, decipher/2, cipher/3]).
 
diff --git a/lib/public_key/src/pubkey_translation.erl b/lib/public_key/src/pubkey_translation.erl
index c4fdd0d54b..9323f9acce 100644
--- a/lib/public_key/src/pubkey_translation.erl
+++ b/lib/public_key/src/pubkey_translation.erl
@@ -31,7 +31,8 @@ decode(#'SubjectPublicKeyInfo'{algorithm=AlgId0,subjectPublicKey=Key}) ->
     #'SubjectPublicKeyInfo_algorithm'{algorithm=AlgId1,parameters=Params1} = AlgId0,
     AlgId = decode(AlgId1),
     Params = decode(Params1),
-    #'SubjectPublicKeyInfo'{algorithm={'PublicKeyAlgorithm', AlgId, Params},
+    %% Documented as AlgorithmIdentifier in plain
+    #'SubjectPublicKeyInfo'{algorithm={'AlgorithmIdentifier', AlgId, Params},
                             subjectPublicKey=Key};
 decode(#'DSA-Params'{p=P,q=Q,g=G}) ->
     {params, #'Dss-Parms'{p=P,q=Q,g=G}};
@@ -46,6 +47,8 @@ decode({'OneAsymmetricKey', Vsn, KeyAlg, PrivKey, Attrs, PubKey} = Orig) ->   %%
         v1 -> {'PrivateKeyInfo', Vsn, KeyAlg, PrivKey, Attrs, PubKey};
         _  -> Orig
     end;
+decode({'EncryptionAlgorithmIdentifier', Algo, Params}) ->
+    {'EncryptedPrivateKeyInfo_encryptionAlgorithm', Algo, Params};
 decode(Tuple) when is_tuple(Tuple) ->
     case is_simple_tuple(Tuple) of
         true ->
@@ -61,7 +64,8 @@ decode(Other) ->
 decode_list(List) ->
     [decode(E) || E <- List].
 
-encode(#'SubjectPublicKeyInfo'{algorithm={'PublicKeyAlgorithm', AlgId0, Params},
+%% Documented as AlgorithmIdentifier in plain
+encode(#'SubjectPublicKeyInfo'{algorithm={'AlgorithmIdentifier', AlgId0, Params},
                                subjectPublicKey=Key}) ->
     AlgId1 = encode(AlgId0),
     Params1 = encode(Params),
@@ -77,6 +81,8 @@ encode({params, #'Dss-Parms'{p=P,q=Q,g=G}}) ->
     #'DSA-Params'{p=P,q=Q,g=G};
 encode({'Dss-Sig-Value', R,S}) ->
     #'DSA-Sig-Value'{r = R, s = S};
+encode({'EncryptedPrivateKeyInfo_encryptionAlgorithm', Algo, Params}) ->
+    {'EncryptionAlgorithmIdentifier', Algo, Params};
 encode(Tuple) when is_tuple(Tuple) ->
     case is_simple_tuple(Tuple) of
         true ->
diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index 2c0b445144..f2b33ffa97 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -396,7 +396,7 @@ pem_encode(PemEntries) when is_list(PemEntries) ->
 -spec pem_entry_decode(PemEntry) -> term() when PemEntry :: pem_entry() .
 
 pem_entry_decode({'SubjectPublicKeyInfo', Der, _}) ->
-    {_, {'PublicKeyAlgorithm', AlgId, Params0}, Key0} =
+    {_, {'AlgorithmIdentifier', AlgId, Params0}, Key0} =
         der_decode('SubjectPublicKeyInfo', Der),
 
     KeyType = pubkey_cert_records:supportedPublicKeyAlgorithms(AlgId),
@@ -475,11 +475,11 @@ pem_entry_encode('SubjectPublicKeyInfo',
 pem_entry_encode('SubjectPublicKeyInfo',
 		 {#'ECPoint'{point = Key}, {namedCurve, ID}})
   when is_binary(Key), ID =:= ?'id-Ed448' orelse ID =:= ?'id-Ed25519' ->
-    Spki = subject_public_key_info(#'PublicKeyAlgorithm'{algorithm = ID}, Key),
+    Spki = subject_public_key_info(#'AlgorithmIdentifier'{algorithm = ID}, Key),
     pem_entry_encode('SubjectPublicKeyInfo', Spki);
 pem_entry_encode('SubjectPublicKeyInfo',
 		 {#'ECPoint'{point = Key}, ECParam}) when is_binary(Key)->
-    Spki = subject_public_key_info(#'PublicKeyAlgorithm'{algorithm =?'id-ecPublicKey',
+    Spki = subject_public_key_info(#'AlgorithmIdentifier'{algorithm =?'id-ecPublicKey',
                                                          parameters = ECParam},
                                    Key),
     pem_entry_encode('SubjectPublicKeyInfo', Spki);
@@ -540,7 +540,8 @@ der_decode(Asn1Type, Der) when (((Asn1Type == 'PrivateKeyInfo')
                                    (Asn1Type == 'EncryptedPrivateKeyInfo'))
                                 andalso is_binary(Der)) ->
     try
-	{ok, Decoded} = 'PKCS-FRAME':decode(Asn1Type, Der),
+	{ok, Decoded0} = 'PKCS-FRAME':decode(Asn1Type, Der),
+        Decoded = pubkey_translation:decode(Decoded0),
 	der_priv_key_decode(Decoded)
     catch
 	error:{badmatch, {error, _}} = Error ->
@@ -594,6 +595,7 @@ get_asn1_module('ContentInfo') -> 'CryptographicMessageSyntax-2009';
 get_asn1_module('CurvePrivateKey') -> 'Safecurves-pkix-18';
 get_asn1_module('DHParameter') -> 'PKCS-3';
 get_asn1_module('ECPrivateKey') -> 'ECPrivateKey';
+get_asn1_module('ECParameters') -> 'PKIXAlgs-2009';
 get_asn1_module('DSA-Params') -> 'PKIXAlgs-2009';
 get_asn1_module('DSAPrivateKey') -> 'DSS';
 get_asn1_module('DSAPublicKey') -> 'PKIXAlgs-2009';
@@ -613,7 +615,8 @@ get_asn1_module('GeneralNames') -> 'PKIX1Implicit-2009'.
 
 handle_pkcs_frame_error('PrivateKeyInfo', Der, _) ->
     try
-	{ok, Decoded} = 'PKCS-FRAME':decode('OneAsymmetricKey', Der),
+	{ok, Decoded0} = 'PKCS-FRAME':decode('OneAsymmetricKey', Der),
+        Decoded = pubkey_translation:decode(Decoded0),
 	der_priv_key_decode(Decoded)
     catch
 	error:{badmatch, {error, _}} = Error ->
@@ -627,14 +630,14 @@ handle_pkcs_frame_error(_, _, Error) ->
 -define(dsa_private_key_type, 'DSAPublicKey').
 
 %% NOTE: No longer defined in modern ASN.1 specs.
-der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
+der_priv_key_decode(#'PrivateKeyInfo'{version = v1,
                                         privateKeyAlgorithm =
                                             #'PrivateKeyAlgorithmIdentifier'{algorithm = ?'id-ecPublicKey',
                                                                              parameters = {asn1_OPENTYPE, Parameters}},
                                         privateKey = PrivKey}) ->
     EcPrivKey = der_decode('ECPrivateKey', PrivKey),
     EcPrivKey#'ECPrivateKey'{parameters = der_decode('EcpkParameters', Parameters)};
-der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
+der_priv_key_decode(#'PrivateKeyInfo'{version = v1,
                                         privateKeyAlgorithm =
                                             #'PrivateKeyAlgorithmIdentifier'{algorithm = CurveOId},
                                         privateKey = CurvePrivKey}) when
@@ -642,23 +645,12 @@ der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
       CurveOId == ?'id-Ed448' ->
     PrivKey = der_decode('CurvePrivateKey', CurvePrivKey),
     #'ECPrivateKey'{version = 1, parameters = {namedCurve, CurveOId}, privateKey = PrivKey};
-der_priv_key_decode(#'OneAsymmetricKey'{
-                       privateKeyAlgorithm = #'PrivateKeyAlgorithmIdentifier'{algorithm = CurveOId},
-                       privateKey = CurvePrivKey,
-                       attributes = Attr,
-                       publicKey = PubKey}) when
-      CurveOId == ?'id-Ed25519'orelse
-      CurveOId == ?'id-Ed448' ->
-    PrivKey = der_decode('CurvePrivateKey', CurvePrivKey),
-    #'ECPrivateKey'{version = 2, parameters = {namedCurve, CurveOId}, privateKey = PrivKey,
-                    attributes = Attr,
-                    publicKey = PubKey};
-der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
+der_priv_key_decode(#'PrivateKeyInfo'{version = v1,
                                         privateKeyAlgorithm =
                                             #'PrivateKeyAlgorithmIdentifier'{algorithm = ?'rsaEncryption'},
                                         privateKey = PrivKey}) ->
     der_decode('RSAPrivateKey', PrivKey);
-der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
+der_priv_key_decode(#'PrivateKeyInfo'{version = v1,
                                         privateKeyAlgorithm =
                                             #'PrivateKeyAlgorithmIdentifier'{algorithm = ?'id-RSASSA-PSS',
                                                                              parameters = {asn1_OPENTYPE, Parameters}},
@@ -666,7 +658,7 @@ der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
     Key = der_decode('RSAPrivateKey', PrivKey),
     Params = der_decode('RSASSA-PSS-params', Parameters),
     {Key, Params};
-der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
+der_priv_key_decode(#'PrivateKeyInfo'{version = v1,
                                         privateKeyAlgorithm =
                                             #'PrivateKeyAlgorithmIdentifier'{algorithm = ?'id-RSASSA-PSS',
                                                                              parameters = asn1_NOVALUE},
@@ -674,7 +666,7 @@ der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
     Key = der_decode('RSAPrivateKey', PrivKey),
     #'RSASSA-AlgorithmIdentifier'{parameters = Params} = ?'rSASSA-PSS-Default-Identifier',
     {Key, Params};
-der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
+der_priv_key_decode(#'PrivateKeyInfo'{version = v1,
                                         privateKeyAlgorithm =
                                             #'PrivateKeyAlgorithmIdentifier'{algorithm = ?'id-dsa',
                                                                              parameters =
@@ -683,6 +675,17 @@ der_priv_key_decode(#'OneAsymmetricKey'{version = v1,
     {ok, #'DSA-Params'{p=P, q=Q, g=G}} = 'PKIXAlgs-2009':decode('DSA-Params', Parameters),
     X = der_decode(?dsa_private_key_type, PrivKey),
     #'DSAPrivateKey'{version=1, p=P, q=Q, g=G, x=X};
+der_priv_key_decode(#'OneAsymmetricKey'{
+                       privateKeyAlgorithm = #'PrivateKeyAlgorithmIdentifier'{algorithm = CurveOId},
+                       privateKey = CurvePrivKey,
+                       attributes = Attr,
+                       publicKey = PubKey}) when
+      CurveOId == ?'id-Ed25519'orelse
+      CurveOId == ?'id-Ed448' ->
+    PrivKey = der_decode('CurvePrivateKey', CurvePrivKey),
+    #'ECPrivateKey'{version = 2, parameters = {namedCurve, CurveOId}, privateKey = PrivKey,
+                    attributes = Attr,
+                    publicKey = PubKey};
 der_priv_key_decode(PKCS8Key) ->
     PKCS8Key.
 
@@ -770,16 +773,17 @@ der_encode('OneAsymmetricKey', #'ECPrivateKey'{parameters = {namedCurve, CurveOI
                                    privateKey = Key,
                                    attributes = Attr,
                                    publicKey = PubKey});
-der_encode(Asn1Type, Entity) when (Asn1Type == 'PrivateKeyInfo') orelse
-                                  (Asn1Type == 'OneAsymmetricKey') orelse
-				  (Asn1Type == 'EncryptedPrivateKeyInfo') ->
-     try
-         {ok, Encoded} = 'PKCS-FRAME':encode(Asn1Type, Entity),
-         Encoded
-     catch
+der_encode(Asn1Type, Entity0) when (Asn1Type == 'PrivateKeyInfo') orelse
+                                   (Asn1Type == 'OneAsymmetricKey') orelse
+                                   (Asn1Type == 'EncryptedPrivateKeyInfo') ->
+    try
+        Entity = pubkey_translation:encode(Entity0),
+        {ok, Encoded} = 'PKCS-FRAME':encode(Asn1Type, Entity),
+        Encoded
+    catch
 	error:{badmatch, {error, _}} = Error ->
-             erlang:error(Error)
-     end;
+            erlang:error(Error)
+    end;
 der_encode('EcpkParameters', {namedCurve,_}=Entity) ->
     try
 	{ok, Encoded} = 'PKIXAlgs-2009':encode('ECParameters', Entity),
diff --git a/lib/public_key/src/public_key_internal.hrl b/lib/public_key/src/public_key_internal.hrl
index f1f0ea664f..50074b0e2a 100644
--- a/lib/public_key/src/public_key_internal.hrl
+++ b/lib/public_key/src/public_key_internal.hrl
@@ -195,6 +195,18 @@
          encryptionScheme
         }).
 
+
+-record('PrivateKeyInfo',
+        {
+         version,
+         privateKeyAlgorithm,
+         privateKey,
+         attributes = asn1_NOVALUE,
+         %% with extensions
+         publicKey = asn1_NOVALUE
+         %% end of extensions
+        }).
+
 -record('OneAsymmetricKey',
         {
          version,
@@ -212,6 +224,12 @@
          parameters = asn1_NOVALUE
         }).
 
+-record('PrivateKeyInfo_privateKeyAlgorithm',
+       {
+        algorithm,
+        parameters = asn1_NOVALUE
+       }).
+
 -record('OTPSubjectPublicKeyInfo',
         {
          algorithm,       % #'PublicKeyAlgorithm'{}
-- 
2.43.0

openSUSE Build Service is sponsored by