Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
2538-public_key-Make-better-use-of-generate-rec...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2538-public_key-Make-better-use-of-generate-records-from-.patch of Package erlang
From 50184666099fb548de68bca0f926822e026a3761 Mon Sep 17 00:00:00 2001 From: Ingela Anderton Andin <ingela@erlang.org> Date: Fri, 30 Apr 2021 11:44:12 +0200 Subject: [PATCH 8/8] public_key: Make better use of generate records from ASN-1 --- lib/public_key/src/public_key.erl | 138 +++++++++++++++++------------- 1 file changed, 80 insertions(+), 58 deletions(-) diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl index 747b8d2211..e6150739bd 100644 --- a/lib/public_key/src/public_key.erl +++ b/lib/public_key/src/public_key.erl @@ -216,35 +216,32 @@ pem_entry_decode({Asn1Type, CryptDer, {Cipher, Salt}} = PemEntry, Entity :: term() . pem_entry_encode('SubjectPublicKeyInfo', Entity=#'RSAPublicKey'{}) -> - Der = der_encode('RSAPublicKey', Entity), - Spki = {'SubjectPublicKeyInfo', - {'AlgorithmIdentifier', ?'rsaEncryption', ?DER_NULL}, Der}, + KeyDer = der_encode('RSAPublicKey', Entity), + Spki = subject_public_key_info(#'AlgorithmIdentifier'{algorithm = ?'rsaEncryption', + parameters =?DER_NULL}, KeyDer), pem_entry_encode('SubjectPublicKeyInfo', Spki); pem_entry_encode('SubjectPublicKeyInfo', {DsaInt, Params=#'Dss-Parms'{}}) when is_integer(DsaInt) -> KeyDer = der_encode('DSAPublicKey', DsaInt), ParamDer = der_encode('DSAParams', {params, Params}), - Spki = {'SubjectPublicKeyInfo', - {'AlgorithmIdentifier', ?'id-dsa', ParamDer}, KeyDer}, + Spki = subject_public_key_info(#'AlgorithmIdentifier'{algorithm =?'id-dsa', + parameters = ParamDer}, + KeyDer), pem_entry_encode('SubjectPublicKeyInfo', Spki); pem_entry_encode('SubjectPublicKeyInfo', {#'ECPoint'{point = Key}, {namedCurve, ?'id-Ed25519' = ID}}) when is_binary(Key)-> - Spki = {'SubjectPublicKeyInfo', - {'AlgorithmIdentifier', ID, asn1_NOVALUE}, - Key}, + Spki = subject_public_key_info(#'AlgorithmIdentifier'{algorithm = ID}, Key), pem_entry_encode('SubjectPublicKeyInfo', Spki); pem_entry_encode('SubjectPublicKeyInfo', {#'ECPoint'{point = Key}, {namedCurve, ?'id-Ed448' = ID}}) when is_binary(Key)-> - Spki = {'SubjectPublicKeyInfo', - {'AlgorithmIdentifier', ID , asn1_NOVALUE}, - 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)-> Params = der_encode('EcpkParameters',ECParam), - Spki = {'SubjectPublicKeyInfo', - {'AlgorithmIdentifier', ?'id-ecPublicKey', Params}, - Key}, + Spki = subject_public_key_info(#'AlgorithmIdentifier'{algorithm =?'id-ecPublicKey', + parameters = Params}, + Key), pem_entry_encode('SubjectPublicKeyInfo', Spki); pem_entry_encode(Asn1Type, Entity) when is_atom(Asn1Type) -> Der = der_encode(Asn1Type, Entity), @@ -315,17 +312,24 @@ handle_pkcs_frame_error('PrivateKeyInfo', Der, _) -> handle_pkcs_frame_error(_, _, Error) -> erlang:error(Error). -der_priv_key_decode({'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', ?'id-ecPublicKey', {asn1_OPENTYPE, Parameters}}, PrivKey, _}) -> - EcPrivKey = der_decode('ECPrivateKey', PrivKey), - EcPrivKey#'ECPrivateKey'{parameters = der_decode('EcpkParameters', Parameters)}; -der_priv_key_decode({'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', CurveOId, _}, PrivKey, _}) when +der_priv_key_decode(#'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = + #'PrivateKeyInfo_privateKeyAlgorithm'{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(#'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm =#'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = CurveOId}, + privateKey = PrivKey}) when CurveOId == ?'id-Ed25519'orelse CurveOId == ?'id-Ed448' -> #'ECPrivateKey'{version = 1, parameters = {namedCurve, CurveOId}, privateKey = PrivKey}; -der_priv_key_decode({'OneAsymmetricKey', _, - {'OneAsymmetricKey_privateKeyAlgorithm', CurveOId, _}, PrivKey, Attr, PubKey}) when +der_priv_key_decode(#'OneAsymmetricKey'{ + privateKeyAlgorithm = #'OneAsymmetricKey_privateKeyAlgorithm'{algorithm = CurveOId}, + privateKey = PrivKey, + attributes = Attr, + publicKey = PubKey}) when CurveOId == ?'id-Ed25519'orelse CurveOId == ?'id-Ed448' -> #'ECPrivateKey'{version = 2, parameters = {namedCurve, CurveOId}, privateKey = PrivKey, @@ -340,13 +344,16 @@ der_priv_key_decode({'PrivateKeyInfo', v1, Key = der_decode('RSAPrivateKey', PrivKey), Params = der_decode('RSASSA-PSS-params', Parameters), {Key, Params}; -der_priv_key_decode({'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', ?'id-dsa', {asn1_OPENTYPE, Parameters}}, PrivKey, _}) -> - {params, #'Dss-Parms'{p=P, q=Q, g=G}} = der_decode('DSAParams', Parameters), - X = der_decode('Prime-p', PrivKey), - #'DSAPrivateKey'{p=P, q=Q, g=G, x=X}; +der_priv_key_decode(#'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'id-dsa', + parameters = + {asn1_OPENTYPE, Parameters}}, + privateKey = PrivKey}) -> + {params, #'Dss-Parms'{p=P, q=Q, g=G}} = der_decode('DSAParams', Parameters), + X = der_decode('Prime-p', PrivKey), + #'DSAPrivateKey'{p=P, q=Q, g=G, x=X}; der_priv_key_decode(PKCS8Key) -> - PKCS8Key. + PKCS8Key. %%-------------------------------------------------------------------- -spec der_encode(Asn1Type, Entity) -> Der when Asn1Type :: asn1_type(), @@ -356,49 +363,61 @@ der_priv_key_decode(PKCS8Key) -> %% Description: Encodes a public key entity with asn1 DER encoding. %%-------------------------------------------------------------------- der_encode('PrivateKeyInfo', #'DSAPrivateKey'{p=P, q=Q, g=G, x=X}) -> + Params = der_encode('Dss-Parms', #'Dss-Parms'{p=P, q=Q, g=G}), + Alg = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'id-dsa', + parameters = + {asn1_OPENTYPE, Params}}, + Key = der_encode('Prime-p', X), der_encode('PrivateKeyInfo', - {'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', ?'id-dsa', - {asn1_OPENTYPE, der_encode('Dss-Parms', #'Dss-Parms'{p=P, q=Q, g=G})}}, - der_encode('Prime-p', X), asn1_NOVALUE}); + #'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = Alg, + privateKey = Key}); der_encode('PrivateKeyInfo', #'RSAPrivateKey'{} = PrivKey) -> + Parms = ?DER_NULL, + Alg = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'rsaEncryption', + parameters = {asn1_OPENTYPE, Parms}}, + Key = der_encode('RSAPrivateKey', PrivKey), der_encode('PrivateKeyInfo', - {'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', ?'rsaEncryption', - {asn1_OPENTYPE, ?DER_NULL}}, - der_encode('RSAPrivateKey', PrivKey), asn1_NOVALUE}); + #'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = Alg, + privateKey = Key}); der_encode('PrivateKeyInfo', {#'RSAPrivateKey'{} = PrivKey, Parameters}) -> - der_encode('PrivateKeyInfo', - {'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', ?'id-RSASSA-PSS', - {asn1_OPENTYPE, der_encode('RSASSA-PSS-params', Parameters)}}, - der_encode('RSAPrivateKey', PrivKey), asn1_NOVALUE}); + Params = der_encode('RSASSA-PSS-params', Parameters), + Alg = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'id-RSASSA-PSS', + parameters = + {asn1_OPENTYPE, Params}}, + Key = der_encode('RSAPrivateKey', PrivKey), + der_encode('PrivateKeyInfo', #'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = Alg, + privateKey = Key}); der_encode('PrivateKeyInfo', #'ECPrivateKey'{parameters = {namedCurve, CurveOId}, - privateKey = PrivKey}) when + privateKey = Key}) when CurveOId == ?'id-Ed25519' orelse CurveOId == ?'id-Ed448' -> - der_encode('PrivateKeyInfo', - {'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', CurveOId, asn1_NOVALUE}, - PrivKey, asn1_NOVALUE}); + Alg = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = CurveOId}, + der_encode('PrivateKeyInfo', #'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = Alg, + privateKey = Key}); der_encode('PrivateKeyInfo', #'ECPrivateKey'{parameters = Parameters} = PrivKey) -> + Params = der_encode('EcpkParameters', Parameters), + Alg = #'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'id-ecPublicKey', + parameters = {asn1_OPENTYPE, Params}}, + Key = der_encode('ECPrivateKey', PrivKey#'ECPrivateKey'{parameters = asn1_NOVALUE}), der_encode('PrivateKeyInfo', - {'PrivateKeyInfo', v1, - {'PrivateKeyInfo_privateKeyAlgorithm', ?'id-ecPublicKey', - {asn1_OPENTYPE, der_encode('EcpkParameters', Parameters)}}, - der_encode('ECPrivateKey', PrivKey#'ECPrivateKey'{parameters = asn1_NOVALUE}), - asn1_NOVALUE}); + #'PrivateKeyInfo'{version = v1, + privateKeyAlgorithm = Alg, + privateKey = Key}); der_encode('OneAsymmetricKey', #'ECPrivateKey'{parameters = {namedCurve, CurveOId}, - privateKey = PrivKey, + privateKey = Key, attributes = Attr, publicKey = PubKey}) -> + Alg = #'OneAsymmetricKey_privateKeyAlgorithm'{algorithm = CurveOId}, der_encode('OneAsymmetricKey', - {'OneAsymmetricKey', 1, - {'OneAsymmetricKey_privateKeyAlgorithm', CurveOId, asn1_NOVALUE}, - PrivKey, - Attr, - PubKey - }); + #'OneAsymmetricKey'{version = 1, + privateKeyAlgorithm = Alg, + privateKey = Key, + attributes = Attr, + publicKey = PubKey}); der_encode(Asn1Type, Entity) when (Asn1Type == 'PrivateKeyInfo') orelse (Asn1Type == 'OneAsymmetricKey') orelse (Asn1Type == 'EncryptedPrivateKeyInfo') -> @@ -2005,3 +2024,6 @@ ocsp_status(Cert, IssuerCert, Responses) -> ocsp_responses(OCSPResponseDer, ResponderCerts, Nonce) -> pubkey_ocsp:verify_ocsp_response(OCSPResponseDer, ResponderCerts, Nonce). + +subject_public_key_info(Alg, PubKey) -> + #'OTPSubjectPublicKeyInfo'{algorithm = Alg, subjectPublicKey = PubKey}. -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor