/**************************************************************************
Copyright (c) [2005] Novell, Inc. All Rights Reserved.

This library is free software; you can redistribute it and/or modify it under 
the terms of the GNU Lesser General Public License as published by the Free Software Foundation; 
version 2.1 of the License.

This library 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License 
along with this library; if not,  if not, contact Novell, Inc.  
To contact Novell about this file by physical or electronic mail, 
you may find current contact information at www.novell.com. 
**************************************************************************/

/***************************************************************************
* This is the Managed IDK for collaborating suite of applications
***************************************************************************/

#ifndef _MICASA_MANAGED_H_
#define _MICASA_MANAGED_H_

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" 
{
#endif

/***************************************************************************
*** All strings are length preceeded and the lengths include the NULL.
***************************************************************************/



#if defined(WIN32)

	#define SSCS_GLOBAL_LIBCALL_PTR(RET)			RET * __stdcall
	#define SSCS_GLOBAL_LIBCALL(RET)				RET	__stdcall 
	#define SSCS_EXTERN_LIBCALL_PTR(RET)			extern RET * __stdcall
	#define SSCS_EXTERN_LIBCALL(RET)				extern RET __stdcall
	#define SSCS_TYPEDEF_LIBCALL_PTR(RET, PTR)		typedef RET	* (__stdcall *PTR)
	#define SSCS_TYPEDEF_LIBCALL(RET, PTR)			typedef RET	(__stdcall *PTR)

#else

	#define SSCS_GLOBAL_LIBCALL_PTR(RET)			RET *
	#define SSCS_GLOBAL_LIBCALL(RET)				RET
	#define SSCS_EXTERN_LIBCALL_PTR(RET)			extern RET *
	#define SSCS_EXTERN_LIBCALL(RET)				extern RET
	#define SSCS_TYPEDEF_LIBCALL_PTR(RET, PTR)		typedef RET * (*PTR)
	#define SSCS_TYPEDEF_LIBCALL(RET, PTR)			typedef RET	(*PTR)

#endif /* WIN32 */


#ifndef _MICASA_TYPES_H_
#define _MICASA_TYPES_H_

#if defined(WIN32)
#include <stdio.h>

	typedef unsigned __int64	uint64_t; 
	typedef signed __int64 		int64_t;
	typedef unsigned int 		uint32_t;
	typedef signed int 			int32_t;
	typedef unsigned short 		uint16_t;
	typedef signed short 		int16_t;
	typedef unsigned char 		uint8_t;
	typedef signed char 		int_t;

#else

#include <stdio.h>
#include <stdint.h>
#endif

#endif


#ifndef _SSUTF8_H_
/* defining the utf8 for SSCS */
typedef	unsigned char	SS_UTF8_T;
#endif

#define 	NSSCS_MAX_USERID_LEN			256	    //* max username (bytes)
#define	NSSCS_MAX_PWORD_LEN				128		//* max password (bytes)
#define	NSSCS_MAX_SECRET_ID_LEN			512		//* in bytes including NULL

// used to denote what structure is being used for the credentials
#define		SSCS_CRED_TYPE_BASIC_F		0x00000001L

// used to denote the type of username being requested or set
#define USERNAME_TYPE_CN_F				0x00000000L  // default behavior
#define USERNAME_TYPE_NDS_DN_F			0x00000001L
#define USERNAME_TYPE_NDS_FDN_F			0x00000002L
#define USERNAME_TYPE_LDAP_DN_F			0x00000004L
#define USERNAME_TYPE_EMAIL_F			0x00000008L
#define USERNAME_TYPE_OTHER_F			0x00000010L

typedef	struct _sscs_secret_id
{
	uint32_t			len;		//  max id len in bytes
	SS_UTF8_T			id[NSSCS_MAX_SECRET_ID_LEN]; // * should be passed in # of chars
} SSCS_SECRET_ID_T;


typedef struct _sscs_basic_credential
{
	uint32_t		unFlags;
	uint32_t		unLen;
	SS_UTF8_T		username[NSSCS_MAX_USERID_LEN];
	uint32_t		pwordLen;
	SS_UTF8_T   	password[NSSCS_MAX_PWORD_LEN];
} SSCS_BASIC_CREDENTIAL;
		

typedef	struct _sscs_ext_t
{
	int32_t			extID; 		// defined to identify the extension 
	int32_t			version;	// defined as the version of the specified extension
	void			*ext;		// points to the actual extension
} SSCS_EXT_T;

	/* ####################################################################### */
	/* ############################## ERROR CODES ############################ */
	/* ####################################################################### */

#define		NSSCS_SUCCESS					0x00000000		/*    0 */
#define		NSSCS_E_OBJECT_NOT_FOUND		0xFFFFFCE0		/* -800 */
#define		NSSCS_E_NICI_FAILURE			0xFFFFFCDF		/* -801 */
#define		NSSCS_E_INVALID_SECRET_ID 		0xFFFFFCDE		/* -802 */
#define		NSSCS_E_SYSTEM_FAILURE			0xFFFFFCDD		/* -803 */
#define		NSSCS_E_ACCESS_DENIED  			0xFFFFFCDC		/* -804 */
#define		NSSCS_E_NDS_INTERNAL_FAILURE	0xFFFFFCDB		/* -805 */
#define		NSSCS_E_SECRET_UNINITIALIZED	0xFFFFFCDA		/* -806 */
#define		NSSCS_E_BUFFER_LEN				0xFFFFFCD9		/* -807 */
#define		NSSCS_E_INCOMPATIBLE_VERSION	0xFFFFFCD8		/* -808 */
#define		NSSCS_E_CORRUPTED_STORE			0xFFFFFCD7		/* -809 */
#define		NSSCS_E_SECRET_ID_EXISTS		0xFFFFFCD6		/* -810 */
#define		NSSCS_E_NDS_PWORD_CHANGED		0xFFFFFCD5		/* -811 */
#define		NSSCS_E_INVALID_TARGET_OBJECT	0xFFFFFCD4		/* -812 */
#define		NSSCS_E_STORE_NOT_FOUND			0xFFFFFCD3		/* -813 */
#define		NSSCS_E_SERVICE_NOT_FOUND		0xFFFFFCD2		/* -814 */
#define		NSSCS_E_SECRET_ID_TOO_LONG		0xFFFFFCD1		/* -815 */
#define		NSSCS_E_ENUM_BUFF_TOO_SHORT		0xFFFFFCD0		/* -816 */
#define		NSSCS_E_NOT_AUTHENTICATED		0xFFFFFCCF		/* -817 */
#define		NSSCS_E_NOT_SUPPORTED			0xFFFFFCCE		/* -818 */
#define		NSSCS_E_NDS_PWORD_INVALID		0xFFFFFCCD		/* -819 */
#define		NSSCS_E_NICI_OUTOF_SYNC			0xFFFFFCCC		/* -820 */
#define		NSSCS_E_SERVICE_NOT_SUPPORTED	0xFFFFFCCB		/* -821 */
#define		NSSCS_E_TOKEN_NOT_SUPPORTED		0xFFFFFCCA		/* -822 */
#define		NSSCS_E_UNICODE_OP_FAILURE		0xFFFFFCC9		/* -823 */
#define		NSSCS_E_TRANSPORT_FAILURE		0xFFFFFCC8		/* -824 */
#define		NSSCS_E_CRYPTO_OP_FAILURE		0xFFFFFCC7		/* -825 */
#define		NSSCS_E_SERVER_CONN_FAILURE		0xFFFFFCC6		/* -826 */
#define		NSSCS_E_CONN_ACCESS_FAILURE		0xFFFFFCC5		/* -827 */
#define		NSSCS_E_ENUM_BUFF_TOO_LONG		0xFFFFFCC4		/* -828 */
#define		NSSCS_E_SECRET_BUFF_TOO_LONG	0xFFFFFCC3		/* -829 */
#define		NSSCS_E_SECRET_ID_TOO_SHORT		0xFFFFFCC2		/* -830 */
#define		NSSCS_E_CORRUPTED_PACKET_DATA	0xFFFFFCC1		/* -831 */
#define		NSSCS_E_EP_ACCESS_DENIED		0xFFFFFCC0		/* -832 */
#define		NSSCS_E_SCHEMA_NOT_EXTENDED		0xFFFFFCBF		/* -833 */
#define		NSSCS_E_ATTR_NOT_FOUND			0xFFFFFCBE		/* -834 */
#define		NSSCS_E_MIGRATION_NEEDED		0xFFFFFCBD		/* -835 */
#define		NSSCS_E_MP_PWORD_INVALID		0xFFFFFCBC		/* -836 */
#define		NSSCS_E_MP_PWORD_NOT_SET		0xFFFFFCBB		/* -837 */
#define		NSSCS_E_MP_PWORD_NOT_ALLOWED	0xFFFFFCBA		/* -838 */
#define		NSSCS_E_WRONG_REPLICA_TYPE		0xFFFFFCB9		/* -839 */
#define		NSSCS_E_ATTR_VAL_NOT_FOUND		0xFFFFFCB8		/* -840 */
#define		NSSCS_E_INVALID_PARAM			0xFFFFFCB7		/* -841 */
#define		NSSCS_E_NEED_SECURE_CHANNEL		0xFFFFFCB6		/* -842 */
#define		NSSCS_E_CONFIG_NOT_SUPPORTED	0xFFFFFCB5		/* -843 */
#define		NSSCS_E_STORE_NOT_LOCKED		0xFFFFFCB4		/* -844 */
#define		NSSCS_E_TIME_OUT_OF_SYNC		0xFFFFFCB3		/* -845 */
#define		NSSCS_E_VERSION_MISMATCH		0xFFFFFCB2		/* -846 */
#define		NSSCS_E_SECRET_BUFF_TOO_SHORT	0xFFFFFCB1		/* -847 */
#define	 	NSSCS_E_SH_SECRET_FAILURE		0xFFFFFCB0		/* -848 */
#define  		NSSCS_E_PARSER_FAILURE			0xFFFFFCAF		/* -849 */
#define  		NSSCS_E_UTF8_OP_FAILURE			0xFFFFFCAE		/* -850 */
#define  		NSSCS_E_CTX_LESS_CN_NOT_UNIQUE	0xFFFFFCAD		/* -851 */
#define  		NSSCS_E_UNSUPPORTED_BIND_CRED	0xFFFFFCAC		/* -852 */
#define  		NSSCS_E_CERTIFICATE_NOT_FOUND	0xFFFFFCAB		/* -853 */
#define  		NSSCS_E_CANT_OPEN_CLIENT_CACHE	0xFFFFFCAA		/* -854 */
#define  		NSSCS_E_WRONG_SH_SEC_TYPE		0xFFFFFCA9		/* -855 */

#define		NSSCS_E_NOT_IMPLEMENTED			0xFFFFFC88		/* -888 */
#define		NSSCS_E_BETA_EXPIRED			0xFFFFFC7D		/* -899 */


	/* #########################################################################
	########################### ERROR DESCRIPTIONS ########################## 
	#########################################################################

	NSSCS_E_OBJECT_NOT_FOUND			-800 
	Description: Can't find the target object DN in NDS. (Resolve name failed.)

	NSSCS_E_NICI_FAILURE				-801
	Description: NICI operations have failed.

	NSSCS_E_INVALID_SECRET_ID			-802 
	Description: Secret ID is not in the User Secret Store.

	NSSCS_E_SYSTEM_FAILURE				-803 
	Description: Some internal operating system services have not been available.

	NSSCS_E_ACCESS_DENIED				-804 
	Description: Access to the target Secret Store has been denied!

	NSSCS_E_NDS_INTERNAL_FAILURE		-805 
	Description: Some internal NDS services have not been available.

	NSSCS_E_SECRET_UNINITIALIZED		-806 
	Description: Secret has not been initialized with a write.

	NSSCS_E_BUFFER_LEN					-807 
	Description: Size of the buffer is not in a nominal range between minimum and maximum.

	NSSCS_E_INCOMPATIBLE_VERSION		-808 
	Description: Client and server components are not of the compatible versions.

	NSSCS_E_CORRUPTED_STORE				-809 
	Description: Secret Store data on the server has been corrupted.

	NSSCS_E_SECRET_ID_EXISTS			-810 
	Description: Secret ID already exists in the Secret Store.

	NSSCS_E_NDS_PWORD_CHANGED			-811 
	Description: User NDS password has been changed by the administrator.

	NSSCS_E_INVALID_TARGET_OBJECT		-812 
	Description: Target NDS User object not found.

	NSSCS_E_STORE_NOT_FOUND				-813 
	Description: Target NDS User object does not have a Secret Store.

	NSSCS_E_SERVICE_NOT_FOUND			-814 
	Description: Secret Store not on the Network.	

	NSSCS_E_SECRET_ID_TOO_LONG			-815 
	Description: Lenght of the Secret ID buffer exceeds the limit.

	NSSCS_E_ENUM_BUFF_TOO_SHORT			-816 
	Description: Lenght of the Enumeration buffer too short.

	NSSCS_E_NOT_AUTHENTICATED			-817 
	Description: User not authenticated.

	NSSCS_E_NOT_SUPPORTED				-818 
	Description: Not supported operations.

	NSSCS_E_NDS_PWORD_INVALID			-819 
	Description: Typed in NDS password not valid.

	NSSCS_E_NICI_OUTOF_SYNC				-820 
	Description: Session keys of the client and server NICI are out of sync.

	NSSCS_E_SERVICE_NOT_SUPPORTED		-821 
	Description: Requested service not supported yet.

	NSSCS_E_TOKEN_NOT_SUPPORTED			-822 
	Description: NDS authentication type not supported.

	NSSCS_E_UNICODE_OP_FAILURE		 	-823 
	Description: Unicode text conversion operation failed.

	NSSCS_E_TRANSPORT_FAILURE		 	-824 
	Description: Connection to server is lost.

	NSSCS_E_CRYPTO_OP_FAILURE			-825 
	Description: Cryptographic operation failed.

	NSSCS_E_SERVER_CONN_FAILURE		 	-826 
	Description: Opening a connection to the server failed.

	NSSCS_E_CONN_ACCESS_FAILURE			-827 
	Description: Access to server connection failed.

	NSSCS_E_ENUM_BUFF_TOO_LONG		 	-828 
	Description: Size of the enumeration buffer exceeds the limit.

	NSSCS_E_SECRET_BUFF_TOO_LONG		-829 
	Description: Size of the Secret buffer exceeds the limit.

	NSSCS_E_SECRET_ID_TOO_SHORT		 	-830
	Description: Lenght of the Secret ID should be greater than zero.

	NSSCS_E_CORRUPTED_PACKET_DATA		-831 
	Description: Protocol data corrupted on the wire.

	NSSCS_E_EP_ACCESS_DENIED			-832
	Description: EP password validation failed. Access to the secret denied!

	NSSCS_E_SCHEMA_NOT_EXTENDED			-833
	Description: Schema is not extended to support SecreStore on the target tree.

	NSSCS_E_ATTR_NOT_FOUND			 	-834 
	Description: One of the optional service attributes is not instantiated.

	NSSCS_E_MIGRATION_NEEDED			-835
	Description: Server has been upgraded and user SecretStore should be updated.

	NSSCS_E_MP_PWORD_INVALID			-836
	Description: Master passwrod could not be verified to read or unlock the secrets.

	NSSCS_E_MP_PWORD_NOT_SET			-837		
	Description: Master password has not been set on the SecretStore.

	NSSCS_E_MP_PWORD_NOT_ALLOWED		-838	
	Description: Ability to use master password has been disabled.

	NSSCS_E_WRONG_REPLICA_TYPE			-839 
	Description: Not a writeable replica of NDS.

	NSSCS_E_ATTR_VAL_NOT_FOUND			-840 
	Description: Target attrbute is not instantiated in NDS.

	NSSCS_E_INVALID_PARAM				-841 
	Description: API parameter is not initialized.

	NSSCS_E_NEED_SECURE_CHANNEL			-842 
	Description: Connection to the SecretStore needs to be over SSL.

	NSSCS_E_CONFIG_NOT_SUPPORTED		-843
	Description: No server to support the given override configuration is found.

	NSSCS_E_STORE_NOT_LOCKED			-844
	Description: Attempt to unlock SecretStore failed because the store is not locked.

	NSSCS_E_TIME_OUT_OF_SYNC			-845
	Description: NDS Replica on the server that holds SecretStore is out of sync with the replica ring.

	NSSCS_E_VERSION_MISMATCH		    -846
	Description: Versions of the client dlls don't match.

	NSSCS_E_SECRET_BUFF_TOO_SHORT		-847 
	Description: Buffer supplied for the secret is too short (minimum NSSCS_MIN_IDLIST_BUF_LEN).

	NSSCS_E_SH_SECRET_FAILURE			-848
	Description: Shared Secret processing and operations failed.

	NSSCS_E_PARSER_FAILURE				-849
	Description: Shared Secret parser operations failed.

	NSSCS_E_UTF8_OP_FAILURE				-850
	Description: Utf8 string operations failed.

	NSSCS_E_CTX_LESS_CN_NOT_UNIQUE		-851
	Description: Contextless name for LDAP bind does not resolve to a unique DN

	NSSCS_E_UNSUPPORTED_BIND_CRED		-852 
	Description: login credential for advanced bind is not supported

	NSSCS_E_CERTIFICATE_NOT_FOUND		-853
	Description: LDAP Root Cert required for Bind operations not found

	NSSCS_E_WRONG_SH_SEC_TYPE			 -855 
	Description: Unrecognized or unknown shared secret tag.


	NSSCS_E_NOT_IMPLEMENTED				-888
	Description: Feature not implemented yet.

	NSSCS_E_BETA_EXPIRED				-899
	Description: Product's BETA life has expired! Official release copy should be
	purchased.



	########################### END OFERROR CODES ########################## */

#endif // _SSCS_SDK_H_


	// * The following functions will be exposed as exported API:
	// **************************************************************
	// * These function calls will utilize the Support Functions for 
	// * populating or extracting data from a Shared Secret.
	// **************************************************************

	// General API Info:
	//    All strings passed through the API need to be NULL terminated.
	//	
	//
	// Parameters:	
	//	  ssFlags
	//		 Sets behaviors desired on the Secret.  Set to 0.
	//		 
	//    appSecretID (input) -
	//       Name of service requesting credentials.
	//
	//    sharedSecretID (input) -
	//       The group name is the name of the backend authentication realm, relating a group of services.
	//		 Example: Novell.Collaboration  (Groupwise, GW address book, GW Notify, and GWIM)
	//       This parameter can be set to NULL, 
	//
	//	  credentialType (input)
	//		 Type of credential structure used during this call. 
	//	     Currently we only support one:  
	//			SSCS_CRED_TYPE_BASIC_F
	//
	//	  credential 
	//		 Pointer to the credential structure
	//	  
	//    ext
	//       Reserved.
	//
	// Abstract:
	//
	//    Get cache user credentials routine.
	//	
	//

	SSCS_EXTERN_LIBCALL(int32_t)
		miCASAGetCredential
		(            
			uint32_t				ssFlags, 				// IN
			SSCS_SECRET_ID_T	*	appSecretID,			// IN
			SSCS_SECRET_ID_T	*	sharedSecretID,			// Optional IN
			int32_t				*	credentialType,			// IN/OUT
			void				*	credential,				// OUT
			SSCS_EXT_T			*	ext						// Reserved
		);

	SSCS_EXTERN_LIBCALL(int32_t)
		miCASASetCredential
		(
			uint32_t	 			ssFlags, 				// IN
			SSCS_SECRET_ID_T	*	appSecretID,			// IN
			SSCS_SECRET_ID_T	*	sharedSecretID,			// Optional IN
			int32_t					credentialType,			// IN
			void				*	credential,				// IN
			SSCS_EXT_T			*	ext						// Reserved
		);

	SSCS_EXTERN_LIBCALL(int32_t)
		miCASARemoveCredential
		(      		
			uint32_t	 			ssFlags, 				// IN
			SSCS_SECRET_ID_T	*	appSecretID,			// IN
			SSCS_SECRET_ID_T	*	sharedSecretID,			// Optional IN
			SSCS_EXT_T			*	ext						// Reserved
		);

	// end
    SSCS_EXTERN_LIBCALL(int32_t)
        miCASAIsSecretPersistent
        (
            uint32_t ssFlags,
            SSCS_SECRET_ID_T *secretID,
            SSCS_EXT_T *ext
        );

#if defined(__cplusplus) || defined(c_plusplus)
}
#endif