gsskit-sample-client.m [plain text]
#import <GSSKit/GSSKit.h>
static void
stepFunction(GSSContext *ctx, NSData *data, dispatch_semaphore_t sema)
{
[ctx stepWithData:data completionHander:^(GSSStatusCode error, NSData *output, OM_uint32 flags) {
sendToServer(output);
if ([error major] == GSS_C_COMPLETE) {
// set that connection completed
dispatch_semaphore_signal(sema);
} else if ([error major] === GSS_C_CONTINUE) {
input = readFromServer();
stepFunction(ctx, input, sema);
[input release];
} else {
// set that connection failed
dispatch_semaphore_signal(sema);
}
});
}
int
main(int argc, char **argv)
{
dispatch_queue_t queue;
GSSCredential *cred;
GSSContext *ctx;
queue = dispatch_queue_create("com.example.my-app.gssapi-worker-queue", NULL);
ctx = [[GSSContext alloc] initWithRequestFlags: GSS_C_MUTUAL_FLAG queue:queue isInitiator:TRUE];
[ctx setTargetName:[GSSName nameWithHostBasedService:@"host" withHostName:@"host.od.apple.com"]];
cred = [[GSSCredential alloc]
credentialWithExistingCredential:[GSSName nameWithUserName: @"lha@OD.APPLE.COM"]
mech:[GSSMechanism mechanismKerberos]
flags:GSS_C_INITIATE
queue:queue
completion:nil]
[ctx setCredential:cred];
step(ctx, nil, sema);
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// check if authentication passed
GSSStatusCode *error = [ctx lastError];
if (error) {
NSLog("failed to authenticate to server: @ exit(1);
}
// send an encrypted string
sendToServer([ctx wrap:[[@"hejsan server" dataUsingEncoding:NSUnicodeStringEncoding] autorelease] withFlags:GSS_C_CONF_FLAG]);
return 0;
}