%% Generated by the Erlang ASN.1 BER compiler. Version: 5.0.13 %% Purpose: Encoding and decoding of the types in CertificateExtensions. -module('CertificateExtensions'). -compile(nowarn_unused_vars). -dialyzer(no_improper_lists). -dialyzer(no_match). -include("CertificateExtensions.hrl"). -asn1_info([{vsn,'5.0.13'}, {module,'CertificateExtensions'}, {options,[warnings,ber,errors, {cwd,"/home/maxim/depot/synrc/ca/priv/kep"}, {outdir,"/home/maxim/depot/synrc/ca/priv/kep"}, {i,"."}, {i,"/home/maxim/depot/synrc/ca/priv/kep"}]}]). -export([encoding_rule/0,maps/0,bit_string_format/0, legacy_erlang_types/0]). -export(['dialyzer-suppressions'/1]). -export([ enc_AuthorityKeyIdentifier/2, enc_KeyIdentifier/2, enc_SubjectKeyIdentifier/2, enc_KeyUsage/2, enc_KeyPurposeId/2, enc_PrivateKeyUsagePeriod/2, enc_CertificatePoliciesSyntax/2, enc_PolicyInformation/2, enc_CertPolicyId/2, enc_PolicyQualifierInfo/2, enc_PolicyMappingsSyntax/2, enc_SupportedAlgorithm/2, enc_GeneralNames/2, enc_GeneralName/2, enc_EDIPartyName/2, enc_AttributesSyntax/2, enc_BasicConstraintsSyntax/2, enc_NameConstraintsSyntax/2, enc_GeneralSubtrees/2, enc_GeneralSubtree/2, enc_BaseDistance/2, enc_NameForms/2, enc_BasicNameForms/2, enc_PolicyConstraintsSyntax/2, enc_SkipCerts/2, enc_CertPolicySet/2, enc_CRLNumber/2, enc_CRLReason/2, enc_HoldInstruction/2, enc_CRLDistPointsSyntax/2, enc_DistributionPoint/2, enc_DistributionPointName/2, enc_ReasonFlags/2, enc_IssuingDistPointSyntax/2, enc_BaseCRLNumber/2, enc_CertificateExactAssertion/2, enc_CertificateAssertion/2, enc_AltNameType/2, enc_CertificatePairExactAssertion/2, enc_CertificatePairAssertion/2, enc_CertificateListExactAssertion/2, enc_CertificateListAssertion/2, 'enc_INSTANCE OF'/2 ]). -export([ dec_AuthorityKeyIdentifier/2, dec_KeyIdentifier/2, dec_SubjectKeyIdentifier/2, dec_KeyUsage/2, dec_KeyPurposeId/2, dec_PrivateKeyUsagePeriod/2, dec_CertificatePoliciesSyntax/2, dec_PolicyInformation/2, dec_CertPolicyId/2, dec_PolicyQualifierInfo/2, dec_PolicyMappingsSyntax/2, dec_SupportedAlgorithm/2, dec_GeneralNames/2, dec_GeneralName/2, dec_EDIPartyName/2, dec_AttributesSyntax/2, dec_BasicConstraintsSyntax/2, dec_NameConstraintsSyntax/2, dec_GeneralSubtrees/2, dec_GeneralSubtree/2, dec_BaseDistance/2, dec_NameForms/2, dec_BasicNameForms/2, dec_PolicyConstraintsSyntax/2, dec_SkipCerts/2, dec_CertPolicySet/2, dec_CRLNumber/2, dec_CRLReason/2, dec_HoldInstruction/2, dec_CRLDistPointsSyntax/2, dec_DistributionPoint/2, dec_DistributionPointName/2, dec_ReasonFlags/2, dec_IssuingDistPointSyntax/2, dec_BaseCRLNumber/2, dec_CertificateExactAssertion/2, dec_CertificateAssertion/2, dec_AltNameType/2, dec_CertificatePairExactAssertion/2, dec_CertificatePairAssertion/2, dec_CertificateListExactAssertion/2, dec_CertificateListAssertion/2, 'dec_INSTANCE OF'/2 ]). -export([ enc_authorityKeyIdentifier/3, enc_subjectKeyIdentifier/3, enc_keyUsage/3, enc_extKeyUsage/3, enc_privateKeyUsagePeriod/3, enc_certificatePolicies/3, enc_policyMappings/3, enc_supportedAlgorithms/3, enc_subjectAltName/3, enc_issuerAltName/3, enc_subjectDirectoryAttributes/3, enc_basicConstraints/3, enc_nameConstraints/3, enc_policyConstraints/3, enc_cRLNumber/3, enc_reasonCode/3, enc_instructionCode/3, enc_invalidityDate/3, enc_cRLDistributionPoints/3, enc_issuingDistributionPoint/3, enc_certificateIssuer/3, enc_deltaCRLIndicator/3, enc_deltaRevocationList/3, enc_certificateExactMatch/3, enc_certificateMatch/3, enc_certificatePairExactMatch/3, enc_certificatePairMatch/3, enc_certificateListExactMatch/3, enc_certificateListMatch/3, enc_algorithmIdentifierMatch/3 ]). -export([ dec_authorityKeyIdentifier/3, dec_subjectKeyIdentifier/3, dec_keyUsage/3, dec_extKeyUsage/3, dec_privateKeyUsagePeriod/3, dec_certificatePolicies/3, dec_policyMappings/3, dec_supportedAlgorithms/3, dec_subjectAltName/3, dec_issuerAltName/3, dec_subjectDirectoryAttributes/3, dec_basicConstraints/3, dec_nameConstraints/3, dec_policyConstraints/3, dec_cRLNumber/3, dec_reasonCode/3, dec_instructionCode/3, dec_invalidityDate/3, dec_cRLDistributionPoints/3, dec_issuingDistributionPoint/3, dec_certificateIssuer/3, dec_deltaCRLIndicator/3, dec_deltaRevocationList/3, dec_certificateExactMatch/3, dec_certificateMatch/3, dec_certificatePairExactMatch/3, dec_certificatePairMatch/3, dec_certificateListExactMatch/3, dec_certificateListMatch/3, dec_algorithmIdentifierMatch/3 ]). -export([ getenc_SupportedPolicyQualifiers/1 ]). -export([ getdec_SupportedPolicyQualifiers/1 ]). -export([ 'id-at-supportedAlgorithms'/0, 'id-at-deltaRevocationList'/0, 'id-ce-subjectDirectoryAttributes'/0, 'id-ce-subjectKeyIdentifier'/0, 'id-ce-keyUsage'/0, 'id-ce-privateKeyUsagePeriod'/0, 'id-ce-subjectAltName'/0, 'id-ce-issuerAltName'/0, 'id-ce-basicConstraints'/0, 'id-ce-cRLNumber'/0, 'id-ce-reasonCode'/0, 'id-ce-instructionCode'/0, 'id-ce-invalidityDate'/0, 'id-ce-deltaCRLIndicator'/0, 'id-ce-issuingDistributionPoint'/0, 'id-ce-certificateIssuer'/0, 'id-ce-nameConstraint'/0, 'id-ce-cRLDistributionPoints'/0, 'id-ce-certificatePolicies'/0, 'id-ce-policyMappings'/0, 'id-ce-authorityKeyIdentifier'/0, 'id-ce-policyConstraints'/0, 'id-ce-extKeyUsage'/0, 'id-mr-certificateExactMatch'/0, 'id-mr-certificateMatch'/0, 'id-mr-certificatePairExactMatch'/0, 'id-mr-certificatePairMatch'/0, 'id-mr-certificateListExactMatch'/0, 'id-mr-certificateListMatch'/0, 'id-mr-algorithmIdentifierMatch'/0, 'id-ce-inhibitAnyPolicy'/0 ]). -export([info/0]). -export([encode/2,decode/2]). encoding_rule() -> ber. maps() -> false. bit_string_format() -> bitstring. legacy_erlang_types() -> false. encode(Type, Data) -> try iolist_to_binary(element(1, encode_disp(Type, Data))) of Bytes -> {ok,Bytes} catch Class:Exception:Stk when Class =:= error; Class =:= exit -> case Exception of {error,{asn1,Reason}} -> {error,{asn1,{Reason,Stk}}}; Reason -> {error,{asn1,{Reason,Stk}}} end end. decode(Type, Data) -> try Result = decode_disp(Type, element(1, ber_decode_nif(Data))), {ok,Result} catch Class:Exception:Stk when Class =:= error; Class =:= exit -> case Exception of {error,{asn1,Reason}} -> {error,{asn1,{Reason,Stk}}}; Reason -> {error,{asn1,{Reason,Stk}}} end end. encode_disp('AuthorityKeyIdentifier', Data) -> enc_AuthorityKeyIdentifier(Data); encode_disp('KeyIdentifier', Data) -> enc_KeyIdentifier(Data); encode_disp('SubjectKeyIdentifier', Data) -> enc_SubjectKeyIdentifier(Data); encode_disp('KeyUsage', Data) -> enc_KeyUsage(Data); encode_disp('KeyPurposeId', Data) -> enc_KeyPurposeId(Data); encode_disp('PrivateKeyUsagePeriod', Data) -> enc_PrivateKeyUsagePeriod(Data); encode_disp('CertificatePoliciesSyntax', Data) -> enc_CertificatePoliciesSyntax(Data); encode_disp('PolicyInformation', Data) -> enc_PolicyInformation(Data); encode_disp('CertPolicyId', Data) -> enc_CertPolicyId(Data); encode_disp('PolicyQualifierInfo', Data) -> enc_PolicyQualifierInfo(Data); encode_disp('PolicyMappingsSyntax', Data) -> enc_PolicyMappingsSyntax(Data); encode_disp('SupportedAlgorithm', Data) -> enc_SupportedAlgorithm(Data); encode_disp('GeneralNames', Data) -> enc_GeneralNames(Data); encode_disp('GeneralName', Data) -> enc_GeneralName(Data); encode_disp('EDIPartyName', Data) -> enc_EDIPartyName(Data); encode_disp('AttributesSyntax', Data) -> enc_AttributesSyntax(Data); encode_disp('BasicConstraintsSyntax', Data) -> enc_BasicConstraintsSyntax(Data); encode_disp('NameConstraintsSyntax', Data) -> enc_NameConstraintsSyntax(Data); encode_disp('GeneralSubtrees', Data) -> enc_GeneralSubtrees(Data); encode_disp('GeneralSubtree', Data) -> enc_GeneralSubtree(Data); encode_disp('BaseDistance', Data) -> enc_BaseDistance(Data); encode_disp('NameForms', Data) -> enc_NameForms(Data); encode_disp('BasicNameForms', Data) -> enc_BasicNameForms(Data); encode_disp('PolicyConstraintsSyntax', Data) -> enc_PolicyConstraintsSyntax(Data); encode_disp('SkipCerts', Data) -> enc_SkipCerts(Data); encode_disp('CertPolicySet', Data) -> enc_CertPolicySet(Data); encode_disp('CRLNumber', Data) -> enc_CRLNumber(Data); encode_disp('CRLReason', Data) -> enc_CRLReason(Data); encode_disp('HoldInstruction', Data) -> enc_HoldInstruction(Data); encode_disp('CRLDistPointsSyntax', Data) -> enc_CRLDistPointsSyntax(Data); encode_disp('DistributionPoint', Data) -> enc_DistributionPoint(Data); encode_disp('DistributionPointName', Data) -> enc_DistributionPointName(Data); encode_disp('ReasonFlags', Data) -> enc_ReasonFlags(Data); encode_disp('IssuingDistPointSyntax', Data) -> enc_IssuingDistPointSyntax(Data); encode_disp('BaseCRLNumber', Data) -> enc_BaseCRLNumber(Data); encode_disp('CertificateExactAssertion', Data) -> enc_CertificateExactAssertion(Data); encode_disp('CertificateAssertion', Data) -> enc_CertificateAssertion(Data); encode_disp('AltNameType', Data) -> enc_AltNameType(Data); encode_disp('CertificatePairExactAssertion', Data) -> enc_CertificatePairExactAssertion(Data); encode_disp('CertificatePairAssertion', Data) -> enc_CertificatePairAssertion(Data); encode_disp('CertificateListExactAssertion', Data) -> enc_CertificateListExactAssertion(Data); encode_disp('CertificateListAssertion', Data) -> enc_CertificateListAssertion(Data); encode_disp('INSTANCE OF', Data) -> 'enc_INSTANCE OF'(Data); encode_disp(Type, _Data) -> exit({error,{asn1,{undefined_type,Type}}}). decode_disp('AuthorityKeyIdentifier', Data) -> dec_AuthorityKeyIdentifier(Data); decode_disp('KeyIdentifier', Data) -> dec_KeyIdentifier(Data); decode_disp('SubjectKeyIdentifier', Data) -> dec_SubjectKeyIdentifier(Data); decode_disp('KeyUsage', Data) -> dec_KeyUsage(Data); decode_disp('KeyPurposeId', Data) -> dec_KeyPurposeId(Data); decode_disp('PrivateKeyUsagePeriod', Data) -> dec_PrivateKeyUsagePeriod(Data); decode_disp('CertificatePoliciesSyntax', Data) -> dec_CertificatePoliciesSyntax(Data); decode_disp('PolicyInformation', Data) -> dec_PolicyInformation(Data); decode_disp('CertPolicyId', Data) -> dec_CertPolicyId(Data); decode_disp('PolicyQualifierInfo', Data) -> dec_PolicyQualifierInfo(Data); decode_disp('PolicyMappingsSyntax', Data) -> dec_PolicyMappingsSyntax(Data); decode_disp('SupportedAlgorithm', Data) -> dec_SupportedAlgorithm(Data); decode_disp('GeneralNames', Data) -> dec_GeneralNames(Data); decode_disp('GeneralName', Data) -> dec_GeneralName(Data); decode_disp('EDIPartyName', Data) -> dec_EDIPartyName(Data); decode_disp('AttributesSyntax', Data) -> dec_AttributesSyntax(Data); decode_disp('BasicConstraintsSyntax', Data) -> dec_BasicConstraintsSyntax(Data); decode_disp('NameConstraintsSyntax', Data) -> dec_NameConstraintsSyntax(Data); decode_disp('GeneralSubtrees', Data) -> dec_GeneralSubtrees(Data); decode_disp('GeneralSubtree', Data) -> dec_GeneralSubtree(Data); decode_disp('BaseDistance', Data) -> dec_BaseDistance(Data); decode_disp('NameForms', Data) -> dec_NameForms(Data); decode_disp('BasicNameForms', Data) -> dec_BasicNameForms(Data); decode_disp('PolicyConstraintsSyntax', Data) -> dec_PolicyConstraintsSyntax(Data); decode_disp('SkipCerts', Data) -> dec_SkipCerts(Data); decode_disp('CertPolicySet', Data) -> dec_CertPolicySet(Data); decode_disp('CRLNumber', Data) -> dec_CRLNumber(Data); decode_disp('CRLReason', Data) -> dec_CRLReason(Data); decode_disp('HoldInstruction', Data) -> dec_HoldInstruction(Data); decode_disp('CRLDistPointsSyntax', Data) -> dec_CRLDistPointsSyntax(Data); decode_disp('DistributionPoint', Data) -> dec_DistributionPoint(Data); decode_disp('DistributionPointName', Data) -> dec_DistributionPointName(Data); decode_disp('ReasonFlags', Data) -> dec_ReasonFlags(Data); decode_disp('IssuingDistPointSyntax', Data) -> dec_IssuingDistPointSyntax(Data); decode_disp('BaseCRLNumber', Data) -> dec_BaseCRLNumber(Data); decode_disp('CertificateExactAssertion', Data) -> dec_CertificateExactAssertion(Data); decode_disp('CertificateAssertion', Data) -> dec_CertificateAssertion(Data); decode_disp('AltNameType', Data) -> dec_AltNameType(Data); decode_disp('CertificatePairExactAssertion', Data) -> dec_CertificatePairExactAssertion(Data); decode_disp('CertificatePairAssertion', Data) -> dec_CertificatePairAssertion(Data); decode_disp('CertificateListExactAssertion', Data) -> dec_CertificateListExactAssertion(Data); decode_disp('CertificateListAssertion', Data) -> dec_CertificateListAssertion(Data); decode_disp('INSTANCE OF', Data) -> 'dec_INSTANCE OF'(Data); decode_disp(Type, _Data) -> exit({error,{asn1,{undefined_type,Type}}}). info() -> case ?MODULE:module_info(attributes) of Attributes when is_list(Attributes) -> case lists:keyfind(asn1_info, 1, Attributes) of {_,Info} when is_list(Info) -> Info; _ -> [] end; _ -> [] end. %%================================ %% AuthorityKeyIdentifier %%================================ enc_AuthorityKeyIdentifier(Val) -> enc_AuthorityKeyIdentifier(Val, [<<48>>]). enc_AuthorityKeyIdentifier(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3} = Val, %%------------------------------------------------- %% attribute keyIdentifier(1) with type OCTET STRING OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_restricted_string(Cindex1, [<<128>>]) end, %%------------------------------------------------- %% attribute authorityCertIssuer(2) External CertificateExtensions:GeneralNames OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_GeneralNames'(Cindex2, [<<161>>]) end, %%------------------------------------------------- %% attribute authorityCertSerialNumber(3) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex3, [<<130>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3], LenSoFar = EncLen1 + EncLen2 + EncLen3, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_AuthorityKeyIdentifier(Tlv) -> dec_AuthorityKeyIdentifier(Tlv, [16]). dec_AuthorityKeyIdentifier(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute keyIdentifier(1) with type OCTET STRING OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {decode_octet_string(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute authorityCertIssuer(2) External CertificateExtensions:GeneralNames OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {'dec_GeneralNames'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, %%------------------------------------------------- %% attribute authorityCertSerialNumber(3) with type INTEGER OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131074,V3}|TempTlv4] -> {decode_integer(V3, []), TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, case Tlv4 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed end, Res1 = {'AuthorityKeyIdentifier',Term1,Term2,Term3}, Res1. %%================================ %% KeyIdentifier %%================================ enc_KeyIdentifier(Val) -> enc_KeyIdentifier(Val, [<<4>>]). enc_KeyIdentifier(Val, TagIn) -> encode_restricted_string(Val, TagIn). dec_KeyIdentifier(Tlv) -> dec_KeyIdentifier(Tlv, [4]). dec_KeyIdentifier(Tlv, TagIn) -> decode_octet_string(Tlv, TagIn). %%================================ %% SubjectKeyIdentifier %%================================ enc_SubjectKeyIdentifier(Val) -> enc_SubjectKeyIdentifier(Val, [<<4>>]). enc_SubjectKeyIdentifier(Val, TagIn) -> encode_restricted_string(Val, TagIn). dec_SubjectKeyIdentifier(Tlv) -> dec_SubjectKeyIdentifier(Tlv, [4]). dec_SubjectKeyIdentifier(Tlv, TagIn) -> decode_octet_string(Tlv, TagIn). %%================================ %% KeyUsage %%================================ enc_KeyUsage(Val) -> enc_KeyUsage(Val, [<<3>>]). enc_KeyUsage(Val, TagIn) -> encode_named_bit_string(Val, [{digitalSignature,0},{nonRepudiation,1},{keyEncipherment,2},{dataEncipherment,3},{keyAgreement,4},{keyCertSign,5},{cRLSign,6},{encipherOnly,7},{decipherOnly,8}], TagIn). dec_KeyUsage(Tlv) -> dec_KeyUsage(Tlv, [3]). dec_KeyUsage(Tlv, TagIn) -> decode_named_bit_string(Tlv, [{digitalSignature,0},{nonRepudiation,1},{keyEncipherment,2},{dataEncipherment,3},{keyAgreement,4},{keyCertSign,5},{cRLSign,6},{encipherOnly,7},{decipherOnly,8}], TagIn). %%================================ %% KeyPurposeId %%================================ enc_KeyPurposeId(Val) -> enc_KeyPurposeId(Val, [<<6>>]). enc_KeyPurposeId(Val, TagIn) -> encode_object_identifier(Val, TagIn). dec_KeyPurposeId(Tlv) -> dec_KeyPurposeId(Tlv, [6]). dec_KeyPurposeId(Tlv, TagIn) -> decode_object_identifier(Tlv, TagIn). %%================================ %% PrivateKeyUsagePeriod %%================================ enc_PrivateKeyUsagePeriod(Val) -> enc_PrivateKeyUsagePeriod(Val, [<<48>>]). enc_PrivateKeyUsagePeriod(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute notBefore(1) with type GeneralizedTime OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_restricted_string(Cindex1, [<<128>>]) end, %%------------------------------------------------- %% attribute notAfter(2) with type GeneralizedTime OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_restricted_string(Cindex2, [<<129>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_PrivateKeyUsagePeriod(Tlv) -> dec_PrivateKeyUsagePeriod(Tlv, [16]). dec_PrivateKeyUsagePeriod(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute notBefore(1) with type GeneralizedTime OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {begin binary_to_list(decode_restricted_string(V1, [])) end , TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute notAfter(2) with type GeneralizedTime OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {begin binary_to_list(decode_restricted_string(V2, [])) end , TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'PrivateKeyUsagePeriod',Term1,Term2}, Res1. %%================================ %% CertificatePoliciesSyntax %%================================ enc_CertificatePoliciesSyntax(Val) -> enc_CertificatePoliciesSyntax(Val, [<<48>>]). enc_CertificatePoliciesSyntax(Val, TagIn) -> {EncBytes,EncLen} = 'enc_CertificatePoliciesSyntax_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_CertificatePoliciesSyntax_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_CertificatePoliciesSyntax_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'enc_PolicyInformation'(H, [<<48>>]), 'enc_CertificatePoliciesSyntax_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_CertificatePoliciesSyntax(Tlv) -> dec_CertificatePoliciesSyntax(Tlv, [16]). dec_CertificatePoliciesSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['dec_PolicyInformation'(V1, [16]) || V1 <- Tlv1]. %%================================ %% PolicyInformation %%================================ enc_PolicyInformation(Val) -> enc_PolicyInformation(Val, [<<48>>]). enc_PolicyInformation(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute policyIdentifier(1) with type OBJECT IDENTIFIER %%------------------------------------------------- {EncBytes1,EncLen1} = encode_object_identifier(Cindex1, [<<6>>]), %%------------------------------------------------- %% attribute policyQualifiers(2) with type SEQUENCE OF OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_PolicyInformation_policyQualifiers'(Cindex2, [<<48>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). %%================================ %% PolicyInformation_policyQualifiers %%================================ enc_PolicyInformation_policyQualifiers(Val, TagIn) -> {EncBytes,EncLen} = 'enc_PolicyInformation_policyQualifiers_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_PolicyInformation_policyQualifiers_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_PolicyInformation_policyQualifiers_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'enc_PolicyQualifierInfo'(H, [<<48>>]), 'enc_PolicyInformation_policyQualifiers_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_PolicyInformation(Tlv) -> dec_PolicyInformation(Tlv, [16]). dec_PolicyInformation(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute policyIdentifier(1) with type OBJECT IDENTIFIER %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), %%------------------------------------------------- %% attribute policyQualifiers(2) with type SEQUENCE OF OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{16,V2}|TempTlv3] -> {'dec_PolicyInformation_policyQualifiers'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'PolicyInformation',Term1,Term2}, Res1. 'dec_PolicyInformation_policyQualifiers'(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['dec_PolicyQualifierInfo'(V1, [16]) || V1 <- Tlv1]. %%================================ %% CertPolicyId %%================================ enc_CertPolicyId(Val) -> enc_CertPolicyId(Val, [<<6>>]). enc_CertPolicyId(Val, TagIn) -> encode_object_identifier(Val, TagIn). dec_CertPolicyId(Tlv) -> dec_CertPolicyId(Tlv, [6]). dec_CertPolicyId(Tlv, TagIn) -> decode_object_identifier(Tlv, TagIn). %%================================ %% PolicyQualifierInfo %%================================ enc_PolicyQualifierInfo(Val) -> enc_PolicyQualifierInfo(Val, [<<48>>]). enc_PolicyQualifierInfo(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, ObjpolicyQualifierId = 'CertificateExtensions':'getenc_SupportedPolicyQualifiers'( Cindex1), %%------------------------------------------------- %% attribute policyQualifierId(1) with type OBJECT IDENTIFIER %%------------------------------------------------- {EncBytes1,EncLen1} = encode_object_identifier(Cindex1, [<<6>>]), %%------------------------------------------------- %% attribute qualifier(2) with type typefieldQualifier OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> {TmpBytes2,_ } = ObjpolicyQualifierId('Qualifier', Cindex2, []), encode_open_type(TmpBytes2, []) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_PolicyQualifierInfo(Tlv) -> dec_PolicyQualifierInfo(Tlv, [16]). dec_PolicyQualifierInfo(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute policyQualifierId(1) with type OBJECT IDENTIFIER %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), %%------------------------------------------------- %% attribute qualifier(2) with type typefieldQualifier OPTIONAL %%------------------------------------------------- {Tmpterm1,Tlv3} = case Tlv2 of [V2|TempTlv3] -> {decode_open_type(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, DecObjpolicyQualifierIdTerm1 = 'CertificateExtensions':'getdec_SupportedPolicyQualifiers'(Term1), Term2 = case Tmpterm1 of asn1_NOVALUE ->asn1_NOVALUE; _ -> case (catch DecObjpolicyQualifierIdTerm1('Qualifier', Tmpterm1, [])) of {'EXIT', Reason1} -> exit({'Type not compatible with table constraint',Reason1}); Tmpterm2 -> Tmpterm2 end end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'PolicyQualifierInfo',Term1,Term2}, Res1. %%================================ %% PolicyMappingsSyntax %%================================ enc_PolicyMappingsSyntax(Val) -> enc_PolicyMappingsSyntax(Val, [<<48>>]). enc_PolicyMappingsSyntax(Val, TagIn) -> {EncBytes,EncLen} = 'enc_PolicyMappingsSyntax_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_PolicyMappingsSyntax_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_PolicyMappingsSyntax_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'enc_PolicyMappingsSyntax_SEQOF'(H, [<<48>>]), 'enc_PolicyMappingsSyntax_components'(T,[EncBytes|AccBytes], AccLen + EncLen). %%================================ %% PolicyMappingsSyntax_SEQOF %%================================ enc_PolicyMappingsSyntax_SEQOF(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute issuerDomainPolicy(1) with type OBJECT IDENTIFIER %%------------------------------------------------- {EncBytes1,EncLen1} = encode_object_identifier(Cindex1, [<<6>>]), %%------------------------------------------------- %% attribute subjectDomainPolicy(2) with type OBJECT IDENTIFIER %%------------------------------------------------- {EncBytes2,EncLen2} = encode_object_identifier(Cindex2, [<<6>>]), BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_PolicyMappingsSyntax(Tlv) -> dec_PolicyMappingsSyntax(Tlv, [16]). dec_PolicyMappingsSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['dec_PolicyMappingsSyntax_SEQOF'(V1, [16]) || V1 <- Tlv1]. 'dec_PolicyMappingsSyntax_SEQOF'(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute issuerDomainPolicy(1) with type OBJECT IDENTIFIER %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), %%------------------------------------------------- %% attribute subjectDomainPolicy(2) with type OBJECT IDENTIFIER %%------------------------------------------------- [V2|Tlv3] = Tlv2, Term2 = decode_object_identifier(V2, [6]), case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'PolicyMappingsSyntax_SEQOF',Term1,Term2}, Res1. %%================================ %% SupportedAlgorithm %%================================ enc_SupportedAlgorithm(Val) -> enc_SupportedAlgorithm(Val, [<<48>>]). enc_SupportedAlgorithm(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3} = Val, %%------------------------------------------------- %% attribute algorithmIdentifier(1) External AuthenticationFramework:AlgorithmIdentifier %%------------------------------------------------- {EncBytes1,EncLen1} = 'AuthenticationFramework':'enc_AlgorithmIdentifier'(Cindex1, [<<48>>]), %%------------------------------------------------- %% attribute intendedUsage(2) with type BIT STRING OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_named_bit_string(Cindex2, [{digitalSignature,0},{nonRepudiation,1},{keyEncipherment,2},{dataEncipherment,3},{keyAgreement,4},{keyCertSign,5},{cRLSign,6},{encipherOnly,7},{decipherOnly,8}], [<<128>>]) end, %%------------------------------------------------- %% attribute intendedCertificatePolicies(3) External CertificateExtensions:CertificatePoliciesSyntax OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_CertificatePoliciesSyntax'(Cindex3, [<<161>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3], LenSoFar = EncLen1 + EncLen2 + EncLen3, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_SupportedAlgorithm(Tlv) -> dec_SupportedAlgorithm(Tlv, [16]). dec_SupportedAlgorithm(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute algorithmIdentifier(1) External AuthenticationFramework:AlgorithmIdentifier %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = 'AuthenticationFramework':'dec_AlgorithmIdentifier'(V1, [16]), %%------------------------------------------------- %% attribute intendedUsage(2) with type BIT STRING OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131072,V2}|TempTlv3] -> {decode_named_bit_string(V2, [{digitalSignature,0},{nonRepudiation,1},{keyEncipherment,2},{dataEncipherment,3},{keyAgreement,4},{keyCertSign,5},{cRLSign,6},{encipherOnly,7},{decipherOnly,8}], []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, %%------------------------------------------------- %% attribute intendedCertificatePolicies(3) External CertificateExtensions:CertificatePoliciesSyntax OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131073,V3}|TempTlv4] -> {'dec_CertificatePoliciesSyntax'(V3, []), TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, case Tlv4 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed end, Res1 = {'SupportedAlgorithm',Term1,Term2,Term3}, Res1. %%================================ %% GeneralNames %%================================ enc_GeneralNames(Val) -> enc_GeneralNames(Val, [<<48>>]). enc_GeneralNames(Val, TagIn) -> {EncBytes,EncLen} = 'enc_GeneralNames_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_GeneralNames_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_GeneralNames_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'enc_GeneralName'(H, []), 'enc_GeneralNames_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_GeneralNames(Tlv) -> dec_GeneralNames(Tlv, [16]). dec_GeneralNames(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['dec_GeneralName'(V1, []) || V1 <- Tlv1]. %%================================ %% GeneralName %%================================ enc_GeneralName(Val) -> enc_GeneralName(Val, []). enc_GeneralName(Val, TagIn) -> {EncBytes,EncLen} = case element(1,Val) of otherName -> 'enc_INSTANCE OF'(element(2,Val), [<<160>>]); rfc822Name -> encode_restricted_string(element(2,Val), [<<129>>]); dNSName -> encode_restricted_string(element(2,Val), [<<130>>]); directoryName -> 'InformationFramework':'enc_Name'(element(2,Val), [<<164>>]); ediPartyName -> 'enc_EDIPartyName'(element(2,Val), [<<165>>]); uniformResourceIdentifier -> encode_restricted_string(element(2,Val), [<<134>>]); iPAddress -> encode_restricted_string(element(2,Val), [<<135>>]); registeredID -> encode_object_identifier(element(2,Val), [<<136>>]); Else -> exit({error,{asn1,{invalid_choice_type,Else}}}) end, encode_tags(TagIn, EncBytes, EncLen). dec_GeneralName(Tlv) -> dec_GeneralName(Tlv, []). dec_GeneralName(Tlv, TagIn) -> Tlv1 = match_tags(Tlv, TagIn), case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of %% 'otherName' {131072, V1} -> {otherName, 'dec_INSTANCE OF'(V1, [])}; %% 'rfc822Name' {131073, V1} -> {rfc822Name, begin binary_to_list(decode_restricted_string(V1, [])) end }; %% 'dNSName' {131074, V1} -> {dNSName, begin binary_to_list(decode_restricted_string(V1, [])) end }; %% 'directoryName' {131076, V1} -> {directoryName, 'InformationFramework':'dec_Name'(V1, [])}; %% 'ediPartyName' {131077, V1} -> {ediPartyName, 'dec_EDIPartyName'(V1, [])}; %% 'uniformResourceIdentifier' {131078, V1} -> {uniformResourceIdentifier, begin binary_to_list(decode_restricted_string(V1, [])) end }; %% 'iPAddress' {131079, V1} -> {iPAddress, decode_octet_string(V1, [])}; %% 'registeredID' {131080, V1} -> {registeredID, decode_object_identifier(V1, [])}; Else -> exit({error,{asn1,{invalid_choice_tag,Else}}}) end . %%================================ %% EDIPartyName %%================================ enc_EDIPartyName(Val) -> enc_EDIPartyName(Val, [<<48>>]). enc_EDIPartyName(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute nameAssigner(1) with type CHOICE OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_EDIPartyName_nameAssigner'(Cindex1, [<<160>>]) end, %%------------------------------------------------- %% attribute partyName(2) with type CHOICE %%------------------------------------------------- {EncBytes2,EncLen2} = 'enc_EDIPartyName_partyName'(Cindex2, [<<161>>]), BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). %%================================ %% EDIPartyName_nameAssigner %%================================ enc_EDIPartyName_nameAssigner(Val, TagIn) -> {EncBytes,EncLen} = case element(1,Val) of teletexString -> encode_restricted_string(element(2,Val), [<<20>>]); printableString -> encode_restricted_string(element(2,Val), [<<19>>]); universalString -> encode_universal_string(element(2,Val), [<<28>>]); bmpString -> encode_BMP_string(element(2,Val), [<<30>>]); uTF8String -> encode_UTF8_string(element(2,Val), [<<12>>]); Else -> exit({error,{asn1,{invalid_choice_type,Else}}}) end, encode_tags(TagIn, EncBytes, EncLen). %%================================ %% EDIPartyName_partyName %%================================ enc_EDIPartyName_partyName(Val, TagIn) -> {EncBytes,EncLen} = case element(1,Val) of teletexString -> encode_restricted_string(element(2,Val), [<<20>>]); printableString -> encode_restricted_string(element(2,Val), [<<19>>]); universalString -> encode_universal_string(element(2,Val), [<<28>>]); bmpString -> encode_BMP_string(element(2,Val), [<<30>>]); uTF8String -> encode_UTF8_string(element(2,Val), [<<12>>]); Else -> exit({error,{asn1,{invalid_choice_type,Else}}}) end, encode_tags(TagIn, EncBytes, EncLen). dec_EDIPartyName(Tlv) -> dec_EDIPartyName(Tlv, [16]). dec_EDIPartyName(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute nameAssigner(1) with type CHOICE OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {'dec_EDIPartyName_nameAssigner'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute partyName(2) with type CHOICE %%------------------------------------------------- [V2|Tlv3] = Tlv2, Term2 = 'dec_EDIPartyName_partyName'(V2, [131073]), case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'EDIPartyName',Term1,Term2}, Res1. 'dec_EDIPartyName_nameAssigner'(Tlv, TagIn) -> Tlv1 = match_tags(Tlv, TagIn), case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of %% 'teletexString' {20, V1} -> {teletexString, begin Val1 = decode_restricted_string(V1, []), C1 = byte_size(Val1), if 1 =< C1, C1 =< 64 -> binary_to_list(Val1); true -> exit({error,{asn1,bad_range}}) end end}; %% 'printableString' {19, V1} -> {printableString, begin Val2 = decode_restricted_string(V1, []), C2 = byte_size(Val2), if 1 =< C2, C2 =< 64 -> binary_to_list(Val2); true -> exit({error,{asn1,bad_range}}) end end}; %% 'universalString' {28, V1} -> {universalString, begin Val3 = decode_universal_string(V1, []), C3 = length(Val3), if 1 =< C3, C3 =< 64 -> Val3; true -> exit({error,{asn1,bad_range}}) end end}; %% 'bmpString' {30, V1} -> {bmpString, begin Val4 = decode_BMP_string(V1, []), C4 = length(Val4), if 1 =< C4, C4 =< 64 -> Val4; true -> exit({error,{asn1,bad_range}}) end end}; %% 'uTF8String' {12, V1} -> {uTF8String, decode_UTF8_string(V1, [])}; Else -> exit({error,{asn1,{invalid_choice_tag,Else}}}) end . 'dec_EDIPartyName_partyName'(Tlv, TagIn) -> Tlv1 = match_tags(Tlv, TagIn), case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of %% 'teletexString' {20, V1} -> {teletexString, begin Val1 = decode_restricted_string(V1, []), C1 = byte_size(Val1), if 1 =< C1, C1 =< 64 -> binary_to_list(Val1); true -> exit({error,{asn1,bad_range}}) end end}; %% 'printableString' {19, V1} -> {printableString, begin Val2 = decode_restricted_string(V1, []), C2 = byte_size(Val2), if 1 =< C2, C2 =< 64 -> binary_to_list(Val2); true -> exit({error,{asn1,bad_range}}) end end}; %% 'universalString' {28, V1} -> {universalString, begin Val3 = decode_universal_string(V1, []), C3 = length(Val3), if 1 =< C3, C3 =< 64 -> Val3; true -> exit({error,{asn1,bad_range}}) end end}; %% 'bmpString' {30, V1} -> {bmpString, begin Val4 = decode_BMP_string(V1, []), C4 = length(Val4), if 1 =< C4, C4 =< 64 -> Val4; true -> exit({error,{asn1,bad_range}}) end end}; %% 'uTF8String' {12, V1} -> {uTF8String, decode_UTF8_string(V1, [])}; Else -> exit({error,{asn1,{invalid_choice_tag,Else}}}) end . %%================================ %% AttributesSyntax %%================================ enc_AttributesSyntax(Val) -> enc_AttributesSyntax(Val, [<<48>>]). enc_AttributesSyntax(Val, TagIn) -> {EncBytes,EncLen} = 'enc_AttributesSyntax_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_AttributesSyntax_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_AttributesSyntax_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'InformationFramework':'enc_Attribute'(H, [<<48>>]), 'enc_AttributesSyntax_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_AttributesSyntax(Tlv) -> dec_AttributesSyntax(Tlv, [16]). dec_AttributesSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['InformationFramework':'dec_Attribute'(V1, [16]) || V1 <- Tlv1]. %%================================ %% BasicConstraintsSyntax %%================================ enc_BasicConstraintsSyntax(Val) -> enc_BasicConstraintsSyntax(Val, [<<48>>]). enc_BasicConstraintsSyntax(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute cA(1) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_DEFAULT -> {<<>>,0}; _ when Cindex1 =:= false -> {<<>>,0}; _ -> encode_boolean(Cindex1, [<<1>>]) end, %%------------------------------------------------- %% attribute pathLenConstraint(2) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex2, [<<2>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_BasicConstraintsSyntax(Tlv) -> dec_BasicConstraintsSyntax(Tlv, [16]). dec_BasicConstraintsSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute cA(1) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{1,V1}|TempTlv2] -> {decode_boolean(V1, []), TempTlv2}; _ -> {false,Tlv1} end, %%------------------------------------------------- %% attribute pathLenConstraint(2) with type INTEGER OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{2,V2}|TempTlv3] -> {begin Val1 = decode_integer(V2, []), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end, TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'BasicConstraintsSyntax',Term1,Term2}, Res1. %%================================ %% NameConstraintsSyntax %%================================ enc_NameConstraintsSyntax(Val) -> enc_NameConstraintsSyntax(Val, [<<48>>]). enc_NameConstraintsSyntax(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3} = Val, %%------------------------------------------------- %% attribute permittedSubtrees(1) External CertificateExtensions:GeneralSubtrees OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_GeneralSubtrees'(Cindex1, [<<160>>]) end, %%------------------------------------------------- %% attribute excludedSubtrees(2) External CertificateExtensions:GeneralSubtrees OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_GeneralSubtrees'(Cindex2, [<<161>>]) end, %%------------------------------------------------- %% attribute requiredNameForms(3) External CertificateExtensions:NameForms OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_NameForms'(Cindex3, [<<162>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3], LenSoFar = EncLen1 + EncLen2 + EncLen3, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_NameConstraintsSyntax(Tlv) -> dec_NameConstraintsSyntax(Tlv, [16]). dec_NameConstraintsSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute permittedSubtrees(1) External CertificateExtensions:GeneralSubtrees OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {'dec_GeneralSubtrees'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute excludedSubtrees(2) External CertificateExtensions:GeneralSubtrees OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {'dec_GeneralSubtrees'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, %%------------------------------------------------- %% attribute requiredNameForms(3) External CertificateExtensions:NameForms OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131074,V3}|TempTlv4] -> {'dec_NameForms'(V3, []), TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, case Tlv4 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed end, Res1 = {'NameConstraintsSyntax',Term1,Term2,Term3}, Res1. %%================================ %% GeneralSubtrees %%================================ enc_GeneralSubtrees(Val) -> enc_GeneralSubtrees(Val, [<<48>>]). enc_GeneralSubtrees(Val, TagIn) -> {EncBytes,EncLen} = 'enc_GeneralSubtrees_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_GeneralSubtrees_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_GeneralSubtrees_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'enc_GeneralSubtree'(H, [<<48>>]), 'enc_GeneralSubtrees_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_GeneralSubtrees(Tlv) -> dec_GeneralSubtrees(Tlv, [16]). dec_GeneralSubtrees(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['dec_GeneralSubtree'(V1, [16]) || V1 <- Tlv1]. %%================================ %% GeneralSubtree %%================================ enc_GeneralSubtree(Val) -> enc_GeneralSubtree(Val, [<<48>>]). enc_GeneralSubtree(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3} = Val, %%------------------------------------------------- %% attribute base(1) External CertificateExtensions:GeneralName %%------------------------------------------------- {EncBytes1,EncLen1} = 'enc_GeneralName'(Cindex1, []), %%------------------------------------------------- %% attribute minimum(2) with type INTEGER DEFAULT = 0 %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_DEFAULT -> {<<>>,0}; _ when Cindex2 =:= 0 -> {<<>>,0}; _ -> encode_integer(Cindex2, [<<128>>]) end, %%------------------------------------------------- %% attribute maximum(3) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex3, [<<129>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3], LenSoFar = EncLen1 + EncLen2 + EncLen3, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_GeneralSubtree(Tlv) -> dec_GeneralSubtree(Tlv, [16]). dec_GeneralSubtree(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute base(1) External CertificateExtensions:GeneralName %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = 'dec_GeneralName'(V1, []), %%------------------------------------------------- %% attribute minimum(2) with type INTEGER DEFAULT = 0 %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131072,V2}|TempTlv3] -> {begin Val1 = decode_integer(V2, []), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end, TempTlv3}; _ -> {0,Tlv2} end, %%------------------------------------------------- %% attribute maximum(3) with type INTEGER OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131073,V3}|TempTlv4] -> {begin Val2 = decode_integer(V3, []), if 0 =< Val2, Val2 =< 'MAX' -> Val2; true -> exit({error,{asn1,bad_range}}) end end, TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, case Tlv4 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed end, Res1 = {'GeneralSubtree',Term1,Term2,Term3}, Res1. %%================================ %% BaseDistance %%================================ enc_BaseDistance(Val) -> enc_BaseDistance(Val, [<<2>>]). enc_BaseDistance(Val, TagIn) -> encode_integer(Val, TagIn). dec_BaseDistance(Tlv) -> dec_BaseDistance(Tlv, [2]). dec_BaseDistance(Tlv, TagIn) -> begin Val1 = decode_integer(Tlv, TagIn), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end. %%================================ %% NameForms %%================================ enc_NameForms(Val) -> enc_NameForms(Val, [<<48>>]). enc_NameForms(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute basicNameForms(1) with type BIT STRING OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_named_bit_string(Cindex1, [{rfc822Name,0},{dNSName,1},{x400Address,2},{directoryName,3},{ediPartyName,4},{uniformResourceIdentifier,5},{iPAddress,6},{registeredID,7}], [<<128>>]) end, %%------------------------------------------------- %% attribute otherNameForms(2) with type SEQUENCE OF OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_NameForms_otherNameForms'(Cindex2, [<<161>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). %%================================ %% NameForms_otherNameForms %%================================ enc_NameForms_otherNameForms(Val, TagIn) -> {EncBytes,EncLen} = 'enc_NameForms_otherNameForms_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_NameForms_otherNameForms_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_NameForms_otherNameForms_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = encode_object_identifier(H, [<<6>>]), 'enc_NameForms_otherNameForms_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_NameForms(Tlv) -> dec_NameForms(Tlv, [16]). dec_NameForms(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute basicNameForms(1) with type BIT STRING OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {decode_named_bit_string(V1, [{rfc822Name,0},{dNSName,1},{x400Address,2},{directoryName,3},{ediPartyName,4},{uniformResourceIdentifier,5},{iPAddress,6},{registeredID,7}], []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute otherNameForms(2) with type SEQUENCE OF OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {'dec_NameForms_otherNameForms'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'NameForms',Term1,Term2}, Res1. 'dec_NameForms_otherNameForms'(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), [decode_object_identifier(V1, [6]) || V1 <- Tlv1]. %%================================ %% BasicNameForms %%================================ enc_BasicNameForms(Val) -> enc_BasicNameForms(Val, [<<3>>]). enc_BasicNameForms(Val, TagIn) -> encode_named_bit_string(Val, [{rfc822Name,0},{dNSName,1},{x400Address,2},{directoryName,3},{ediPartyName,4},{uniformResourceIdentifier,5},{iPAddress,6},{registeredID,7}], TagIn). dec_BasicNameForms(Tlv) -> dec_BasicNameForms(Tlv, [3]). dec_BasicNameForms(Tlv, TagIn) -> decode_named_bit_string(Tlv, [{rfc822Name,0},{dNSName,1},{x400Address,2},{directoryName,3},{ediPartyName,4},{uniformResourceIdentifier,5},{iPAddress,6},{registeredID,7}], TagIn). %%================================ %% PolicyConstraintsSyntax %%================================ enc_PolicyConstraintsSyntax(Val) -> enc_PolicyConstraintsSyntax(Val, [<<48>>]). enc_PolicyConstraintsSyntax(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute requireExplicitPolicy(1) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex1, [<<128>>]) end, %%------------------------------------------------- %% attribute inhibitPolicyMapping(2) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex2, [<<129>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_PolicyConstraintsSyntax(Tlv) -> dec_PolicyConstraintsSyntax(Tlv, [16]). dec_PolicyConstraintsSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute requireExplicitPolicy(1) with type INTEGER OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {begin Val1 = decode_integer(V1, []), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end, TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute inhibitPolicyMapping(2) with type INTEGER OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {begin Val2 = decode_integer(V2, []), if 0 =< Val2, Val2 =< 'MAX' -> Val2; true -> exit({error,{asn1,bad_range}}) end end, TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'PolicyConstraintsSyntax',Term1,Term2}, Res1. %%================================ %% SkipCerts %%================================ enc_SkipCerts(Val) -> enc_SkipCerts(Val, [<<2>>]). enc_SkipCerts(Val, TagIn) -> encode_integer(Val, TagIn). dec_SkipCerts(Tlv) -> dec_SkipCerts(Tlv, [2]). dec_SkipCerts(Tlv, TagIn) -> begin Val1 = decode_integer(Tlv, TagIn), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end. %%================================ %% CertPolicySet %%================================ enc_CertPolicySet(Val) -> enc_CertPolicySet(Val, [<<48>>]). enc_CertPolicySet(Val, TagIn) -> {EncBytes,EncLen} = 'enc_CertPolicySet_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_CertPolicySet_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_CertPolicySet_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = encode_object_identifier(H, [<<6>>]), 'enc_CertPolicySet_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_CertPolicySet(Tlv) -> dec_CertPolicySet(Tlv, [16]). dec_CertPolicySet(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), [decode_object_identifier(V1, [6]) || V1 <- Tlv1]. %%================================ %% CRLNumber %%================================ enc_CRLNumber(Val) -> enc_CRLNumber(Val, [<<2>>]). enc_CRLNumber(Val, TagIn) -> encode_integer(Val, TagIn). dec_CRLNumber(Tlv) -> dec_CRLNumber(Tlv, [2]). dec_CRLNumber(Tlv, TagIn) -> begin Val1 = decode_integer(Tlv, TagIn), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end. %%================================ %% CRLReason %%================================ enc_CRLReason(Val) -> enc_CRLReason(Val, [<<10>>]). enc_CRLReason(Val, TagIn) -> case Val of unspecified -> encode_tags(TagIn, [0], 1); keyCompromise -> encode_tags(TagIn, [1], 1); cACompromise -> encode_tags(TagIn, [2], 1); affiliationChanged -> encode_tags(TagIn, [3], 1); superseded -> encode_tags(TagIn, [4], 1); cessationOfOperation -> encode_tags(TagIn, [5], 1); certificateHold -> encode_tags(TagIn, [6], 1); removeFromCRL -> encode_tags(TagIn, [8], 1); Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}}) end. dec_CRLReason(Tlv) -> dec_CRLReason(Tlv, [10]). dec_CRLReason(Tlv, TagIn) -> case decode_integer(Tlv, TagIn) of 0 -> unspecified; 1 -> keyCompromise; 2 -> cACompromise; 3 -> affiliationChanged; 4 -> superseded; 5 -> cessationOfOperation; 6 -> certificateHold; 8 -> removeFromCRL; Default1 -> exit({error,{asn1,{illegal_enumerated,Default1}}}) end. %%================================ %% HoldInstruction %%================================ enc_HoldInstruction(Val) -> enc_HoldInstruction(Val, [<<6>>]). enc_HoldInstruction(Val, TagIn) -> encode_object_identifier(Val, TagIn). dec_HoldInstruction(Tlv) -> dec_HoldInstruction(Tlv, [6]). dec_HoldInstruction(Tlv, TagIn) -> decode_object_identifier(Tlv, TagIn). %%================================ %% CRLDistPointsSyntax %%================================ enc_CRLDistPointsSyntax(Val) -> enc_CRLDistPointsSyntax(Val, [<<48>>]). enc_CRLDistPointsSyntax(Val, TagIn) -> {EncBytes,EncLen} = 'enc_CRLDistPointsSyntax_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_CRLDistPointsSyntax_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_CRLDistPointsSyntax_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = 'enc_DistributionPoint'(H, [<<48>>]), 'enc_CRLDistPointsSyntax_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_CRLDistPointsSyntax(Tlv) -> dec_CRLDistPointsSyntax(Tlv, [16]). dec_CRLDistPointsSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), ['dec_DistributionPoint'(V1, [16]) || V1 <- Tlv1]. %%================================ %% DistributionPoint %%================================ enc_DistributionPoint(Val) -> enc_DistributionPoint(Val, [<<48>>]). enc_DistributionPoint(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3} = Val, %%------------------------------------------------- %% attribute distributionPoint(1) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_DistributionPointName'(Cindex1, [<<160>>]) end, %%------------------------------------------------- %% attribute reasons(2) with type BIT STRING OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_named_bit_string(Cindex2, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], [<<129>>]) end, %%------------------------------------------------- %% attribute cRLIssuer(3) External CertificateExtensions:GeneralNames OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_GeneralNames'(Cindex3, [<<162>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3], LenSoFar = EncLen1 + EncLen2 + EncLen3, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_DistributionPoint(Tlv) -> dec_DistributionPoint(Tlv, [16]). dec_DistributionPoint(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute distributionPoint(1) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {'dec_DistributionPointName'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute reasons(2) with type BIT STRING OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {decode_named_bit_string(V2, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, %%------------------------------------------------- %% attribute cRLIssuer(3) External CertificateExtensions:GeneralNames OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131074,V3}|TempTlv4] -> {'dec_GeneralNames'(V3, []), TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, case Tlv4 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed end, Res1 = {'DistributionPoint',Term1,Term2,Term3}, Res1. %%================================ %% DistributionPointName %%================================ enc_DistributionPointName(Val) -> enc_DistributionPointName(Val, []). enc_DistributionPointName(Val, TagIn) -> {EncBytes,EncLen} = case element(1,Val) of fullName -> 'enc_GeneralNames'(element(2,Val), [<<160>>]); nameRelativeToCRLIssuer -> 'InformationFramework':'enc_RelativeDistinguishedName'(element(2,Val), [<<161>>]); Else -> exit({error,{asn1,{invalid_choice_type,Else}}}) end, encode_tags(TagIn, EncBytes, EncLen). dec_DistributionPointName(Tlv) -> dec_DistributionPointName(Tlv, []). dec_DistributionPointName(Tlv, TagIn) -> Tlv1 = match_tags(Tlv, TagIn), case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of %% 'fullName' {131072, V1} -> {fullName, 'dec_GeneralNames'(V1, [])}; %% 'nameRelativeToCRLIssuer' {131073, V1} -> {nameRelativeToCRLIssuer, 'InformationFramework':'dec_RelativeDistinguishedName'(V1, [])}; Else -> exit({error,{asn1,{invalid_choice_tag,Else}}}) end . %%================================ %% ReasonFlags %%================================ enc_ReasonFlags(Val) -> enc_ReasonFlags(Val, [<<3>>]). enc_ReasonFlags(Val, TagIn) -> encode_named_bit_string(Val, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], TagIn). dec_ReasonFlags(Tlv) -> dec_ReasonFlags(Tlv, [3]). dec_ReasonFlags(Tlv, TagIn) -> decode_named_bit_string(Tlv, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], TagIn). %%================================ %% IssuingDistPointSyntax %%================================ enc_IssuingDistPointSyntax(Val) -> enc_IssuingDistPointSyntax(Val, [<<48>>]). enc_IssuingDistPointSyntax(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3,Cindex4,Cindex5} = Val, %%------------------------------------------------- %% attribute distributionPoint(1) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_DistributionPointName'(Cindex1, [<<160>>]) end, %%------------------------------------------------- %% attribute onlyContainsUserCerts(2) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_DEFAULT -> {<<>>,0}; _ when Cindex2 =:= false -> {<<>>,0}; _ -> encode_boolean(Cindex2, [<<129>>]) end, %%------------------------------------------------- %% attribute onlyContainsCACerts(3) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_DEFAULT -> {<<>>,0}; _ when Cindex3 =:= false -> {<<>>,0}; _ -> encode_boolean(Cindex3, [<<130>>]) end, %%------------------------------------------------- %% attribute onlySomeReasons(4) with type BIT STRING OPTIONAL %%------------------------------------------------- {EncBytes4,EncLen4} = case Cindex4 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_named_bit_string(Cindex4, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], [<<131>>]) end, %%------------------------------------------------- %% attribute indirectCRL(5) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {EncBytes5,EncLen5} = case Cindex5 of asn1_DEFAULT -> {<<>>,0}; _ when Cindex5 =:= false -> {<<>>,0}; _ -> encode_boolean(Cindex5, [<<132>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4, EncBytes5], LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4 + EncLen5, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_IssuingDistPointSyntax(Tlv) -> dec_IssuingDistPointSyntax(Tlv, [16]). dec_IssuingDistPointSyntax(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute distributionPoint(1) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {'dec_DistributionPointName'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute onlyContainsUserCerts(2) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {decode_boolean(V2, []), TempTlv3}; _ -> {false,Tlv2} end, %%------------------------------------------------- %% attribute onlyContainsCACerts(3) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131074,V3}|TempTlv4] -> {decode_boolean(V3, []), TempTlv4}; _ -> {false,Tlv3} end, %%------------------------------------------------- %% attribute onlySomeReasons(4) with type BIT STRING OPTIONAL %%------------------------------------------------- {Term4,Tlv5} = case Tlv4 of [{131075,V4}|TempTlv5] -> {decode_named_bit_string(V4, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], []), TempTlv5}; _ -> { asn1_NOVALUE, Tlv4} end, %%------------------------------------------------- %% attribute indirectCRL(5) with type BOOLEAN DEFAULT = false %%------------------------------------------------- {Term5,Tlv6} = case Tlv5 of [{131076,V5}|TempTlv6] -> {decode_boolean(V5, []), TempTlv6}; _ -> {false,Tlv5} end, case Tlv6 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv6}}}) % extra fields not allowed end, Res1 = {'IssuingDistPointSyntax',Term1,Term2,Term3,Term4,Term5}, Res1. %%================================ %% BaseCRLNumber %%================================ enc_BaseCRLNumber(Val) -> enc_BaseCRLNumber(Val, [<<2>>]). enc_BaseCRLNumber(Val, TagIn) -> encode_integer(Val, TagIn). dec_BaseCRLNumber(Tlv) -> dec_BaseCRLNumber(Tlv, [2]). dec_BaseCRLNumber(Tlv, TagIn) -> begin Val1 = decode_integer(Tlv, TagIn), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end. %%================================ %% CertificateExactAssertion %%================================ enc_CertificateExactAssertion(Val) -> enc_CertificateExactAssertion(Val, [<<48>>]). enc_CertificateExactAssertion(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute serialNumber(1) with type INTEGER %%------------------------------------------------- {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<2>>]), %%------------------------------------------------- %% attribute issuer(2) External InformationFramework:Name %%------------------------------------------------- {EncBytes2,EncLen2} = 'InformationFramework':'enc_Name'(Cindex2, []), BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_CertificateExactAssertion(Tlv) -> dec_CertificateExactAssertion(Tlv, [16]). dec_CertificateExactAssertion(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute serialNumber(1) with type INTEGER %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_integer(V1, [2]), %%------------------------------------------------- %% attribute issuer(2) External InformationFramework:Name %%------------------------------------------------- [V2|Tlv3] = Tlv2, Term2 = 'InformationFramework':'dec_Name'(V2, []), case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'CertificateExactAssertion',Term1,Term2}, Res1. %%================================ %% CertificateAssertion %%================================ enc_CertificateAssertion(Val) -> enc_CertificateAssertion(Val, [<<48>>]). enc_CertificateAssertion(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3,Cindex4,Cindex5,Cindex6,Cindex7,Cindex8,Cindex9,Cindex10,Cindex11} = Val, %%------------------------------------------------- %% attribute serialNumber(1) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex1, [<<128>>]) end, %%------------------------------------------------- %% attribute issuer(2) External InformationFramework:Name OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'InformationFramework':'enc_Name'(Cindex2, [<<161>>]) end, %%------------------------------------------------- %% attribute subjectKeyIdentifier(3) with type OCTET STRING OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_restricted_string(Cindex3, [<<130>>]) end, %%------------------------------------------------- %% attribute authorityKeyIdentifier(4) External CertificateExtensions:AuthorityKeyIdentifier OPTIONAL %%------------------------------------------------- {EncBytes4,EncLen4} = case Cindex4 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_AuthorityKeyIdentifier'(Cindex4, [<<163>>]) end, %%------------------------------------------------- %% attribute certificateValid(5) External AuthenticationFramework:Time OPTIONAL %%------------------------------------------------- {EncBytes5,EncLen5} = case Cindex5 of asn1_NOVALUE -> {<<>>,0}; _ -> 'AuthenticationFramework':'enc_Time'(Cindex5, [<<164>>]) end, %%------------------------------------------------- %% attribute privateKeyValid(6) with type GeneralizedTime OPTIONAL %%------------------------------------------------- {EncBytes6,EncLen6} = case Cindex6 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_restricted_string(Cindex6, [<<133>>]) end, %%------------------------------------------------- %% attribute subjectPublicKeyAlgID(7) with type OBJECT IDENTIFIER OPTIONAL %%------------------------------------------------- {EncBytes7,EncLen7} = case Cindex7 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_object_identifier(Cindex7, [<<134>>]) end, %%------------------------------------------------- %% attribute keyUsage(8) with type BIT STRING OPTIONAL %%------------------------------------------------- {EncBytes8,EncLen8} = case Cindex8 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_named_bit_string(Cindex8, [{digitalSignature,0},{nonRepudiation,1},{keyEncipherment,2},{dataEncipherment,3},{keyAgreement,4},{keyCertSign,5},{cRLSign,6},{encipherOnly,7},{decipherOnly,8}], [<<135>>]) end, %%------------------------------------------------- %% attribute subjectAltName(9) External CertificateExtensions:AltNameType OPTIONAL %%------------------------------------------------- {EncBytes9,EncLen9} = case Cindex9 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_AltNameType'(Cindex9, [<<168>>]) end, %%------------------------------------------------- %% attribute policy(10) External CertificateExtensions:CertPolicySet OPTIONAL %%------------------------------------------------- {EncBytes10,EncLen10} = case Cindex10 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_CertPolicySet'(Cindex10, [<<169>>]) end, %%------------------------------------------------- %% attribute pathToName(11) External InformationFramework:Name OPTIONAL %%------------------------------------------------- {EncBytes11,EncLen11} = case Cindex11 of asn1_NOVALUE -> {<<>>,0}; _ -> 'InformationFramework':'enc_Name'(Cindex11, [<<170>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4, EncBytes5, EncBytes6, EncBytes7, EncBytes8, EncBytes9, EncBytes10, EncBytes11], LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4 + EncLen5 + EncLen6 + EncLen7 + EncLen8 + EncLen9 + EncLen10 + EncLen11, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_CertificateAssertion(Tlv) -> dec_CertificateAssertion(Tlv, [16]). dec_CertificateAssertion(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute serialNumber(1) with type INTEGER OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {decode_integer(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute issuer(2) External InformationFramework:Name OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {'InformationFramework':'dec_Name'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, %%------------------------------------------------- %% attribute subjectKeyIdentifier(3) with type OCTET STRING OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131074,V3}|TempTlv4] -> {decode_octet_string(V3, []), TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, %%------------------------------------------------- %% attribute authorityKeyIdentifier(4) External CertificateExtensions:AuthorityKeyIdentifier OPTIONAL %%------------------------------------------------- {Term4,Tlv5} = case Tlv4 of [{131075,V4}|TempTlv5] -> {'dec_AuthorityKeyIdentifier'(V4, []), TempTlv5}; _ -> { asn1_NOVALUE, Tlv4} end, %%------------------------------------------------- %% attribute certificateValid(5) External AuthenticationFramework:Time OPTIONAL %%------------------------------------------------- {Term5,Tlv6} = case Tlv5 of [{131076,V5}|TempTlv6] -> {'AuthenticationFramework':'dec_Time'(V5, []), TempTlv6}; _ -> { asn1_NOVALUE, Tlv5} end, %%------------------------------------------------- %% attribute privateKeyValid(6) with type GeneralizedTime OPTIONAL %%------------------------------------------------- {Term6,Tlv7} = case Tlv6 of [{131077,V6}|TempTlv7] -> {begin binary_to_list(decode_restricted_string(V6, [])) end , TempTlv7}; _ -> { asn1_NOVALUE, Tlv6} end, %%------------------------------------------------- %% attribute subjectPublicKeyAlgID(7) with type OBJECT IDENTIFIER OPTIONAL %%------------------------------------------------- {Term7,Tlv8} = case Tlv7 of [{131078,V7}|TempTlv8] -> {decode_object_identifier(V7, []), TempTlv8}; _ -> { asn1_NOVALUE, Tlv7} end, %%------------------------------------------------- %% attribute keyUsage(8) with type BIT STRING OPTIONAL %%------------------------------------------------- {Term8,Tlv9} = case Tlv8 of [{131079,V8}|TempTlv9] -> {decode_named_bit_string(V8, [{digitalSignature,0},{nonRepudiation,1},{keyEncipherment,2},{dataEncipherment,3},{keyAgreement,4},{keyCertSign,5},{cRLSign,6},{encipherOnly,7},{decipherOnly,8}], []), TempTlv9}; _ -> { asn1_NOVALUE, Tlv8} end, %%------------------------------------------------- %% attribute subjectAltName(9) External CertificateExtensions:AltNameType OPTIONAL %%------------------------------------------------- {Term9,Tlv10} = case Tlv9 of [{131080,V9}|TempTlv10] -> {'dec_AltNameType'(V9, []), TempTlv10}; _ -> { asn1_NOVALUE, Tlv9} end, %%------------------------------------------------- %% attribute policy(10) External CertificateExtensions:CertPolicySet OPTIONAL %%------------------------------------------------- {Term10,Tlv11} = case Tlv10 of [{131081,V10}|TempTlv11] -> {'dec_CertPolicySet'(V10, []), TempTlv11}; _ -> { asn1_NOVALUE, Tlv10} end, %%------------------------------------------------- %% attribute pathToName(11) External InformationFramework:Name OPTIONAL %%------------------------------------------------- {Term11,Tlv12} = case Tlv11 of [{131082,V11}|TempTlv12] -> {'InformationFramework':'dec_Name'(V11, []), TempTlv12}; _ -> { asn1_NOVALUE, Tlv11} end, case Tlv12 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv12}}}) % extra fields not allowed end, Res1 = {'CertificateAssertion',Term1,Term2,Term3,Term4,Term5,Term6,Term7,Term8,Term9,Term10,Term11}, Res1. %%================================ %% AltNameType %%================================ enc_AltNameType(Val) -> enc_AltNameType(Val, []). enc_AltNameType(Val, TagIn) -> {EncBytes,EncLen} = case element(1,Val) of builtinNameForm -> case element(2,Val) of rfc822Name -> encode_tags([<<10>>], [1], 1); dNSName -> encode_tags([<<10>>], [2], 1); x400Address -> encode_tags([<<10>>], [3], 1); directoryName -> encode_tags([<<10>>], [4], 1); ediPartyName -> encode_tags([<<10>>], [5], 1); uniformResourceIdentifier -> encode_tags([<<10>>], [6], 1); iPAddress -> encode_tags([<<10>>], [7], 1); registeredId -> encode_tags([<<10>>], [8], 1); Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}}) end; otherNameForm -> encode_object_identifier(element(2,Val), [<<6>>]); Else -> exit({error,{asn1,{invalid_choice_type,Else}}}) end, encode_tags(TagIn, EncBytes, EncLen). dec_AltNameType(Tlv) -> dec_AltNameType(Tlv, []). dec_AltNameType(Tlv, TagIn) -> Tlv1 = match_tags(Tlv, TagIn), case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of %% 'builtinNameForm' {10, V1} -> {builtinNameForm, case decode_integer(V1, []) of 1 -> rfc822Name; 2 -> dNSName; 3 -> x400Address; 4 -> directoryName; 5 -> ediPartyName; 6 -> uniformResourceIdentifier; 7 -> iPAddress; 8 -> registeredId; Default1 -> exit({error,{asn1,{illegal_enumerated,Default1}}}) end}; %% 'otherNameForm' {6, V1} -> {otherNameForm, decode_object_identifier(V1, [])}; Else -> exit({error,{asn1,{invalid_choice_tag,Else}}}) end . %%================================ %% CertificatePairExactAssertion %%================================ enc_CertificatePairExactAssertion(Val) -> enc_CertificatePairExactAssertion(Val, [<<48>>]). enc_CertificatePairExactAssertion(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute forwardAssertion(1) External CertificateExtensions:CertificateExactAssertion OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_CertificateExactAssertion'(Cindex1, [<<160>>]) end, %%------------------------------------------------- %% attribute reverseAssertion(2) External CertificateExtensions:CertificateExactAssertion OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_CertificateExactAssertion'(Cindex2, [<<161>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_CertificatePairExactAssertion(Tlv) -> dec_CertificatePairExactAssertion(Tlv, [16]). dec_CertificatePairExactAssertion(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute forwardAssertion(1) External CertificateExtensions:CertificateExactAssertion OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {'dec_CertificateExactAssertion'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute reverseAssertion(2) External CertificateExtensions:CertificateExactAssertion OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {'dec_CertificateExactAssertion'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'CertificatePairExactAssertion',Term1,Term2}, Res1. %%================================ %% CertificatePairAssertion %%================================ enc_CertificatePairAssertion(Val) -> enc_CertificatePairAssertion(Val, [<<48>>]). enc_CertificatePairAssertion(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute forwardAssertion(1) External CertificateExtensions:CertificateAssertion OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_CertificateAssertion'(Cindex1, [<<160>>]) end, %%------------------------------------------------- %% attribute reverseAssertion(2) External CertificateExtensions:CertificateAssertion OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_CertificateAssertion'(Cindex2, [<<161>>]) end, BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_CertificatePairAssertion(Tlv) -> dec_CertificatePairAssertion(Tlv, [16]). dec_CertificatePairAssertion(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute forwardAssertion(1) External CertificateExtensions:CertificateAssertion OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [{131072,V1}|TempTlv2] -> {'dec_CertificateAssertion'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute reverseAssertion(2) External CertificateExtensions:CertificateAssertion OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131073,V2}|TempTlv3] -> {'dec_CertificateAssertion'(V2, []), TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'CertificatePairAssertion',Term1,Term2}, Res1. %%================================ %% CertificateListExactAssertion %%================================ enc_CertificateListExactAssertion(Val) -> enc_CertificateListExactAssertion(Val, [<<48>>]). enc_CertificateListExactAssertion(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3} = Val, %%------------------------------------------------- %% attribute issuer(1) External InformationFramework:Name %%------------------------------------------------- {EncBytes1,EncLen1} = 'InformationFramework':'enc_Name'(Cindex1, []), %%------------------------------------------------- %% attribute thisUpdate(2) External AuthenticationFramework:Time %%------------------------------------------------- {EncBytes2,EncLen2} = 'AuthenticationFramework':'enc_Time'(Cindex2, []), %%------------------------------------------------- %% attribute distributionPoint(3) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_DistributionPointName'(Cindex3, []) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3], LenSoFar = EncLen1 + EncLen2 + EncLen3, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_CertificateListExactAssertion(Tlv) -> dec_CertificateListExactAssertion(Tlv, [16]). dec_CertificateListExactAssertion(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute issuer(1) External InformationFramework:Name %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = 'InformationFramework':'dec_Name'(V1, []), %%------------------------------------------------- %% attribute thisUpdate(2) External AuthenticationFramework:Time %%------------------------------------------------- [V2|Tlv3] = Tlv2, Term2 = 'AuthenticationFramework':'dec_Time'(V2, []), %%------------------------------------------------- %% attribute distributionPoint(3) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [V3 = {131072,_}|TempTlv4] -> {'dec_DistributionPointName'(V3, []), TempTlv4}; [V3 = {131073,_}|TempTlv4] -> {'dec_DistributionPointName'(V3, []), TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, case Tlv4 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed end, Res1 = {'CertificateListExactAssertion',Term1,Term2,Term3}, Res1. %%================================ %% CertificateListAssertion %%================================ enc_CertificateListAssertion(Val) -> enc_CertificateListAssertion(Val, [<<48>>]). enc_CertificateListAssertion(Val, TagIn) -> {_,Cindex1,Cindex2,Cindex3,Cindex4,Cindex5,Cindex6} = Val, %%------------------------------------------------- %% attribute issuer(1) External InformationFramework:Name OPTIONAL %%------------------------------------------------- {EncBytes1,EncLen1} = case Cindex1 of asn1_NOVALUE -> {<<>>,0}; _ -> 'InformationFramework':'enc_Name'(Cindex1, []) end, %%------------------------------------------------- %% attribute minCRLNumber(2) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes2,EncLen2} = case Cindex2 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex2, [<<128>>]) end, %%------------------------------------------------- %% attribute maxCRLNumber(3) with type INTEGER OPTIONAL %%------------------------------------------------- {EncBytes3,EncLen3} = case Cindex3 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_integer(Cindex3, [<<129>>]) end, %%------------------------------------------------- %% attribute reasonFlags(4) with type BIT STRING OPTIONAL %%------------------------------------------------- {EncBytes4,EncLen4} = case Cindex4 of asn1_NOVALUE -> {<<>>,0}; _ -> encode_named_bit_string(Cindex4, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], [<<3>>]) end, %%------------------------------------------------- %% attribute dateAndTime(5) External AuthenticationFramework:Time OPTIONAL %%------------------------------------------------- {EncBytes5,EncLen5} = case Cindex5 of asn1_NOVALUE -> {<<>>,0}; _ -> 'AuthenticationFramework':'enc_Time'(Cindex5, []) end, %%------------------------------------------------- %% attribute distributionPoint(6) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {EncBytes6,EncLen6} = case Cindex6 of asn1_NOVALUE -> {<<>>,0}; _ -> 'enc_DistributionPointName'(Cindex6, [<<162>>]) end, BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4, EncBytes5, EncBytes6], LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4 + EncLen5 + EncLen6, encode_tags(TagIn, BytesSoFar, LenSoFar). dec_CertificateListAssertion(Tlv) -> dec_CertificateListAssertion(Tlv, [16]). dec_CertificateListAssertion(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute issuer(1) External InformationFramework:Name OPTIONAL %%------------------------------------------------- {Term1,Tlv2} = case Tlv1 of [V1 = {16,_}|TempTlv2] -> {'InformationFramework':'dec_Name'(V1, []), TempTlv2}; _ -> { asn1_NOVALUE, Tlv1} end, %%------------------------------------------------- %% attribute minCRLNumber(2) with type INTEGER OPTIONAL %%------------------------------------------------- {Term2,Tlv3} = case Tlv2 of [{131072,V2}|TempTlv3] -> {begin Val1 = decode_integer(V2, []), if 0 =< Val1, Val1 =< 'MAX' -> Val1; true -> exit({error,{asn1,bad_range}}) end end, TempTlv3}; _ -> { asn1_NOVALUE, Tlv2} end, %%------------------------------------------------- %% attribute maxCRLNumber(3) with type INTEGER OPTIONAL %%------------------------------------------------- {Term3,Tlv4} = case Tlv3 of [{131073,V3}|TempTlv4] -> {begin Val2 = decode_integer(V3, []), if 0 =< Val2, Val2 =< 'MAX' -> Val2; true -> exit({error,{asn1,bad_range}}) end end, TempTlv4}; _ -> { asn1_NOVALUE, Tlv3} end, %%------------------------------------------------- %% attribute reasonFlags(4) with type BIT STRING OPTIONAL %%------------------------------------------------- {Term4,Tlv5} = case Tlv4 of [{3,V4}|TempTlv5] -> {decode_named_bit_string(V4, [{unused,0},{keyCompromise,1},{caCompromise,2},{affiliationChanged,3},{superseded,4},{cessationOfOperation,5},{certificateHold,6}], []), TempTlv5}; _ -> { asn1_NOVALUE, Tlv4} end, %%------------------------------------------------- %% attribute dateAndTime(5) External AuthenticationFramework:Time OPTIONAL %%------------------------------------------------- {Term5,Tlv6} = case Tlv5 of [V5 = {23,_}|TempTlv6] -> {'AuthenticationFramework':'dec_Time'(V5, []), TempTlv6}; [V5 = {24,_}|TempTlv6] -> {'AuthenticationFramework':'dec_Time'(V5, []), TempTlv6}; _ -> { asn1_NOVALUE, Tlv5} end, %%------------------------------------------------- %% attribute distributionPoint(6) External CertificateExtensions:DistributionPointName OPTIONAL %%------------------------------------------------- {Term6,Tlv7} = case Tlv6 of [{131074,V6}|TempTlv7] -> {'dec_DistributionPointName'(V6, []), TempTlv7}; _ -> { asn1_NOVALUE, Tlv6} end, case Tlv7 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv7}}}) % extra fields not allowed end, Res1 = {'CertificateListAssertion',Term1,Term2,Term3,Term4,Term5,Term6}, Res1. %%================================ %% INSTANCE OF %%================================ 'enc_INSTANCE OF'(Val) -> 'enc_INSTANCE OF'(Val, [<<40>>]). 'enc_INSTANCE OF'(Val, TagIn) -> {_,Cindex1,Cindex2} = Val, %%------------------------------------------------- %% attribute type-id(1) with type OBJECT IDENTIFIER %%------------------------------------------------- {EncBytes1,EncLen1} = encode_object_identifier(Cindex1, [<<6>>]), %%------------------------------------------------- %% attribute value(2) with type ASN1_OPEN_TYPE %%------------------------------------------------- {EncBytes2,EncLen2} = encode_open_type(Cindex2, [<<160>>]), BytesSoFar = [EncBytes1, EncBytes2], LenSoFar = EncLen1 + EncLen2, encode_tags(TagIn, BytesSoFar, LenSoFar). 'dec_INSTANCE OF'(Tlv) -> 'dec_INSTANCE OF'(Tlv, [8]). 'dec_INSTANCE OF'(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), %%------------------------------------------------- %% attribute type-id(1) with type OBJECT IDENTIFIER %%------------------------------------------------- [V1|Tlv2] = Tlv1, Term1 = decode_object_identifier(V1, [6]), %%------------------------------------------------- %% attribute value(2) with type ASN1_OPEN_TYPE %%------------------------------------------------- [V2|Tlv3] = Tlv2, Term2 = decode_open_type_as_binary(V2, [131072]), case Tlv3 of [] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed end, Res1 = {'INSTANCE OF',Term1,Term2}, Res1. 'id-at-supportedAlgorithms'() -> {2,5,4,52}. 'id-at-deltaRevocationList'() -> {2,5,4,53}. 'id-ce-subjectDirectoryAttributes'() -> {2,5,29,9}. 'id-ce-subjectKeyIdentifier'() -> {2,5,29,14}. 'id-ce-keyUsage'() -> {2,5,29,15}. 'id-ce-privateKeyUsagePeriod'() -> {2,5,29,16}. 'id-ce-subjectAltName'() -> {2,5,29,17}. 'id-ce-issuerAltName'() -> {2,5,29,18}. 'id-ce-basicConstraints'() -> {2,5,29,19}. 'id-ce-cRLNumber'() -> {2,5,29,20}. 'id-ce-reasonCode'() -> {2,5,29,21}. 'id-ce-instructionCode'() -> {2,5,29,23}. 'id-ce-invalidityDate'() -> {2,5,29,24}. 'id-ce-deltaCRLIndicator'() -> {2,5,29,27}. 'id-ce-issuingDistributionPoint'() -> {2,5,29,28}. 'id-ce-certificateIssuer'() -> {2,5,29,29}. 'id-ce-nameConstraint'() -> {2,5,29,30,1}. 'id-ce-cRLDistributionPoints'() -> {2,5,29,31}. 'id-ce-certificatePolicies'() -> {2,5,29,32}. 'id-ce-policyMappings'() -> {2,5,29,33}. 'id-ce-authorityKeyIdentifier'() -> {2,5,29,35}. 'id-ce-policyConstraints'() -> {2,5,29,36}. 'id-ce-extKeyUsage'() -> {2,5,29,37}. 'id-mr-certificateExactMatch'() -> {2,5,13,34}. 'id-mr-certificateMatch'() -> {2,5,13,35}. 'id-mr-certificatePairExactMatch'() -> {2,5,13,36}. 'id-mr-certificatePairMatch'() -> {2,5,13,37}. 'id-mr-certificateListExactMatch'() -> {2,5,13,38}. 'id-mr-certificateListMatch'() -> {2,5,13,39}. 'id-mr-algorithmIdentifierMatch'() -> {2,5,13,40}. 'id-ce-inhibitAnyPolicy'() -> {2,5,29,54}. %%================================ %% authorityKeyIdentifier %%================================ enc_authorityKeyIdentifier('ExtnType', Val, _RestPrimFieldName) -> enc_AuthorityKeyIdentifier(Val, [<<48>>]). dec_authorityKeyIdentifier('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_AuthorityKeyIdentifier(Tlv, [16]). tlv_format(Bytes) when is_binary(Bytes) -> {Tlv,_} = ber_decode_nif(Bytes), Tlv; tlv_format(Bytes) -> Bytes. %%================================ %% subjectKeyIdentifier %%================================ enc_subjectKeyIdentifier('ExtnType', Val, _RestPrimFieldName) -> enc_SubjectKeyIdentifier(Val, [<<4>>]). dec_subjectKeyIdentifier('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_SubjectKeyIdentifier(Tlv, [4]). %%================================ %% keyUsage %%================================ enc_keyUsage('ExtnType', Val, _RestPrimFieldName) -> enc_KeyUsage(Val, [<<3>>]). dec_keyUsage('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_KeyUsage(Tlv, [3]). %%================================ %% extKeyUsage %%================================ enc_extKeyUsage('ExtnType', Val, _RestPrimFieldName) -> enc_extKeyUsage_ExtnType(Val,[<<48>>]). %%================================ %% extKeyUsage_ExtnType %%================================ enc_extKeyUsage_ExtnType(Val, TagIn) -> {EncBytes,EncLen} = 'enc_extKeyUsage_ExtnType_components'(Val,[],0), encode_tags(TagIn, EncBytes, EncLen). 'enc_extKeyUsage_ExtnType_components'([], AccBytes, AccLen) -> {lists:reverse(AccBytes),AccLen}; 'enc_extKeyUsage_ExtnType_components'([H|T],AccBytes, AccLen) -> {EncBytes,EncLen} = encode_object_identifier(H, [<<6>>]), 'enc_extKeyUsage_ExtnType_components'(T,[EncBytes|AccBytes], AccLen + EncLen). dec_extKeyUsage('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_extKeyUsage_ExtnType(Tlv,[16]). 'dec_extKeyUsage_ExtnType'(Tlv, TagIn) -> %%------------------------------------------------- %% decode tag and length %%------------------------------------------------- Tlv1 = match_tags(Tlv, TagIn), [decode_object_identifier(V1, [6]) || V1 <- Tlv1]. %%================================ %% privateKeyUsagePeriod %%================================ enc_privateKeyUsagePeriod('ExtnType', Val, _RestPrimFieldName) -> enc_PrivateKeyUsagePeriod(Val, [<<48>>]). dec_privateKeyUsagePeriod('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_PrivateKeyUsagePeriod(Tlv, [16]). %%================================ %% certificatePolicies %%================================ enc_certificatePolicies('ExtnType', Val, _RestPrimFieldName) -> enc_CertificatePoliciesSyntax(Val, [<<48>>]). dec_certificatePolicies('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificatePoliciesSyntax(Tlv, [16]). %%================================ %% policyMappings %%================================ enc_policyMappings('ExtnType', Val, _RestPrimFieldName) -> enc_PolicyMappingsSyntax(Val, [<<48>>]). dec_policyMappings('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_PolicyMappingsSyntax(Tlv, [16]). %%================================ %% supportedAlgorithms %%================================ enc_supportedAlgorithms(derivation, _,_) -> exit({error,{'use of missing field in object', derivation}}); enc_supportedAlgorithms('Type', Val, _RestPrimFieldName) -> enc_SupportedAlgorithm(Val, [<<48>>]); enc_supportedAlgorithms('equality-match', Val, [H|T]) -> enc_algorithmIdentifierMatch(H, Val, T); enc_supportedAlgorithms('ordering-match', _,_) -> exit({error,{'use of missing field in object', 'ordering-match'}}); enc_supportedAlgorithms('substrings-match', _,_) -> exit({error,{'use of missing field in object', 'substrings-match'}}). dec_supportedAlgorithms(derivation, _,_) -> exit({error,{'illegal use of missing field in object', derivation}}); dec_supportedAlgorithms('Type', Bytes,_) -> Tlv = tlv_format(Bytes), dec_SupportedAlgorithm(Tlv, [16]); dec_supportedAlgorithms('equality-match', Bytes,[H|T]) -> dec_algorithmIdentifierMatch(H, Bytes, T); dec_supportedAlgorithms('ordering-match', _,_) -> exit({error,{'illegal use of missing field in object', 'ordering-match'}}); dec_supportedAlgorithms('substrings-match', _,_) -> exit({error,{'illegal use of missing field in object', 'substrings-match'}}). %%================================ %% subjectAltName %%================================ enc_subjectAltName('ExtnType', Val, _RestPrimFieldName) -> enc_GeneralNames(Val, [<<48>>]). dec_subjectAltName('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_GeneralNames(Tlv, [16]). %%================================ %% issuerAltName %%================================ enc_issuerAltName('ExtnType', Val, _RestPrimFieldName) -> enc_GeneralNames(Val, [<<48>>]). dec_issuerAltName('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_GeneralNames(Tlv, [16]). %%================================ %% subjectDirectoryAttributes %%================================ enc_subjectDirectoryAttributes('ExtnType', Val, _RestPrimFieldName) -> enc_AttributesSyntax(Val, [<<48>>]). dec_subjectDirectoryAttributes('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_AttributesSyntax(Tlv, [16]). %%================================ %% basicConstraints %%================================ enc_basicConstraints('ExtnType', Val, _RestPrimFieldName) -> enc_BasicConstraintsSyntax(Val, [<<48>>]). dec_basicConstraints('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_BasicConstraintsSyntax(Tlv, [16]). %%================================ %% nameConstraints %%================================ enc_nameConstraints('ExtnType', Val, _RestPrimFieldName) -> enc_NameConstraintsSyntax(Val, [<<48>>]). dec_nameConstraints('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_NameConstraintsSyntax(Tlv, [16]). %%================================ %% policyConstraints %%================================ enc_policyConstraints('ExtnType', Val, _RestPrimFieldName) -> enc_PolicyConstraintsSyntax(Val, [<<48>>]). dec_policyConstraints('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_PolicyConstraintsSyntax(Tlv, [16]). %%================================ %% cRLNumber %%================================ enc_cRLNumber('ExtnType', Val, _RestPrimFieldName) -> enc_CRLNumber(Val, [<<2>>]). dec_cRLNumber('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CRLNumber(Tlv, [2]). %%================================ %% reasonCode %%================================ enc_reasonCode('ExtnType', Val, _RestPrimFieldName) -> enc_CRLReason(Val, [<<10>>]). dec_reasonCode('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CRLReason(Tlv, [10]). %%================================ %% instructionCode %%================================ enc_instructionCode('ExtnType', Val, _RestPrimFieldName) -> enc_HoldInstruction(Val, [<<6>>]). dec_instructionCode('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_HoldInstruction(Tlv, [6]). %%================================ %% invalidityDate %%================================ enc_invalidityDate('ExtnType', Val, _RestPrimFieldName) -> encode_restricted_string(Val, [<<24>>]). dec_invalidityDate('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), begin binary_to_list(decode_restricted_string(Tlv, [24])) end . %%================================ %% cRLDistributionPoints %%================================ enc_cRLDistributionPoints('ExtnType', Val, _RestPrimFieldName) -> enc_CRLDistPointsSyntax(Val, [<<48>>]). dec_cRLDistributionPoints('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CRLDistPointsSyntax(Tlv, [16]). %%================================ %% issuingDistributionPoint %%================================ enc_issuingDistributionPoint('ExtnType', Val, _RestPrimFieldName) -> enc_IssuingDistPointSyntax(Val, [<<48>>]). dec_issuingDistributionPoint('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_IssuingDistPointSyntax(Tlv, [16]). %%================================ %% certificateIssuer %%================================ enc_certificateIssuer('ExtnType', Val, _RestPrimFieldName) -> enc_GeneralNames(Val, [<<48>>]). dec_certificateIssuer('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_GeneralNames(Tlv, [16]). %%================================ %% deltaCRLIndicator %%================================ enc_deltaCRLIndicator('ExtnType', Val, _RestPrimFieldName) -> enc_BaseCRLNumber(Val, [<<2>>]). dec_deltaCRLIndicator('ExtnType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_BaseCRLNumber(Tlv, [2]). %%================================ %% deltaRevocationList %%================================ enc_deltaRevocationList(derivation, _,_) -> exit({error,{'use of missing field in object', derivation}}); enc_deltaRevocationList('Type', Val, _RestPrimFieldName) -> 'AuthenticationFramework':enc_CertificateList(Val, [<<48>>]); enc_deltaRevocationList('equality-match', Val, [H|T]) -> enc_certificateListExactMatch(H, Val, T); enc_deltaRevocationList('ordering-match', _,_) -> exit({error,{'use of missing field in object', 'ordering-match'}}); enc_deltaRevocationList('substrings-match', _,_) -> exit({error,{'use of missing field in object', 'substrings-match'}}). dec_deltaRevocationList(derivation, _,_) -> exit({error,{'illegal use of missing field in object', derivation}}); dec_deltaRevocationList('Type', Bytes,_) -> Tlv = tlv_format(Bytes), 'AuthenticationFramework':dec_CertificateList(Tlv, [16]); dec_deltaRevocationList('equality-match', Bytes,[H|T]) -> dec_certificateListExactMatch(H, Bytes, T); dec_deltaRevocationList('ordering-match', _,_) -> exit({error,{'illegal use of missing field in object', 'ordering-match'}}); dec_deltaRevocationList('substrings-match', _,_) -> exit({error,{'illegal use of missing field in object', 'substrings-match'}}). %%================================ %% certificateExactMatch %%================================ enc_certificateExactMatch('AssertionType', Val, _RestPrimFieldName) -> enc_CertificateExactAssertion(Val, [<<48>>]). dec_certificateExactMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificateExactAssertion(Tlv, [16]). %%================================ %% certificateMatch %%================================ enc_certificateMatch('AssertionType', Val, _RestPrimFieldName) -> enc_CertificateAssertion(Val, [<<48>>]). dec_certificateMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificateAssertion(Tlv, [16]). %%================================ %% certificatePairExactMatch %%================================ enc_certificatePairExactMatch('AssertionType', Val, _RestPrimFieldName) -> enc_CertificatePairExactAssertion(Val, [<<48>>]). dec_certificatePairExactMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificatePairExactAssertion(Tlv, [16]). %%================================ %% certificatePairMatch %%================================ enc_certificatePairMatch('AssertionType', Val, _RestPrimFieldName) -> enc_CertificatePairAssertion(Val, [<<48>>]). dec_certificatePairMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificatePairAssertion(Tlv, [16]). %%================================ %% certificateListExactMatch %%================================ enc_certificateListExactMatch('AssertionType', Val, _RestPrimFieldName) -> enc_CertificateListExactAssertion(Val, [<<48>>]). dec_certificateListExactMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificateListExactAssertion(Tlv, [16]). %%================================ %% certificateListMatch %%================================ enc_certificateListMatch('AssertionType', Val, _RestPrimFieldName) -> enc_CertificateListAssertion(Val, [<<48>>]). dec_certificateListMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), dec_CertificateListAssertion(Tlv, [16]). %%================================ %% algorithmIdentifierMatch %%================================ enc_algorithmIdentifierMatch('AssertionType', Val, _RestPrimFieldName) -> 'AuthenticationFramework':enc_AlgorithmIdentifier(Val, [<<48>>]). dec_algorithmIdentifierMatch('AssertionType', Bytes,_) -> Tlv = tlv_format(Bytes), 'AuthenticationFramework':dec_AlgorithmIdentifier(Tlv, [16]). %%================================ %% SupportedPolicyQualifiers %%================================ getenc_SupportedPolicyQualifiers(_) -> fun(_, Val, _RestPrimFieldName) -> case Val of {asn1_OPENTYPE,Bin} when is_binary(Bin) -> {Bin,byte_size(Bin)} end end. getdec_SupportedPolicyQualifiers(_) -> fun(_,Bytes, _RestPrimFieldName) -> case Bytes of Bin when is_binary(Bin) -> {asn1_OPENTYPE,Bin}; _ -> {asn1_OPENTYPE,ber_encode(Bytes)} end end. %%% %%% Run-time functions. %%% 'dialyzer-suppressions'(Arg) -> ok. ber_decode_nif(B) -> asn1rt_nif:decode_ber_tlv(B). ber_encode([Tlv]) -> ber_encode(Tlv); ber_encode(Tlv) when is_binary(Tlv) -> Tlv; ber_encode(Tlv) -> asn1rt_nif:encode_ber_tlv(Tlv). collect_parts(TlvList) -> collect_parts(TlvList, []). collect_parts([{_, L} | Rest], Acc) when is_list(L) -> collect_parts(Rest, [collect_parts(L) | Acc]); collect_parts([{3, <>} | Rest], _Acc) -> collect_parts_bit(Rest, [Bits], Unused); collect_parts([{_T, V} | Rest], Acc) -> collect_parts(Rest, [V | Acc]); collect_parts([], Acc) -> list_to_binary(lists:reverse(Acc)). collect_parts_bit([{3, <>} | Rest], Acc, Uacc) -> collect_parts_bit(Rest, [Bits | Acc], Unused + Uacc); collect_parts_bit([], Acc, Uacc) -> list_to_binary([Uacc | lists:reverse(Acc)]). dec_subidentifiers(<<>>, _Av, Al) -> lists:reverse(Al); dec_subidentifiers(<<1:1,H:7,T/binary>>, Av, Al) -> dec_subidentifiers(T, Av bsl 7 + H, Al); dec_subidentifiers(<>, Av, Al) -> dec_subidentifiers(T, 0, [Av bsl 7 + H | Al]). decode_BMP_string(Buffer, Tags) -> Bin = match_and_collect(Buffer, Tags), mk_BMP_string(binary_to_list(Bin)). decode_UTF8_string(Tlv, TagsIn) -> Val = match_tags(Tlv, TagsIn), case Val of [_ | _] = PartList -> collect_parts(PartList); Bin -> Bin end. decode_bitstring2(1, Unused, <>) -> lists:sublist([B7, B6, B5, B4, B3, B2, B1, B0], 8 - Unused); decode_bitstring2(Len, Unused, <>) -> [B7, B6, B5, B4, B3, B2, B1, B0 | decode_bitstring2(Len - 1, Unused, Buffer)]. decode_bitstring_NNL(BitList, NamedNumberList) -> decode_bitstring_NNL(BitList, NamedNumberList, 0, []). decode_bitstring_NNL([], _, _No, Result) -> lists:reverse(Result); decode_bitstring_NNL([B | BitList], [{Name, No} | NamedNumberList], No, Result) -> if B =:= 0 -> decode_bitstring_NNL(BitList, NamedNumberList, No + 1, Result); true -> decode_bitstring_NNL(BitList, NamedNumberList, No + 1, [Name | Result]) end; decode_bitstring_NNL([1 | BitList], NamedNumberList, No, Result) -> decode_bitstring_NNL(BitList, NamedNumberList, No + 1, [{bit, No} | Result]); decode_bitstring_NNL([0 | BitList], NamedNumberList, No, Result) -> decode_bitstring_NNL(BitList, NamedNumberList, No + 1, Result). decode_boolean(Tlv, TagIn) -> Val = match_tags(Tlv, TagIn), case Val of <<0:8>> -> false; <<_:8>> -> true; _ -> exit({error, {asn1, {decode_boolean, Val}}}) end. decode_integer(Tlv, TagIn) -> Bin = match_tags(Tlv, TagIn), Len = byte_size(Bin), <> = Bin, Int. decode_named_bit_string(Buffer, NamedNumberList, Tags) -> case match_and_collect(Buffer, Tags) of <<0>> -> []; <> -> BitString = decode_bitstring2(byte_size(Bits), Unused, Bits), decode_bitstring_NNL(BitString, NamedNumberList) end. decode_object_identifier(Tlv, Tags) -> Val = match_tags(Tlv, Tags), [AddedObjVal | ObjVals] = dec_subidentifiers(Val, 0, []), {Val1, Val2} = if AddedObjVal < 40 -> {0, AddedObjVal}; AddedObjVal < 80 -> {1, AddedObjVal - 40}; true -> {2, AddedObjVal - 80} end, list_to_tuple([Val1, Val2 | ObjVals]). decode_octet_string(Tlv, TagsIn) -> Bin = match_and_collect(Tlv, TagsIn), binary:copy(Bin). decode_open_type(Tlv, TagIn) -> case match_tags(Tlv, TagIn) of Bin when is_binary(Bin) -> {InnerTlv, _} = ber_decode_nif(Bin), InnerTlv; TlvBytes -> TlvBytes end. decode_open_type_as_binary(Tlv, TagIn) -> ber_encode(match_tags(Tlv, TagIn)). decode_restricted_string(Tlv, TagsIn) -> match_and_collect(Tlv, TagsIn). decode_universal_string(Buffer, Tags) -> Bin = match_and_collect(Buffer, Tags), mk_universal_string(binary_to_list(Bin)). do_encode_named_bit_string([FirstVal | RestVal], NamedBitList, TagIn) -> ToSetPos = get_all_bitposes([FirstVal | RestVal], NamedBitList, []), Size = lists:max(ToSetPos) + 1, BitList = make_and_set_list(Size, ToSetPos, 0), {Len, Unused, OctetList} = encode_bitstring(BitList), encode_tags(TagIn, [Unused | OctetList], Len + 1). e_object_identifier({'OBJECT IDENTIFIER', V}) -> e_object_identifier(V); e_object_identifier(V) when is_tuple(V) -> e_object_identifier(tuple_to_list(V)); e_object_identifier([E1, E2 | Tail]) -> Head = 40 * E1 + E2, {H, Lh} = mk_object_val(Head), {R, Lr} = lists:mapfoldl(fun enc_obj_id_tail/2, 0, Tail), {[H | R], Lh + Lr}. enc_obj_id_tail(H, Len) -> {B, L} = mk_object_val(H), {B, Len + L}. encode_BMP_string(BMPString, TagIn) -> OctetList = mk_BMP_list(BMPString), encode_tags(TagIn, OctetList, length(OctetList)). encode_UTF8_string(UTF8String, TagIn) when is_binary(UTF8String) -> encode_tags(TagIn, UTF8String, byte_size(UTF8String)); encode_UTF8_string(UTF8String, TagIn) -> encode_tags(TagIn, UTF8String, length(UTF8String)). encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest]) -> Val = B8 bsl 7 bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4) bor (B4 bsl 3) bor (B3 bsl 2) bor (B2 bsl 1) bor B1, encode_bitstring(Rest, [Val], 1); encode_bitstring(Val) -> {Unused, Octet} = unused_bitlist(Val, 7, 0), {1, Unused, [Octet]}. encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest], Ack, Len) -> Val = B8 bsl 7 bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4) bor (B4 bsl 3) bor (B3 bsl 2) bor (B2 bsl 1) bor B1, encode_bitstring(Rest, [Ack, Val], Len + 1); encode_bitstring([], Ack, Len) -> {Len, 0, Ack}; encode_bitstring(Rest, Ack, Len) -> {Unused, Val} = unused_bitlist(Rest, 7, 0), {Len + 1, Unused, [Ack, Val]}. encode_boolean(true, TagIn) -> encode_tags(TagIn, [255], 1); encode_boolean(false, TagIn) -> encode_tags(TagIn, [0], 1); encode_boolean(X, _) -> exit({error, {asn1, {encode_boolean, X}}}). encode_integer(Val) -> Bytes = if Val >= 0 -> encode_integer_pos(Val, []); true -> encode_integer_neg(Val, []) end, {Bytes, length(Bytes)}. encode_integer(Val, Tag) when is_integer(Val) -> encode_tags(Tag, encode_integer(Val)); encode_integer(Val, _Tag) -> exit({error, {asn1, {encode_integer, Val}}}). encode_integer_neg(- 1, [B1 | _T] = L) when B1 > 127 -> L; encode_integer_neg(N, Acc) -> encode_integer_neg(N bsr 8, [N band 255 | Acc]). encode_integer_pos(0, [B | _Acc] = L) when B < 128 -> L; encode_integer_pos(N, Acc) -> encode_integer_pos(N bsr 8, [N band 255 | Acc]). encode_length(L) when L =< 127 -> {[L], 1}; encode_length(L) -> Oct = minimum_octets(L), Len = length(Oct), if Len =< 126 -> {[128 bor Len | Oct], Len + 1}; true -> exit({error, {asn1, too_long_length_oct, Len}}) end. encode_named_bit_string([H | _] = Bits, NamedBitList, TagIn) when is_atom(H) -> do_encode_named_bit_string(Bits, NamedBitList, TagIn); encode_named_bit_string([{bit, _} | _] = Bits, NamedBitList, TagIn) -> do_encode_named_bit_string(Bits, NamedBitList, TagIn); encode_named_bit_string([], _NamedBitList, TagIn) -> encode_unnamed_bit_string(<<>>, TagIn); encode_named_bit_string(Bits, _NamedBitList, TagIn) when is_bitstring(Bits) -> encode_unnamed_bit_string(Bits, TagIn). encode_object_identifier(Val, TagIn) -> encode_tags(TagIn, e_object_identifier(Val)). encode_open_type(Val, T) when is_list(Val) -> encode_open_type(list_to_binary(Val), T); encode_open_type(Val, Tag) -> encode_tags(Tag, Val, byte_size(Val)). encode_restricted_string(OctetList, TagIn) when is_binary(OctetList) -> encode_tags(TagIn, OctetList, byte_size(OctetList)); encode_restricted_string(OctetList, TagIn) when is_list(OctetList) -> encode_tags(TagIn, OctetList, length(OctetList)). encode_tags(TagIn, {BytesSoFar, LenSoFar}) -> encode_tags(TagIn, BytesSoFar, LenSoFar). encode_tags([Tag | Trest], BytesSoFar, LenSoFar) -> {Bytes2, L2} = encode_length(LenSoFar), encode_tags(Trest, [Tag, Bytes2 | BytesSoFar], LenSoFar + byte_size(Tag) + L2); encode_tags([], BytesSoFar, LenSoFar) -> {BytesSoFar, LenSoFar}. encode_universal_string(Universal, TagIn) -> OctetList = mk_uni_list(Universal), encode_tags(TagIn, OctetList, length(OctetList)). encode_unnamed_bit_string(Bits, TagIn) -> Unused = (8 - bit_size(Bits) band 7) band 7, Bin = <>, encode_tags(TagIn, Bin, byte_size(Bin)). get_all_bitposes([{bit, ValPos} | Rest], NamedBitList, Ack) -> get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]); get_all_bitposes([Val | Rest], NamedBitList, Ack) when is_atom(Val) -> case lists:keyfind(Val, 1, NamedBitList) of {_ValName, ValPos} -> get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]); _ -> exit({error, {asn1, {bitstring_namedbit, Val}}}) end; get_all_bitposes([], _NamedBitList, Ack) -> lists:sort(Ack). make_and_set_list(0, [], _) -> []; make_and_set_list(0, _, _) -> exit({error, {asn1, bitstring_sizeconstraint}}); make_and_set_list(Len, [XPos | SetPos], XPos) -> [1 | make_and_set_list(Len - 1, SetPos, XPos + 1)]; make_and_set_list(Len, [Pos | SetPos], XPos) -> [0 | make_and_set_list(Len - 1, [Pos | SetPos], XPos + 1)]; make_and_set_list(Len, [], XPos) -> [0 | make_and_set_list(Len - 1, [], XPos + 1)]. match_and_collect(Tlv, TagsIn) -> Val = match_tags(Tlv, TagsIn), case Val of [_ | _] = PartList -> collect_parts(PartList); Bin when is_binary(Bin) -> Bin end. match_tags({T, V}, [T]) -> V; match_tags({T, V}, [T | Tt]) -> match_tags(V, Tt); match_tags([{T, V}], [T | Tt]) -> match_tags(V, Tt); match_tags([{T, _V} | _] = Vlist, [T]) -> Vlist; match_tags(Tlv, []) -> Tlv; match_tags({Tag, _V} = Tlv, [T | _Tt]) -> exit({error, {asn1, {wrong_tag, {{expected, T}, {got, Tag, Tlv}}}}}). minimum_octets(0, Acc) -> Acc; minimum_octets(Val, Acc) -> minimum_octets(Val bsr 8, [Val band 255 | Acc]). minimum_octets(Val) -> minimum_octets(Val, []). mk_BMP_list(In) -> mk_BMP_list(In, []). mk_BMP_list([], List) -> lists:reverse(List); mk_BMP_list([{0, 0, C, D} | T], List) -> mk_BMP_list(T, [D, C | List]); mk_BMP_list([H | T], List) -> mk_BMP_list(T, [H, 0 | List]). mk_BMP_string(In) -> mk_BMP_string(In, []). mk_BMP_string([], US) -> lists:reverse(US); mk_BMP_string([0, B | T], US) -> mk_BMP_string(T, [B | US]); mk_BMP_string([C, D | T], US) -> mk_BMP_string(T, [{0, 0, C, D} | US]). mk_object_val(0, Ack, Len) -> {Ack, Len}; mk_object_val(Val, Ack, Len) -> mk_object_val(Val bsr 7, [Val band 127 bor 128 | Ack], Len + 1). mk_object_val(Val) when Val =< 127 -> {[255 band Val], 1}; mk_object_val(Val) -> mk_object_val(Val bsr 7, [Val band 127], 1). mk_uni_list(In) -> mk_uni_list(In, []). mk_uni_list([], List) -> lists:reverse(List); mk_uni_list([{A, B, C, D} | T], List) -> mk_uni_list(T, [D, C, B, A | List]); mk_uni_list([H | T], List) -> mk_uni_list(T, [H, 0, 0, 0 | List]). mk_universal_string(In) -> mk_universal_string(In, []). mk_universal_string([], Acc) -> lists:reverse(Acc); mk_universal_string([0, 0, 0, D | T], Acc) -> mk_universal_string(T, [D | Acc]); mk_universal_string([A, B, C, D | T], Acc) -> mk_universal_string(T, [{A, B, C, D} | Acc]). unused_bitlist([], Trail, Ack) -> {Trail + 1, Ack}; unused_bitlist([Bit | Rest], Trail, Ack) -> unused_bitlist(Rest, Trail - 1, Bit bsl Trail bor Ack).