diff options
Diffstat (limited to 'module/x509.m')
| -rw-r--r-- | module/x509.m | 370 |
1 files changed, 370 insertions, 0 deletions
diff --git a/module/x509.m b/module/x509.m new file mode 100644 index 00000000..3dbec330 --- /dev/null +++ b/module/x509.m @@ -0,0 +1,370 @@ +# +# X.509 v3 by ITU-T Recommendation (11/93) & PKCS7 & PKCS10 +# + +X509: module { + + PATH: con "/dis/lib/crypt/x509.dis"; + + init: fn(): string; + + ## x509 (id_at) and x509 extention v3 (id_ce) Object Identifiers + + objIdTab : array of ASN1->Oid; + + id_at, + id_at_commonName, + id_at_countryName, + id_at_localityName, + id_at_stateOrProvinceName, + id_at_organizationName, + id_at_organizationalUnitName, + id_at_userPassword, + id_at_userCertificate, + id_at_cAcertificate, + id_at_authorityRevocationList, + id_at_certificateRevocationList, + id_at_crossCertificatePair, + id_at_supportedAlgorithms, + id_at_deltaRevocationList, + id_ce, + id_ce_subjectDirectoryAttributes, + id_ce_subjectKeyIdentifier, + id_ce_keyUsage, + id_ce_privateKeyUsage, + id_ce_subjectAltName, + id_ce_issuerAltName, + id_ce_basicConstraints, + id_ce_cRLNumber, + id_ce_reasonCode, + id_ce_instructionCode, + id_ce_invalidityDate, + id_ce_deltaCRLIndicator, + id_ce_issuingDistributionPoint, + id_ce_certificateIssuer, + id_ce_nameConstraints, + id_ce_cRLDistributionPoint, + id_ce_certificatePolicies, + id_ce_policyMapping, + id_ce_authorityKeyIdentifier, + id_ce_policyConstraints, + id_mr, + id_mr_certificateExactMatch, + id_mr_certificateMatch, + id_mr_certificatePairExactMatch, + id_mr_certificatePairMatch, + id_mr_certificateListExactMatch, + id_mr_certificateListMatch, + id_mr_algorithmidentifierMatch : con iota; + + ## Signed (as Public Key, CRL, Attribute Certificates and CertificationRequest) + + Signed: adt { + tobe_signed : array of byte; + alg : ref AlgIdentifier; + signature : array of byte; # BIT STRING, DER encoding + + decode: fn(a: array of byte): (string, ref Signed); + encode: fn(s: self ref Signed): (string, array of byte); + sign: fn(s: self ref Signed, sk: ref PrivateKey, hash: int): (string, array of byte); + verify: fn(s: self ref Signed, pk: ref PublicKey, hash: int): int; + tostring: fn(s: self ref Signed): string; + }; + + ## Certificate Path + + verify_certchain: fn(cs: list of array of byte): (int, string); + verify_certpath: fn(cp: list of (ref Signed, ref Certificate)): (int, string); + + ## TBS (Public Key) Certificate + + Certificate: adt { + version : int; # v1(0; default) or v2(1) or v3(2) + serial_number : ref Keyring->IPint; + sig : ref AlgIdentifier; + issuer : ref Name; + validity : ref Validity; + subject : ref Name; + subject_pkinfo : ref SubjectPKInfo; + # OPTIONAL for v2 and v3; must be in order + issuer_uid : array of byte; # v2 + subject_uid : array of byte; # v2 or v3 + exts : list of ref Extension; # v3 + + decode: fn(a: array of byte): (string, ref Certificate); + encode: fn(c: self ref Certificate): (string, array of byte); + tostring: fn(c: self ref Certificate): string; + is_expired: fn(c: self ref Certificate, date: int): int; + }; + + AlgIdentifier: adt { + oid : ref ASN1->Oid; + parameter : array of byte; + + tostring: fn(a: self ref AlgIdentifier): string; + }; + + Name: adt { + rd_names : list of ref RDName; + + equal: fn(a: self ref Name, b: ref Name): int; + tostring: fn(n: self ref Name): string; + }; + + RDName: adt { + avas : list of ref AVA; + + equal: fn(a: self ref RDName, b: ref RDName): int; + tostring: fn(r: self ref RDName): string; + }; + + AVA: adt { + oid : ref ASN1->Oid; + value : string; + + equal: fn(a: self ref AVA, b: ref AVA): int; + tostring: fn(a: self ref AVA): string; + }; + + Validity: adt { + not_before : int; + not_after : int; + + tostring: fn(v: self ref Validity, format: string): string; + }; + + SubjectPKInfo: adt { + alg_id : ref AlgIdentifier; + subject_pk : array of byte; # BIT STRING + + getPublicKey: fn(c: self ref SubjectPKInfo): (string, int, ref PublicKey); + tostring: fn(c: self ref SubjectPKInfo): string; + }; + + Extension: adt{ + oid : ref ASN1->Oid; + critical : int; # default false + value : array of byte; + + tostring: fn(e: self ref Extension): string; + }; + + PublicKey: adt { + pick { + RSA => + pk : ref PKCS->RSAKey; + DSS => + pk : ref PKCS->DSSPublicKey; + DH => + pk : ref PKCS->DHPublicKey; + } + }; + + PrivateKey: adt { + pick { + RSA => + sk : ref PKCS->RSAKey; + DSS => + sk : ref PKCS->DSSPrivateKey; + DH => + sk : ref PKCS->DHPrivateKey; + } + }; + + ## Certificate Revocation List + + CRL: adt { + version : int; # OPTIONAL; v2 + sig : ref AlgIdentifier; + issuer : ref Name; + this_update : int; + next_update : int; # OPTIONAL + revoked_certs : list of ref RevokedCert; # OPTIONAL + exts : list of ref Extension; # OPTIONAL + + decode: fn(a: array of byte): (string, ref CRL); + encode: fn(c: self ref CRL): (string, array of byte); + tostring: fn(c: self ref CRL): string; + is_revoked: fn(c: self ref CRL, sn: ref Keyring->IPint): int; + }; + + RevokedCert: adt { + user_cert : ref Keyring->IPint; # serial_number + revoc_date : int; # OPTIONAL + exts : list of ref Extension; # OPTIONAL; CRL entry extensions + + tostring: fn(rc: self ref RevokedCert): string; + }; + + ## Certificate Extensions + + # get critical extensions + cr_exts: fn(es: list of ref Extension): list of ref Extension; + + # get non-critical extensions + noncr_exts: fn(es: list of ref Extension): list of ref Extension; + + # decode a list of extensions + parse_exts: fn(es: list of ref Extension): (string, list of ref ExtClass); + + # extension classes + ExtClass: adt { + pick { + AuthorityKeyIdentifier => + id : array of byte; # OCTET STRING + issuer : ref GeneralName; + serial_number : ref Keyring->IPint; + SubjectKeyIdentifier => + id : array of byte; # OCTET STRING + BasicConstraints => + depth : int; # certificate path constraints + KeyUsage => + usage : int; + PrivateKeyUsage => + period : ref Validity; + PolicyMapping => # (issuer, subject) domain policy pairs + pairs : list of (ref ASN1->Oid, ref ASN1->Oid); + CertificatePolicies => + policies : list of ref PolicyInfo; + IssuerAltName => + alias : list of ref GeneralName; + SubjectAltName => + alias : list of ref GeneralName; + NameConstraints => + permitted : list of ref GSubtree; + excluded : list of ref GSubtree; + PolicyConstraints => + require : int; + inhibit : int; + CRLNumber => + curr : int; + ReasonCode => + code : int; + InstructionCode => + oid : ref ASN1->Oid; # hold instruction code field + InvalidityDate => + date : int; + CRLDistributionPoint => + ps : list of ref DistrPoint; + IssuingDistributionPoint => + name : ref DistrPointName; + only_usercerts : int; # DEFAULT FALSE + only_cacerts : int; # DEFAULT FALSE + only_reasons : int; + indirect_crl : int; # DEFAULT FALSE + CertificateIssuer => + names : list of ref GeneralName; + DeltaCRLIndicator => + number : ref Keyring->IPint; + SubjectDirectoryAttributes => + attrs : list of ref Attribute; + UnknownType => + ext : ref Extension; + } + + decode: fn(ext: ref Extension): (string, ref ExtClass); + encode: fn(et: self ref ExtClass, critical: int): ref Extension; + tostring: fn(et: self ref ExtClass): string; + }; + + # key usage + KeyUsage_DigitalSignature, KeyUsage_NonRepudiation, KeyUsage_KeyEncipherment, + KeyUsage_DataEncipherment, KeyUsage_KeyAgreement, KeyUsage_KeyCertSign, + KeyUsage_CRLSign, KeyUsage_EncipherOnly, KeyUsage_DecipherOnly : con iota << 1; + + # CRL reason + Reason_Unspecified, Reason_KeyCompromise, Reason_CACompromise, + Reason_AffiliationChanged, Reason_Superseded, Reason_CessationOfOperation, + Reason_CertificateHold, Reason_RemoveFromCRL : con iota << 1; + + # General Name + GeneralName: adt { + pick { + otherName or # [0] + rfc822Name or # [1] + dNSName or # [2] + x400Address or # [3] + uniformResourceIdentifier => # [6] + str : string; + iPAddress => # [7] + ip : array of byte; + registeredID => # [8] + oid : ref ASN1->Oid; + ediPartyName => # [5] + nameAssigner : ref Name; # [0] + partyName : ref Name; # [1] + directoryName => # [4] + dir : ref Name; + } + + tostring: fn(g: self ref GeneralName): string; + }; + + # security policies + PolicyInfo: adt { + oid : ref ASN1->Oid; + qualifiers : list of ref PolicyQualifier; + + tostring: fn(pi: self ref PolicyInfo): string; + }; + + PolicyQualifier: adt { + oid : ref ASN1->Oid; + value : array of byte; # OCTET STRING; OPTIONAL + + tostring: fn(pq: self ref PolicyQualifier): string; + }; + + GSubtree: adt { + base : ref GeneralName; + min : int; + max : int; + + tostring: fn(gs: self ref GSubtree): string; + }; + + # crl distribution point + # with known reason code + # Unused [0], KeyCompromise [1], CACompromise [2], AffilationChanged [3], + # Superseded [4], CessationOfOperation [5], CertificateHold [6] + DistrPoint: adt{ + name : ref DistrPointName; + reasons : int; + issuer : list of ref GeneralName; + + tostring: fn(dp: self ref DistrPoint): string; + }; + + DistrPointName: adt { + full_name : list of ref GeneralName; + rdname : list of ref RDName; + }; + + Attribute: adt { + id : ASN1->Oid; + value : array of byte; + }; +}; + +#X509Attribute: module { +# +# ## Attribute Certificate +# +# AttrCert: adt { +# version : int; # default v1 +# base_certid : ref IssuerSerial; # [0] +# subject_name : list of ref GeneralName; # [1] +# issuer : list of ref GeneralName; +# serial_number : ref IPint; +# validity : ref Validity; +# attrs : list of ref Attribute; +# issuer_uid : array of byte; # OPTIONAL +# exts : list of ref Extension; # OPTIONAL +# }; +# +# IssuerSerial: adt { +# issuer : list of ref GeneralName; +# serial : ref IPint; +# issuer_uid : array of byte; # OPTIONAL +# }; +#}; |
