summaryrefslogtreecommitdiff
path: root/module/pkcs.m
diff options
context:
space:
mode:
Diffstat (limited to 'module/pkcs.m')
-rw-r--r--module/pkcs.m176
1 files changed, 176 insertions, 0 deletions
diff --git a/module/pkcs.m b/module/pkcs.m
new file mode 100644
index 00000000..cf164e59
--- /dev/null
+++ b/module/pkcs.m
@@ -0,0 +1,176 @@
+#
+# Public-Key Cryptography Standards (PKCS)
+#
+# Ref: http://www.rsa.com
+# RFC1423
+#
+
+PKCS: module {
+
+ PATH: con "/dis/lib/crypt/pkcs.dis";
+
+ init: fn(): string;
+
+ # PKCS Object Identifiers
+
+ objIdTab : array of ASN1->Oid;
+
+ id_pkcs,
+ id_pkcs_1,
+ id_pkcs_rsaEncryption,
+ id_pkcs_md2WithRSAEncryption,
+ id_pkcs_md4WithRSAEncryption,
+ id_pkcs_md5WithRSAEncryption,
+ id_pkcs_3,
+ id_pkcs_dhKeyAgreement,
+ id_pkcs_5,
+ id_pkcs_pbeWithMD2AndDESCBC,
+ id_pkcs_pbeWithMD5AndDESCBC,
+ id_pkcs_7,
+ id_pkcs_data,
+ id_pkcs_singnedData,
+ id_pkcs_envelopedData,
+ id_pkcs_signedAndEnvelopedData,
+ id_pkcs_digestData,
+ id_pkcs_encryptedData,
+ id_pkcs_9,
+ id_pkcs_emailAddress,
+ id_pkcs_unstructuredName,
+ id_pkcs_contentType,
+ id_pkcs_messageDigest,
+ id_pkcs_signingTime,
+ id_pkcs_countersignature,
+ id_pkcs_challengePassword,
+ id_pkcs_unstructuredAddress,
+ id_pkcs_extCertAttrs,
+ id_algorithm_shaWithDSS : con iota;
+
+ # PKCS1
+
+ RSAParams: adt {
+ modulus : ref Keyring->IPint;
+ exponent : ref Keyring->IPint;
+ };
+
+ RSAKey: adt {
+ modulus : ref Keyring->IPint;
+ modlen : int;
+ exponent : ref Keyring->IPint;
+
+ bits: fn(k: self ref RSAKey): int;
+ #tostring: fn(k: self ref RSAKey): string;
+ };
+
+ MD2_WithRSAEncryption : con 0;
+ MD5_WithRSAEncryption : con 1;
+
+ rsa_encrypt: fn(data: array of byte, key: ref RSAKey, blocktype: int): (string, array of byte);
+ rsa_decrypt: fn(data: array of byte, key: ref RSAKey, public: int): (string, array of byte);
+ rsa_sign: fn(data: array of byte, sk: ref RSAKey, algid: int): (string, array of byte);
+ rsa_verify: fn(data, signature: array of byte, pk: ref RSAKey, algid: int): int;
+ decode_rsapubkey: fn(a: array of byte): (string, ref RSAKey);
+
+ # Note:
+ # DSS included here is only for completeness.
+
+ DSSParams: adt {
+ p : ref Keyring->IPint;
+ q : ref Keyring->IPint;
+ alpha : ref Keyring->IPint;
+ };
+
+ DSSPublicKey: adt {
+ params : ref DSSParams;
+ y : ref Keyring->IPint;
+ };
+
+ DSSPrivateKey: adt {
+ params : ref DSSParams;
+ x : ref Keyring->IPint;
+ };
+
+ generateDSSKeyPair: fn(strength: int): (ref DSSPublicKey, ref DSSPrivateKey);
+ dss_sign: fn(a: array of byte, sk: ref DSSPrivateKey): (string, array of byte);
+ dss_verify: fn(a, signa: array of byte, pk: ref DSSPublicKey): int;
+ decode_dsspubkey: fn(a: array of byte): (string, ref DSSPublicKey);
+
+ # PKCS3
+
+ DHParams: adt {
+ prime : ref Keyring->IPint; # prime (p)
+ base : ref Keyring->IPint; # generator (alpha)
+ privateValueLength : int;
+ };
+
+ DHPublicKey: adt {
+ param : ref DHParams;
+ pk : ref Keyring->IPint;
+ };
+
+ DHPrivateKey: adt {
+ param : ref DHParams;
+ pk : ref Keyring->IPint;
+ sk : ref Keyring->IPint;
+ };
+
+ generateDHParams: fn(primelen: int): ref DHParams;
+ setupDHAgreement: fn(dh: ref DHParams): (ref DHPrivateKey, ref DHPublicKey);
+ computeDHAgreedKey: fn(dh: ref DHParams, mysk, upk: ref Keyring->IPint): array of byte;
+ decode_dhpubkey: fn(a: array of byte): (string, ref DHPublicKey);
+
+ # PKCS5
+
+ PBEParams: adt {
+ salt : array of byte; # [8]
+ iterationCount : int;
+ };
+
+ PBE_MD2_DESCBC : con 0;
+ PBE_MD5_DESCBC : con 1;
+
+ generateDESKey: fn(pw: array of byte, param: ref PBEParams, alg: int)
+ : (ref Keyring->DESstate, array of byte, array of byte);
+ pbe_encrypt: fn(state: ref Keyring->DESstate, b: array of byte): array of byte;
+ pbe_decrypt: fn(state: ref Keyring->DESstate, eb: array of byte): array of byte;
+
+ # PKCS6
+
+ ExtCertInfo: adt {
+ version : int;
+ cert : array of byte; # der encoded x509 Certificate
+ attrs : list of array of byte; # attribute as array of byte
+ };
+
+ # PKCS7
+ # See module X509
+
+ # PKCS8
+
+ PrivateKeyInfo: adt { # as SEQUENCE
+ version : int; # should be 0
+ privateKeyAlgorithm : ref AlgIdentifier;
+ privateKey : array of byte; # octet string
+ attrs : list of array of byte; # [0] IMPLICIT Attributes OPTIONAL
+
+ encode: fn(p: self ref PrivateKeyInfo): (string, array of byte);
+ decode: fn(a: array of byte): (string, ref PrivateKeyInfo);
+ };
+
+ EncryptedPrivateKeyInfo: adt { # as SEQUENCE
+ encryptionAlgorithm : ref AlgIdentifier;
+ encryptedData : array of byte; # octet string
+
+ encode: fn(ep: self ref EncryptedPrivateKeyInfo): (string, array of byte);
+ decode: fn(a: array of byte): (string, ref EncryptedPrivateKeyInfo);
+ };
+
+ AlgIdentifier: adt { # TODO: move this to ASN1
+ oid : ref ASN1->Oid;
+ parameter : array of byte;
+ };
+
+ # PKCS10
+ # See module X509
+};
+
+