Visual C++ Examples

ChilkatHOMEAndroid™ASPVisual BasicVB.NETC#iOS (IPhone)Objective-CC++CMFCDelphiFoxProJavaPerl
PHP ExtensionPHP ActiveXPythonPowerShellRubySQL ServerVBScript

C++ Examples

CkString
Byte Array
Bounced Mail
Bz2
Character Encoding
CSV
DH Key Exchange
DKIM/DomainKeys
Digital Certificates
Digital Signatures
DSA
Email
Email Object
Encryption
FTP
HTML Conversion
HTTP
IMAP
MHT / HTML Email
POP3
RSA
S/MIME
SMTP
Socket
Spider
SSH Key
SSH
SSH Tunnel
SFTP
Tar
Upload
XML
XMP
Zip Compression


More Examples...
Amazon S3
NTLM
FileAccess
RSS
Atom
Self-Extractor
Service
PPMD
Deflate
Bzip2
LZW

 

 

 

 

 

 

 

 

NTLM Client and Server Code

Demonstrates the NTLM authentication algorithm for both client and server.

Downloads:

MS Windows Visual C/C++ Libraries
Linux/CentOS C/C++ Libraries
MAC OS X C/C++ Libraries
Solaris C/C++ Libraries
C++ Builder Libraries
#include <CkNtlm.h>

void ChilkatSample(void)
    {
    CkNtlm ntlmClient;

    bool success;
    success = ntlmClient.UnlockComponent("Anything for 30-day trial");
    if (success != true) {
        printf("%s\n",ntlmClient.lastErrorText());
        return;
    }

    //  UnlockComponent only needs to be called once on the 1st object instance.

    CkNtlm ntlmServer;

    //  The NTLM protocol begins by the client sending the server
    //  a Type1 message.
    const char * type1Msg;
    ntlmClient.put_Workstation("MyWorkstation");
    type1Msg = ntlmClient.genType1();

    printf("Type1 message from client to server:\n");
    printf("%s\n",type1Msg);

    //  If the server wishes to examine the information embedded within the
    //  Type1 message, it may call ParseType1.
    //  This step is not necessary, it is only for informational purposes..
    const char * type1Info;
    type1Info = ntlmServer.parseType1(type1Msg);

    printf("---\n");
    printf("%s\n",type1Info);

    //  The server now generates a Type2 message to be sent to the client.
    //  The Type2 message requires a TargetName.  A TargetName is
    //  the authentication realm in which the authenticating account
    //  has membership (a domain name for domain accounts, or server name
    //  for local machine accounts).
    ntlmServer.put_TargetName("myAuthRealm");

    const char * type2Msg;
    type2Msg = ntlmServer.genType2(type1Msg);
    if (type2Msg == 0 ) {
        printf("%s\n",ntlmServer.lastErrorText());
        return;
    }

    printf("Type2 message from server to client:\n");
    printf("%s\n",type2Msg);

    //  The client may examine the information embedded in the Type2 message
    //  by calling ParseType2, which returns XML.  This is only for informational purposes
    //  and is not required.
    const char * type2Info;
    type2Info = ntlmClient.parseType2(type2Msg);

    printf("---\n");
    printf("%s\n",type2Info);

    //  The client will now generate the final Type3 message to be sent to the server.
    //  This requires the Username and Password:
    ntlmClient.put_UserName("test123");
    ntlmClient.put_Password("myPassword");

    const char * type3Msg;
    type3Msg = ntlmClient.genType3(type2Msg);
    if (type3Msg == 0 ) {
        printf("%s\n",ntlmClient.lastErrorText());
        return;
    }

    printf("Type3 message from client to server:\n");
    printf("%s\n",type3Msg);

    //  The server may verify the response by first "loading" the Type3 message.
    //  This sets the various properties such as Username, Domain, Workstation,
    //  and ClientChallenge to the values embedded within theType3 message.
    //  The server may then use the Username to lookup the password.
    //  Looking up the password is dependent on your infrastructure.  Perhaps your
    //  usernames/passwords are stored in a secure database.  If that's the case, you would
    //  write code to issue a query to get the password string for the given username.
    //  Once the password is obtained, set the Password property and then
    //  generate the Type3 response again.  If the server's Type3 response matches
    //  the client's Type3 response, then the client's password is correct.

    success = ntlmServer.LoadType3(type3Msg);
    if (success != true) {
        printf("%s\n",ntlmServer.lastErrorText());
        return;
    }

    //  The Username property now contains the username that was embedded within
    //  the Type3 message.  It can be used to lookup the password.
    const char * clientUsername;
    clientUsername = ntlmServer.userName();

    //  For this example, we'll simply set the password to a literal string:
    ntlmServer.put_Password("myPassword");

    //  The server may generate the Type3 message again, using the client's correct
    //  password:
    const char * expectedType3Msg;
    expectedType3Msg = ntlmServer.genType3(type2Msg);

    printf("Expected Type3 Message:\n");
    printf("%s\n",expectedType3Msg);

    //  If the Type3 message received from the client is exactly the same as the
    //  expected Type3 message, then the client must've used the same password,
    //  and authentication is successful.


    }

© 2000-2010 Chilkat Software, Inc. All Rights Reserved.

Mail Component · .NET Mail Component · XML Parser