Rewrote crypto library init/uninit. Added silc_crypto_init
[crypto.git] / lib / silccrypt / silcpkcs_i.h
diff --git a/lib/silccrypt/silcpkcs_i.h b/lib/silccrypt/silcpkcs_i.h
new file mode 100644 (file)
index 0000000..7eb80ae
--- /dev/null
@@ -0,0 +1,275 @@
+/*
+
+  silcpkcs_i.h
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 1997 - 2007 Pekka Riikonen
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+#ifndef SILCPKCS_I_H
+#define SILCPKCS_I_H
+
+#ifndef SILCPKCS_H
+#error "Do not include this header directly"
+#endif
+
+/* The PKCS Algorithm object to represent any PKCS algorithm.  This context
+   implements the PKCS algorithm, such as RSA, DSA, etc. */
+struct SilcPKCSAlgorithmStruct {
+  /* Algorithm name and scheme */
+  char *name;                  /* Eg. rsa, dsa, etc. */
+  char *scheme;                        /* Eg. pkcs1, openpgp, etc. */
+
+  /* Supported hash functions, comma separated list */
+  char *hash;
+
+  /* Generate new key pair. Returns PKCS algorithm specific public key
+     and private key contexts. */
+  SilcBool (*generate_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                          SilcUInt32 keylen,
+                          SilcRng rng,
+                          void **ret_public_key,
+                          void **ret_private_key);
+
+  /* Public key routines. */
+
+  /* Import/create new public key.  Returns the length of the data that was
+     imported from `key' or 0 on error.  Returns the PKCS algorithm specific
+     public key to `ret_public_key'. */
+  int (*import_public_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                          void *key, SilcUInt32 key_len,
+                          void **ret_public_key);
+
+  /* Export/encode public key.  Returns the encoded public key buffer that
+     the caller must free. */
+  unsigned char *
+  (*export_public_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                      SilcStack stack,
+                      void *public_key,
+                      SilcUInt32 *ret_len);
+
+  /* Returns the bit length of public key */
+  SilcUInt32 (*public_key_bitlen)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                                 void *public_key);
+
+  /* Duplicated public key */
+  void *(*public_key_copy)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                          void *public_key);
+
+  /* Compares two public keys.  Returns TRUE if they are identical. */
+  SilcBool (*public_key_compare)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                                void *key1, void *key2);
+
+  /* Free public key */
+  void (*public_key_free)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                         void *public_key);
+
+  /* Private key routines. */
+
+  /* Import/create new private key.  Returns the length of the data that was
+     imported from `key' or 0 on error.  Returns the PKCS algorithm specific
+     private key to `ret_private_key'. */
+  int (*import_private_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                           void *key,
+                           SilcUInt32 key_len,
+                           void **ret_private_key);
+
+  /* Export/encode private key.  Returns the encoded private key buffer that
+     the caller must free. */
+  unsigned char *
+  (*export_private_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                       SilcStack stack,
+                       void *private_key,
+                       SilcUInt32 *ret_len);
+
+  /* Returns the bi length of private key */
+  SilcUInt32 (*private_key_bitlen)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                                  void *public_key);
+
+  /* Free private key */
+  void (*private_key_free)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                          void *private_key);
+
+  /* Encrypt and decrypt operations */
+  SilcAsyncOperation (*encrypt)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                               void *public_key,
+                               unsigned char *src,
+                               SilcUInt32 src_len,
+                               SilcRng rng,
+                               SilcPKCSEncryptCb encrypt_cb,
+                               void *context);
+  SilcAsyncOperation (*decrypt)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                               void *private_key,
+                               unsigned char *src,
+                               SilcUInt32 src_len,
+                               SilcPKCSDecryptCb decrypt_cb,
+                               void *context);
+
+  /* Signature and verification operations */
+  SilcAsyncOperation (*sign)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                            void *private_key,
+                            unsigned char *src,
+                            SilcUInt32 src_len,
+                            SilcBool compute_hash,
+                            SilcHash hash,
+                            SilcPKCSSignCb sign_cb,
+                            void *context);
+  SilcAsyncOperation (*verify)(const struct SilcPKCSAlgorithmStruct *pkcs,
+                              void *public_key,
+                              unsigned char *signature,
+                              SilcUInt32 signature_len,
+                              unsigned char *data,
+                              SilcUInt32 data_len,
+                              SilcHash hash,
+                              SilcPKCSVerifyCb verify_cb,
+                              void *context);
+};
+
+/* The PKCS (Public Key Cryptosystem) object to represent any PKCS.  This
+   context implements the PKCS, such as SILC public keys, X.509 certificates,
+   OpenPGP certificates, etc. under a common API. */
+struct SilcPKCSObjectStruct {
+  /* PKCS type */
+  SilcPKCSType type;
+
+  /* Public key routines */
+
+  /* Returns PKCS algorithm context from public key */
+  const SilcPKCSAlgorithm *
+  (*get_algorithm)(const struct SilcPKCSObjectStruct *pkcs,
+                  void *public_key);
+
+  /* Imports from public key file */
+  SilcBool (*import_public_key_file)(const struct SilcPKCSObjectStruct *pkcs,
+                                    unsigned char *filedata,
+                                    SilcUInt32 filedata_len,
+                                    SilcPKCSFileEncoding encoding,
+                                    void **ret_public_key);
+
+  /* Imports from public key binary data.  Returns the amount of bytes
+     imported from `key' or 0 on error. */
+  int (*import_public_key)(const struct SilcPKCSObjectStruct *pkcs,
+                          void *key,
+                          SilcUInt32 key_len,
+                          void **ret_public_key);
+
+  /* Exports public key to file */
+  unsigned char *
+  (*export_public_key_file)(const struct SilcPKCSObjectStruct *pkcs,
+                           SilcStack stack,
+                           void *public_key,
+                           SilcPKCSFileEncoding encoding,
+                           SilcUInt32 *ret_len);
+
+  /* Export public key as binary data */
+  unsigned char *(*export_public_key)(const struct SilcPKCSObjectStruct *pkcs,
+                                     SilcStack stack,
+                                     void *public_key,
+                                     SilcUInt32 *ret_len);
+
+  /* Returns key length in bits */
+  SilcUInt32 (*public_key_bitlen)(const struct SilcPKCSObjectStruct *pkcs,
+                                 void *public_key);
+
+  /* Copy public key */
+  void *(*public_key_copy)(const struct SilcPKCSObjectStruct *pkcs,
+                          void *public_key);
+
+  /* Compares public keys */
+  SilcBool (*public_key_compare)(const struct SilcPKCSObjectStruct *pkcs,
+                                void *key1, void *key2);
+
+  /* Free public key */
+  void (*public_key_free)(const struct SilcPKCSObjectStruct *pkcs,
+                         void *public_key);
+
+  /* Private key routines */
+
+  /* Imports from private key file */
+  SilcBool (*import_private_key_file)(const struct SilcPKCSObjectStruct *pkcs,
+                                     unsigned char *filedata,
+                                     SilcUInt32 filedata_len,
+                                     const char *passphrase,
+                                     SilcUInt32 passphrase_len,
+                                     SilcPKCSFileEncoding encoding,
+                                     void **ret_private_key);
+
+  /* Imports from private key binary data.  Returns the amount of bytes
+     imported from `key' or 0 on error. */
+  int (*import_private_key)(const struct SilcPKCSObjectStruct *pkcs,
+                           void *key,
+                           SilcUInt32 key_len,
+                           void **ret_private_key);
+
+  /* Exports private key to file */
+  unsigned char *
+  (*export_private_key_file)(const struct SilcPKCSObjectStruct *pkcs,
+                            SilcStack stack,
+                            void *private_key,
+                            const char *passphrase,
+                            SilcUInt32 passphrase_len,
+                            SilcPKCSFileEncoding encoding,
+                            SilcRng rng,
+                            SilcUInt32 *ret_len);
+
+  /* Export private key as binary data */
+  unsigned char *(*export_private_key)(const struct SilcPKCSObjectStruct *pkcs,
+                                      SilcStack stack,
+                                      void *private_key,
+                                      SilcUInt32 *ret_len);
+
+  /* Returns key length in bits */
+  SilcUInt32 (*private_key_bitlen)(const struct SilcPKCSObjectStruct *pkcs,
+                                  void *private_key);
+
+  /* Free private key */
+  void (*private_key_free)(const struct SilcPKCSObjectStruct *pkcs,
+                          void *private_key);
+
+  /* Encrypt and decrypt operations */
+  SilcAsyncOperation (*encrypt)(const struct SilcPKCSObjectStruct *pkcs,
+                               void *public_key,
+                               unsigned char *src,
+                               SilcUInt32 src_len,
+                               SilcRng rng,
+                               SilcPKCSEncryptCb encrypt_cb,
+                               void *context);
+  SilcAsyncOperation (*decrypt)(const struct SilcPKCSObjectStruct *pkcs,
+                               void *private_key,
+                               unsigned char *src,
+                               SilcUInt32 src_len,
+                               SilcPKCSDecryptCb decrypt_cb,
+                               void *context);
+
+  /* Signature and verification operations */
+  SilcAsyncOperation (*sign)(const struct SilcPKCSObjectStruct *pkcs,
+                            void *private_key,
+                            unsigned char *src,
+                            SilcUInt32 src_len,
+                            SilcBool compute_hash,
+                            SilcHash hash,
+                            SilcPKCSSignCb sign_cb,
+                            void *context);
+  SilcAsyncOperation (*verify)(const struct SilcPKCSObjectStruct *pkcs,
+                              void *public_key,
+                              unsigned char *signature,
+                              SilcUInt32 signature_len,
+                              unsigned char *data,
+                              SilcUInt32 data_len,
+                              SilcHash hash,
+                              SilcPKCSVerifyCb verify_cb,
+                              void *context);
+};
+
+#endif /* SILCPKCS_I_H */