/*
- silcattrs.h
+ silcattrs.h
Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2002 Pekka Riikonen
+ Copyright (C) 2002 - 2003 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
/****s* silccore/SilcAttributesAPI/SilcAttributePayload
*
* NAME
- *
+ *
* typedef struct SilcAttributePayloadStruct *SilcAttributePayload;
*
* DESCRIPTION
/****d* silccore/SilcAttributesAPI/SilcAttribute
*
* NAME
- *
- * typedef unsigned char SilcAttribute;
+ *
+ * typedef SilcUInt8 SilcAttribute;
*
* DESCRIPTION
*
*
* SOURCE
*/
-typedef unsigned char SilcAttribute;
+typedef SilcUInt8 SilcAttribute;
/* All defined attributes. See the specs for detailed information. The
comment is the structure or data type that must be used with the
silc_attribute_get_object function to fetch parsed attribute. */
-#define SILC_ATTRIBUTE_NONE 0
-#define SILC_ATTRIBUTE_USER_INFO 1
-#define SILC_ATTRIBUTE_SERVICE 2 /* SilcAttributeObjService */
-#define SILC_ATTRIBUTE_STATUS_MOOD 3 /* SilcAttributeMood */
-#define SILC_ATTRIBUTE_STATUS_FREETEXT 4 /* char * (UTF-8 string) */
-#define SILC_ATTRIBUTE_STATUS_MESSAGE 5 /* SilcAttributeObjMime */
-#define SILC_ATTRIBUTE_PREFERRED_LANGUAGE 6 /* char * (UTF-8 string) */
-#define SILC_ATTRIBUTE_PREFERRED_CONTACT 7 /* SilcAttributeContact */
-#define SILC_ATTRIBUTE_TIMEZONE 8 /* char * (UTF-8 string */
-#define SILC_ATTRIBUTE_GEOLOCATION 9 /* SilcAttributeObjGeo */
-#define SILC_ATTRIBUTE_DEVICE_INFO 10 /* SilcAttributeObjDevice */
-#define SILC_ATTRIBUTE_EXTENSION 11 /* SilcAttributeObjMime */
-#define SILC_ATTRIBUTE_USER_PUBLIC_KEY 12 /* SilcAttributeObjPk */
-#define SILC_ATTRIBUTE_SERVER_PUBLIC_KEY 13 /* SilcAttributeObjPk */
-#define SILC_ATTRIBUTE_USER_DIGITAL_SIGNATURE 14 /* SilcAttributeObjPk */
+#define SILC_ATTRIBUTE_NONE 0
+#define SILC_ATTRIBUTE_USER_INFO 1 /* SilcVCard */
+#define SILC_ATTRIBUTE_SERVICE 2 /* SilcAttributeObjService */
+#define SILC_ATTRIBUTE_STATUS_MOOD 3 /* SilcAttributeMood */
+#define SILC_ATTRIBUTE_STATUS_FREETEXT 4 /* char * (UTF-8 string) */
+#define SILC_ATTRIBUTE_STATUS_MESSAGE 5 /* SilcAttributeObjMime */
+#define SILC_ATTRIBUTE_PREFERRED_LANGUAGE 6 /* char * (UTF-8 string) */
+#define SILC_ATTRIBUTE_PREFERRED_CONTACT 7 /* SilcAttributeContact */
+#define SILC_ATTRIBUTE_TIMEZONE 8 /* char * (UTF-8 string) */
+#define SILC_ATTRIBUTE_GEOLOCATION 9 /* SilcAttributeObjGeo */
+#define SILC_ATTRIBUTE_DEVICE_INFO 10 /* SilcAttributeObjDevice */
+#define SILC_ATTRIBUTE_EXTENSION 11 /* SilcAttributeObjMime */
+#define SILC_ATTRIBUTE_USER_PUBLIC_KEY 12 /* SilcAttributeObjPk */
+#define SILC_ATTRIBUTE_SERVER_PUBLIC_KEY 13 /* SilcAttributeObjPk */
+#define SILC_ATTRIBUTE_USER_DIGITAL_SIGNATURE 14 /* SilcAttributeObjPk */
#define SILC_ATTRIBUTE_SERVER_DIGITAL_SIGNATURE 15 /* SilcAttributeObjPk */
/***/
+/* Maximum length of attribute request packet */
+#define SILC_ATTRIBUTE_MAX_REQUEST_LEN (4 * 255)
+
/****d* silccore/SilcAttributesAPI/SilcAttributeFlags
*
* NAME
- *
- * typedef unsigned char SilcAttributeFlags;
+ *
+ * typedef SilcUInt8 SilcAttributeFlags;
*
* DESCRIPTION
*
*
* SOURCE
*/
-typedef unsigned char SilcAttributeFlags;
+typedef SilcUInt8 SilcAttributeFlags;
/* All defined flags */
#define SILC_ATTRIBUTE_FLAG_NONE 0x00 /* No flags */
/****d* silccore/SilcAttributesAPI/SilcAttributeMood
*
* NAME
- *
+ *
* typedef enum { ... } SilcAttributeMood;
*
* DESCRIPTION
/****d* silccore/SilcAttributesAPI/SilcAttributeContact
*
* NAME
- *
+ *
* typedef enum { ... } SilcAttributeContact;
*
* DESCRIPTION
SILC_ATTRIBUTE_CONTACT_SMS = 0x00000008, /* SMS preferred */
SILC_ATTRIBUTE_CONTACT_MMS = 0x00000010, /* MMS preferred */
SILC_ATTRIBUTE_CONTACT_CHAT = 0x00000020, /* chatting preferred */
+ SILC_ATTRIBUTE_CONTACT_VIDEO = 0x00000040, /* video conferencing */
} SilcAttributeContact;
/***/
/****d* silccore/SilcAttributesAPI/SilcAttributeDevice
*
* NAME
- *
+ *
* typedef enum { ... } SilcAttributeDevice;
*
* DESCRIPTION
} SilcAttributeDevice;
/***/
-/****f* silccore/SilcAttributesAPI/silc_attribute_payload_parse
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_alloc
*
* SYNOPSIS
*
- * SilcAttributePayload
- * silc_attribute_payload_parse(const unsigned char *payload,
- * SilcUInt32 payload_len);
+ * SilcAttributesPayload
+ * silc_attribute_payload_alloc(SilcAttribute attribute,
+ * SilcAttributeFlags flags,
+ * void *object,
+ * SilcUInt32 object_size);
*
* DESCRIPTION
*
- * Parses one attribute payload sent as argument and saves it to
- * SilcAttributePayload context. The new allocated context is returned.
+ * Allocates and encodes the attribute indicated by `attribute' and
+ * returns pointer to the attribute.
+ *
+ * The `object' must always be the same data type as defined with
+ * SilcAttribute (see the comments) for all attributes.
*
***/
-SilcAttributePayload
-silc_attribute_payload_parse(const unsigned char *payload,
- SilcUInt32 payload_len);
+SilcAttributePayload silc_attribute_payload_alloc(SilcAttribute attribute,
+ SilcAttributeFlags flags,
+ void *object,
+ SilcUInt32 object_size);
-/****f* silccore/SilcAttributesAPI/silc_attribute_payload_encode
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_parse
*
* SYNOPSIS
*
- * SilcBuffer silc_attribute_payload_encode(SilcAttribute attribute,
- * SilcAttributeFlags flags,
- * const unsigned char *data,
- * SilcUInt32 data_len);
+ * SilcDList
+ * silc_attribute_payload_parse(const unsigned char *payload,
+ * SilcUInt32 payload_len);
*
* DESCRIPTION
*
- * Encodes one attribute payload and returns allocated buffer. The
- * `attributes' is the attribute type with `flags' and the actual
- * attribute data indicated by `data' and `data_len'.
+ * Parses list of Attribute payloads returning list of payloads.
+ * One entry in the returned list is SilcAttributesPayload. You
+ * can produce such a list with silc_attribute_payload_encode
+ * function.
*
***/
-SilcBuffer silc_attribute_payload_encode(SilcAttribute attribute,
- SilcAttributeFlags flags,
- const unsigned char *data,
- SilcUInt32 data_len);
+SilcDList silc_attribute_payload_parse(const unsigned char *payload,
+ SilcUInt32 payload_len);
-/****f* silccore/SilcAttributesAPI/silc_attribute_payload_parse_list
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_encode
*
* SYNOPSIS
*
- * SilcDList
- * silc_attribute_payload_parse_list(const unsigned char *payload,
- * SilcUInt32 payload_len);
+ * SilcBuffer silc_attribute_payload_encode(SilcBuffer attrs,
+ * SilcAttribute attribute,
+ * SilcAttributeFlags flags,
+ * void *object,
+ * SilcUInt32 object_size);
*
* DESCRIPTION
*
- * Parses list of Attribute payloads returning list of payloads. This
- * is equivalent to the silc_attribute_payload_parse except that the
- * `buffer' now includes multiple Attribute Payloads one after the other.
- * You can produce such a list with silc_attribute_payload_encode_list
- * function.
+ * Encodes one attribute payload into the `attrs' buffer and returns
+ * pointer to the buffer, which may be different in case the buffer
+ * was reallocated. If `attrs' is NULL for first attribute this
+ * allocates the buffer and returns it. This can be called multiple
+ * times to add multiple attributes to the `attrs' buffer. The `flags'
+ * indicates the validity of the added attribute. Returns NULL on
+ * error.
+ *
+ * The `object' must always be the same data type as defined with
+ * SilcAttribute (see the comments) for all attributes.
*
***/
-SilcDList silc_attribute_payload_parse_list(const unsigned char *payload,
- SilcUInt32 payload_len);
+SilcBuffer silc_attribute_payload_encode(SilcBuffer attrs,
+ SilcAttribute attribute,
+ SilcAttributeFlags flags,
+ void *object,
+ SilcUInt32 object_size);
-/****f* silccore/SilcAttributesAPI/silc_attribute_payload_encode_list
+/****f* silccore/SilcAttributesAPI/silc_attribute_payload_encode_data
*
* SYNOPSIS
*
- * SilcBuffer silc_attribute_payload_encode(SilcUInt32 num_attrs, ...);
+ * SilcBuffer
+ * silc_attribute_payload_encode_data(SilcBuffer attrs,
+ * SilcAttribute attribute,
+ * SilcAttributeFlags flags,
+ * const unsigned char *data,
+ * SilcUInt32 data_len);
*
* DESCRIPTION
*
- * Encodes a list of Attribute payloads. The `num_attrs' indicates the
- * number of attributes sent as argument. The variable argument list
- * sent as argument includes the attribute, attribute flags, attribute
- * data and attribute data length. One attribute is one of these
- * { attribute, attribute flags, data and data length } arguments.
- * Returns the attribute payloads in data buffer one after the other.
- * You can parse such list with silc_attribute_payload_parse_list
- * function.
+ * Same function as silc_attribute_payload_encode except the attribute
+ * is already encoded into `data' of `data_len' bytes in length.
+ * Encodes the attribute into the `attrs' buffer and returns pointer
+ * to the buffer, which may be different in case the buffer was
+ * reallocated. If `attrs' is NULL for first attribute this allocates
+ * the buffer and returns it. Returns NULL on error.
*
***/
-SilcBuffer silc_attribute_payload_encode_list(SilcUInt32 num_attrs, ...);
+SilcBuffer silc_attribute_payload_encode_data(SilcBuffer attrs,
+ SilcAttribute attribute,
+ SilcAttributeFlags flags,
+ const unsigned char *data,
+ SilcUInt32 data_len);
/****f* silccore/SilcAttributesAPI/silc_attribute_payload_free
*
const unsigned char *silc_attribute_get_data(SilcAttributePayload payload,
SilcUInt32 *data_len);
+/****f* silccore/SilcAttributesAPI/silc_attribute_get_verify_data
+ *
+ * SYNOPSIS
+ *
+ * unsigned char *
+ * silc_attribute_get_verify_data(SilcDList attrs,
+ * bool server_verification,
+ * SilcUInt32 *data_len);
+ *
+ * DESCRIPTION
+ *
+ * Constructs the data to be verified with the sender's digital
+ * signature and sender's public key. This allocates the data from
+ * the list of attribute payloads and returns the buffer. The caller
+ * must free it. If `server_verification' is FALSE then data is
+ * constructed for user's digital signature verification, if it is
+ * TRUE then it is constructed for server's digital signature
+ * verification.
+ *
+ ***/
+unsigned char *silc_attribute_get_verify_data(SilcDList attrs,
+ bool server_verification,
+ SilcUInt32 *data_len);
+
/* Object structures */
-/****s* silccore/SilcAttributesAPI/SilcAttributesObjService
+/****s* silccore/SilcAttributesAPI/SilcAttributeObjService
*
* NAME
- *
- * typedef struct { ... } SilcAttributesObjService;
+ *
+ * typedef struct { ... } SilcAttributeObjService;
*
* DESCRIPTION
*
*
* SOURCE
*/
-typedef struct {
+typedef struct SilcAttributeObjServiceStruct {
SilcUInt32 port; /* IANA specified service port */
+ SilcUInt32 idle; /* Idle time in the service */
+ char signon[64]; /* Signon date and time (UTC) */
char address[256]; /* service address */
bool status; /* online status (TRUE present in service) */
} SilcAttributeObjService;
/***/
-/****s* silccore/SilcAttributesAPI/SilcAttributesObjMime
+/****s* silccore/SilcAttributesAPI/SilcAttributeObjMime
*
* NAME
- *
- * typedef struct { ... } SilcAttributesObjMime;
+ *
+ * typedef struct { ... } SilcAttributeObjMime;
*
* DESCRIPTION
*
*
* SOURCE
*/
-typedef struct {
+typedef struct SilcAttributeObjMimeStruct {
const unsigned char *mime; /* MIME buffer */
SilcUInt32 mime_len; /* length of the MIME buffer */
} SilcAttributeObjMime;
/***/
-/****s* silccore/SilcAttributesAPI/SilcAttributesObjGeo
+/****s* silccore/SilcAttributesAPI/SilcAttributeObjGeo
*
* NAME
- *
- * typedef struct { ... } SilcAttributesObjGeo;
+ *
+ * typedef struct { ... } SilcAttributeObjGeo;
*
* DESCRIPTION
*
*
* SOURCE
*/
-typedef struct {
+typedef struct SilcAttributeObjGeoStruct {
char *longitude; /* Longitude */
char *latitude; /* Latitude */
char *altitude; /* Altitude */
} SilcAttributeObjGeo;
/***/
-/****s* silccore/SilcAttributesAPI/SilcAttributesObjDevice
+/****s* silccore/SilcAttributesAPI/SilcAttributeObjDevice
*
* NAME
- *
- * typedef struct { ... } SilcAttributesObjDevice;
+ *
+ * typedef struct { ... } SilcAttributeObjDevice;
*
* DESCRIPTION
*
*
* SOURCE
*/
-typedef struct {
+typedef struct SilcAttributeObjDeviceStruct {
SilcAttributeDevice type; /* device type */
char *manufacturer; /* manufacturer of the device */
char *version; /* device version string */
} SilcAttributeObjDevice;
/***/
-/****s* silccore/SilcAttributesAPI/SilcAttributesObjPk
+/****s* silccore/SilcAttributesAPI/SilcAttributeObjPk
*
* NAME
- *
- * typedef struct { ... } SilcAttributesObjPk;
+ *
+ * typedef struct { ... } SilcAttributeObjPk;
*
* DESCRIPTION
*
* Data type for public key, certificate or digital signatures. The
- * caller must free the data inside the structure.
+ * caller must free the data inside the structure. The 'type' is one
+ * of following: "silc-rsa", "silc-dss, "ssh-rsa", "ssh-dss",
+ * "pgp-sign-rsa", "pgp-sign-dss", "x509v3-sign-rsa", "x509v3-sign-dss".
+ * See the draft-riikonen-precense-attrs draft for more detailed
+ * information. The 'type' is NULL when this structure includes a
+ * digital signature.
+ *
+ * In SILC, at least the "silc-rsa" must be supported. In this case
+ * the key is normal SILC Public key. To verify a signature with the
+ * SILC Public key, construct the signature data with the
+ * silc_attribute_get_verify_data and verify the signature with
+ * for example silc_pkcs_verify_with_hash function. The public key
+ * to the verification is the `data' and `data_len', and can be decoded
+ * with silc_pkcs_public_key_decode function.
*
* SOURCE
*/
-typedef struct {
+typedef struct SilcAttributeObjPkStruct {
char *type; /* public key/certificate type, NULL
when contains digital signature. */
unsigned char *data; /* public key/cert/signature data. The
* SYNOPSIS
*
* bool silc_attribute_get_object(SilcAttributePayload payload,
- * SilcAttribute attribute,
- * const void **object,
+ * void *object,
* SilcUInt32 object_size);
*
* DESCRIPTION
*
- * Returns the already parsed attribute object by the attribute type
- * indicated by `attribute'. Copies the data into the `object' which
+ * Returns the already parsed attribute object from the payload
+ * indicated by `payload'. Copies the data into the `object' which
* must be sent as argument (and must be of correct type and size).
* The `object_size' indicates the size of the `*object' sent.
* Returns TRUE if the `attribute' attribute was found and FALSE
* if such attribute is not present in the `payload', or the `object_size'
* is not sufficient. See the definition of SilcAttribute for the
* list of attributes and the required object types for attributes.
+ * You can use silc_attribute_get_attribute to get the SilcAttribute
+ * type from the `payload'.
+ *
+ * EXAMPLE
+ *
+ * SilcAttributeObjDevice dev;
+ *
+ * ...
+ * case SILC_ATTRIBUTE_DEVICE_INFO:
+ * memset(&dev, 0, sizeof(dev));
+ * if (!silc_attribute_get_object(payload, (void *)&dev, sizeof(dev)))
+ * error();
+ * ...
*
***/
bool silc_attribute_get_object(SilcAttributePayload payload,
- SilcAttribute attribute,
- void **object, SilcUInt32 object_size);
+ void *object, SilcUInt32 object_size);
#endif /* SILCATTRS_H */