updates.
[silc.git] / lib / silccrypt / silcpkcs.h
index 9d7fd82da58cfd8c2ba3bcec2bcd2cbf3c3d1901..94a7fd8b36184e6b1a854d55b864aa1403a1c04a 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
 
-  Copyright (C) 1997 - 2000 Pekka Riikonen
+  Copyright (C) 1997 - 2001 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 default SILC PKCS (Public Key Cryptosystem) object to represent
    any PKCS in SILC. */
 typedef struct SilcPKCSObjectStruct {
-  unsigned char *name;
-  void *data_context;
-
-  int (*init)(void *, unsigned int, SilcRng);
+  char *name;
+  int (*init)(void *, uint32, SilcRng);
   void (*clear_keys)(void *);
-  unsigned char *(*get_public_key)(void *, unsigned int *);
-  unsigned char *(*get_private_key)(void *, unsigned int *);
-  int (*set_public_key)(void *, unsigned char *, unsigned int);
-  int (*set_private_key)(void *, unsigned char *, unsigned int);
-  unsigned int (*context_len)();
-  unsigned int (*data_context_len)();
-  int (*set_arg)(void *, void *, int, SilcInt);
-  int (*encrypt)(void *, unsigned char *, unsigned int,
-                unsigned char *, unsigned int *);
-  int (*decrypt)(void *, unsigned char *, unsigned int,
-                unsigned char *, unsigned int *);
-  int (*sign)(void *, unsigned char *, unsigned int,
-             unsigned char *, unsigned int *);
-  int (*verify)(void *, unsigned char *, unsigned int,
-               unsigned char *, unsigned int);
+  unsigned char *(*get_public_key)(void *, uint32 *);
+  unsigned char *(*get_private_key)(void *, uint32 *);
+  uint32 (*set_public_key)(void *, unsigned char *, uint32);
+  int (*set_private_key)(void *, unsigned char *, uint32);
+  uint32 (*context_len)();
+  int (*encrypt)(void *, unsigned char *, uint32,
+                unsigned char *, uint32 *);
+  int (*decrypt)(void *, unsigned char *, uint32,
+                unsigned char *, uint32 *);
+  int (*sign)(void *, unsigned char *, uint32,
+             unsigned char *, uint32 *);
+  int (*verify)(void *, unsigned char *, uint32,
+               unsigned char *, uint32);
 } SilcPKCSObject;
 
 /* The main SILC PKCS structure. Use SilcPKCS instead of SilcPKCSStruct.
@@ -51,13 +47,40 @@ typedef struct SilcPKCSObjectStruct {
 typedef struct SilcPKCSStruct {
   void *context;
   SilcPKCSObject *pkcs;
-  unsigned int key_len;
+  uint32 key_len;
 
-  unsigned int (*get_key_len)(struct SilcPKCSStruct *);
+  uint32 (*get_key_len)(struct SilcPKCSStruct *);
 } *SilcPKCS;
 
-/* List of all PKCS in SILC. */
-extern SilcPKCSObject silc_pkcs_list[];
+/* SILC style public key object. Public key is read from file to this
+   object. Public keys received from network must be in this format as 
+   well. */
+typedef struct {
+  uint32 len;
+  char *name;
+  char *identifier;
+  unsigned char *pk;
+  uint32 pk_len;
+} *SilcPublicKey;
+
+/* SILC style private key object. Private key is read from file to this
+   object. */
+typedef struct {
+  char *name;
+  unsigned char *prv;
+  uint32 prv_len;
+} *SilcPrivateKey;
+
+/* Decoded SILC Public Key identifier. Note that some of the fields 
+   may be NULL. */
+typedef struct {
+  char *username;
+  char *host;
+  char *realname;
+  char *email;
+  char *org;
+  char *country;
+} *SilcPublicKeyIdentifier;
 
 /* Public and private key file headers */
 #define SILC_PKCS_PUBLIC_KEYFILE_BEGIN "-----BEGIN SILC PUBLIC KEY-----\n"
@@ -65,6 +88,17 @@ extern SilcPKCSObject silc_pkcs_list[];
 #define SILC_PKCS_PRIVATE_KEYFILE_BEGIN "-----BEGIN SILC PRIVATE KEY-----\n"
 #define SILC_PKCS_PRIVATE_KEYFILE_END "\n-----END SILC PRIVATE KEY-----\n"
 
+/* Public and private key file encoding types */
+#define SILC_PKCS_FILE_BIN 0
+#define SILC_PKCS_FILE_PEM 1
+
+/* Marks for all PKCS in silc. This can be used in silc_pkcs_unregister
+   to unregister all PKCS at once. */
+#define SILC_ALL_PKCS ((SilcPKCSObject *)1)
+
+/* Static list of PKCS for silc_pkcs_register_default(). */
+extern SilcPKCSObject silc_default_pkcs[];
+
 /* Macros */
 
 /* Macros used to implement the SILC PKCS API */
@@ -79,7 +113,7 @@ extern SilcPKCSObject silc_pkcs_list[];
    would look something like this:
 
    #define SILC_PKCS_API_INIT(pkcs) \
-   inline int silc_##pkcs##_init(void *context, unsigned int keylen, \
+   inline int silc_##pkcs##_init(void *context, uint32 keylen, \
                                  void *p1, void *p2)
 
    Now we wouldn't have to send the SilcRng object since the primes are 
@@ -91,74 +125,124 @@ extern SilcPKCSObject silc_pkcs_list[];
 */
 
 #define SILC_PKCS_API_INIT(pkcs) \
-int silc_##pkcs##_init(void *context, unsigned int keylen, \
+int silc_##pkcs##_init(void *context, uint32 keylen, \
                       SilcRng rng)
 #define SILC_PKCS_API_CLEAR_KEYS(pkcs) \
 void silc_##pkcs##_clear_keys(void *context)
 #define SILC_PKCS_API_GET_PUBLIC_KEY(pkcs) \
 unsigned char *silc_##pkcs##_get_public_key(void *context, \
-                                            unsigned int *ret_len)
+                                            uint32 *ret_len)
 #define SILC_PKCS_API_GET_PRIVATE_KEY(pkcs) \
 unsigned char *silc_##pkcs##_get_private_key(void *context, \
-                                             unsigned int *ret_len)
+                                             uint32 *ret_len)
 #define SILC_PKCS_API_SET_PUBLIC_KEY(pkcs) \
-int silc_##pkcs##_set_public_key(void *context, unsigned char *key_data, \
-                                 unsigned int key_len)
+uint32 silc_##pkcs##_set_public_key(void *context, unsigned char *key_data, \
+                                    uint32 key_len)
 #define SILC_PKCS_API_SET_PRIVATE_KEY(pkcs) \
 int silc_##pkcs##_set_private_key(void *context, unsigned char *key_data, \
-                                  unsigned int key_len)
+                                  uint32 key_len)
 #define SILC_PKCS_API_CONTEXT_LEN(pkcs) \
-unsigned int silc_##pkcs##_context_len()
-#define SILC_PKCS_API_DATA_CONTEXT_LEN(pkcs) \
-unsigned int silc_##pkcs##_data_context_len()
-#define SILC_PKCS_API_SET_ARG(pkcs) \
-int silc_##pkcs##_set_arg(void *context, \
-                         void *data_context, \
-                         int argnum, \
-                         SilcInt val)
+uint32 silc_##pkcs##_context_len()
 #define SILC_PKCS_API_ENCRYPT(pkcs) \
 int silc_##pkcs##_encrypt(void *context, \
                          unsigned char *src, \
-                         unsigned int src_len, \
+                         uint32 src_len, \
                          unsigned char *dst, \
-                         unsigned int *dst_len)
+                         uint32 *dst_len)
 #define SILC_PKCS_API_DECRYPT(pkcs) \
 int silc_##pkcs##_decrypt(void *context, \
                          unsigned char *src, \
-                         unsigned int src_len, \
+                         uint32 src_len, \
                          unsigned char *dst, \
-                         unsigned int *dst_len)
+                         uint32 *dst_len)
 #define SILC_PKCS_API_SIGN(pkcs) \
 int silc_##pkcs##_sign(void *context, \
                       unsigned char *src, \
-                      unsigned int src_len, \
+                      uint32 src_len, \
                       unsigned char *dst, \
-                      unsigned int *dst_len)
+                      uint32 *dst_len)
 #define SILC_PKCS_API_VERIFY(pkcs) \
 int silc_##pkcs##_verify(void *context, \
                         unsigned char *signature, \
-                        unsigned int signature_len, \
+                        uint32 signature_len, \
                         unsigned char *data, \
-                        unsigned int data_len)
+                        uint32 data_len)
 
 /* Prototypes */
-int silc_pkcs_alloc(const unsigned char *name, SilcPKCS *new_pkcs);
+bool silc_pkcs_register(SilcPKCSObject *pkcs);
+bool silc_pkcs_unregister(SilcPKCSObject *pkcs);
+bool silc_pkcs_register_default(void);
+bool silc_pkcs_alloc(const unsigned char *name, SilcPKCS *new_pkcs);
 void silc_pkcs_free(SilcPKCS pkcs);
 int silc_pkcs_is_supported(const unsigned char *name);
-char *silc_pkcs_get_supported();
-unsigned int silc_pkcs_get_key_len(SilcPKCS self);
-unsigned char *silc_pkcs_get_public_key(SilcPKCS pkcs, unsigned int *len);
-unsigned char *silc_pkcs_get_private_key(SilcPKCS pkcs, unsigned int *len);
-int silc_pkcs_set_public_key(SilcPKCS pkcs, unsigned char *pk, 
-                            unsigned int pk_len);
-int silc_pkcs_set_private_key(SilcPKCS pkcs, unsigned char *prv, 
-                             unsigned int prv_len);
-int silc_pkcs_save_public_key(SilcPKCS pkcs, char *filename,
-                             unsigned char *pk, unsigned int pk_len);
-int silc_pkcs_save_private_key(SilcPKCS pkcs, char *filename,
-                              unsigned char *prv, unsigned int prv_len,
-                              char *passphrase);
-int silc_pkcs_load_public_key(char *filename, SilcPKCS *ret_pkcs);
-int silc_pkcs_load_private_key(char *filename, SilcPKCS *ret_pkcs);
+char *silc_pkcs_get_supported(void);
+uint32 silc_pkcs_get_key_len(SilcPKCS self);
+unsigned char *silc_pkcs_get_public_key(SilcPKCS pkcs, uint32 *len);
+unsigned char *silc_pkcs_get_private_key(SilcPKCS pkcs, uint32 *len);
+uint32 silc_pkcs_public_key_set(SilcPKCS pkcs, SilcPublicKey public_key);
+uint32 silc_pkcs_public_key_data_set(SilcPKCS pkcs, unsigned char *pk,
+                                    uint32 pk_len);
+int silc_pkcs_private_key_set(SilcPKCS pkcs, SilcPrivateKey private_key);
+int silc_pkcs_private_key_data_set(SilcPKCS pkcs, unsigned char *prv,
+                                  uint32 prv_len);
+int silc_pkcs_encrypt(SilcPKCS pkcs, unsigned char *src, uint32 src_len,
+                     unsigned char *dst, uint32 *dst_len);
+int silc_pkcs_decrypt(SilcPKCS pkcs, unsigned char *src, uint32 src_len,
+                     unsigned char *dst, uint32 *dst_len);
+int silc_pkcs_sign(SilcPKCS pkcs, unsigned char *src, uint32 src_len,
+                  unsigned char *dst, uint32 *dst_len);
+int silc_pkcs_verify(SilcPKCS pkcs, unsigned char *signature, 
+                    uint32 signature_len, unsigned char *data, 
+                    uint32 data_len);
+int silc_pkcs_sign_with_hash(SilcPKCS pkcs, SilcHash hash,
+                            unsigned char *src, uint32 src_len,
+                            unsigned char *dst, uint32 *dst_len);
+int silc_pkcs_verify_with_hash(SilcPKCS pkcs, SilcHash hash, 
+                              unsigned char *signature, 
+                              uint32 signature_len, 
+                              unsigned char *data, 
+                              uint32 data_len);
+char *silc_pkcs_encode_identifier(char *username, char *host, char *realname,
+                                 char *email, char *org, char *country);
+SilcPublicKeyIdentifier silc_pkcs_decode_identifier(char *identifier);
+void silc_pkcs_free_identifier(SilcPublicKeyIdentifier identifier);
+SilcPublicKey silc_pkcs_public_key_alloc(char *name, char *identifier,
+                                        unsigned char *pk, 
+                                        uint32 pk_len);
+void silc_pkcs_public_key_free(SilcPublicKey public_key);
+SilcPrivateKey silc_pkcs_private_key_alloc(char *name, unsigned char *prv,
+                                          uint32 prv_len);
+void silc_pkcs_private_key_free(SilcPrivateKey private_key);
+unsigned char *
+silc_pkcs_public_key_encode(SilcPublicKey public_key, uint32 *len);
+unsigned char *
+silc_pkcs_public_key_data_encode(unsigned char *pk, uint32 pk_len,
+                                char *pkcs, char *identifier, 
+                                uint32 *len);
+int silc_pkcs_public_key_decode(unsigned char *data, uint32 data_len,
+                               SilcPublicKey *public_key);
+unsigned char *
+silc_pkcs_private_key_encode(SilcPrivateKey private_key, uint32 *len);
+unsigned char *
+silc_pkcs_private_key_data_encode(unsigned char *prv, uint32 prv_len,
+                                 char *pkcs, uint32 *len);
+int silc_pkcs_private_key_decode(unsigned char *data, uint32 data_len,
+                                SilcPrivateKey *private_key);
+int silc_pkcs_save_public_key(char *filename, SilcPublicKey public_key,
+                             uint32 encoding);
+int silc_pkcs_save_public_key_data(char *filename, unsigned char *data,
+                                  uint32 data_len,
+                                  uint32 encoding);
+int silc_pkcs_save_private_key(char *filename, SilcPrivateKey private_key, 
+                              unsigned char *passphrase,
+                              uint32 encoding);
+int silc_pkcs_save_private_key_data(char *filename, unsigned char *data, 
+                                   uint32 data_len,
+                                   unsigned char *passphrase,
+                                   uint32 encoding);
+int silc_pkcs_load_public_key(char *filename, SilcPublicKey *public_key,
+                             uint32 encoding);
+int silc_pkcs_load_private_key(char *filename, SilcPrivateKey *private_key,
+                              uint32 encoding);
 
 #endif