721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott/*
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * The contents of this file are subject to the terms of the Common Development and
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * Distribution License (the License). You may not use this file except in compliance with the
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * License.
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott *
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * specific language governing permission and limitations under the License.
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott *
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * When distributing Covered Software, include this CDDL Header Notice in each file and include
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * Header, with the fields enclosed by brackets [] replaced by your own identifying
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * information: "Portions copyright [year] [name of copyright owner]".
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott *
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott * Copyright 2016 ForgeRock AS.
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott */
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#import "FRASerialization.h"
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const OATH_MECHANISM_SECRET = @"secret";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const OATH_MECHANISM_ALGORITHM = @"algorithm";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const OATH_MECHANISM_DIGITS = @"digits";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const OATH_MECHANISM_PERIOD = @"period";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const OATH_MECHANISM_COUNTER = @"counter";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const PUSH_MECHANISM_VERSION = @"version";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const PUSH_MECHANISM_SECRET = @"secret";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const PUSH_MECHANISM_AUTH_END_POINT = @"authEndPoint";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const NOTIFICATION_MESSAGE_ID = @"message_id";
a1e92b2783be4bfeb0c7e267223cc7779a6f324cKen StubbingsNSString * const NOTIFICATION_PUSH_CHALLENGE = @"push_challenge";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert WapshottNSString * const NOTIFICATION_TIME_TO_LIVE = @"time_to_live";
5d37db6a3aca50ba14cba8909d3ae44f7d43e407Ken StubbingsNSString * const NOTIFICATION_LOAD_BALANCER_COOKIE = @"load_balancer_cookie";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott@implementation FRASerialization
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma mark -
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma mark Serialise/Deserialise Functions
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (BOOL)serializeMap:(NSDictionary *)dictionary intoString:(NSString *__autoreleasing *)jsonString error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (dictionary == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return YES;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSData *jsonBytes = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:error];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (jsonBytes == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return NO;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott *jsonString = [FRASerialization serializeBytes:jsonBytes];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return YES;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (BOOL)deserializeJSON:(NSString *)dictionaryJson intoDictionary:(NSDictionary *__autoreleasing *)dictionary error:(NSError *__autoreleasing *)error {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (dictionaryJson == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return YES;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSData *jsonBytes = [FRASerialization deserializeBytes:dictionaryJson];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSDictionary* map = [NSJSONSerialization JSONObjectWithData: jsonBytes options: NSJSONReadingMutableContainers error: error];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (map == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return NO;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott *dictionary = map;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return YES;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (NSString *)serializeBytes:(NSData *)data {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (data == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return nil;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings+ (NSString *)serializeSecret:(NSData *)data {
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings if (data == nil) {
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings return nil;
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings }
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings const unsigned char *dataBuffer = (const unsigned char *)[data bytes];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings if (!dataBuffer) {
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings return [NSString string];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings }
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings NSUInteger dataLength = [data length];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings for (int i = 0; i < dataLength; ++i) {
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings [hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings }
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings return [NSString stringWithString:hexString];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings}
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings+ (NSData *)deserializeSecret:(NSString *)hexOfSecret {
3c9c34cf95b997e103f8f2d0a70dea8b2f8ec5b6Craig McDonnell if (hexOfSecret == (id)[NSNull null]) {
3c9c34cf95b997e103f8f2d0a70dea8b2f8ec5b6Craig McDonnell return nil;
3c9c34cf95b997e103f8f2d0a70dea8b2f8ec5b6Craig McDonnell }
3c9c34cf95b997e103f8f2d0a70dea8b2f8ec5b6Craig McDonnell
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings char characterBuffer[3];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings characterBuffer[2] = '\0';
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings unsigned char *bytes = malloc([hexOfSecret length]/2);
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings unsigned char *byteTraversal = bytes;
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings for (int i = 0; i < [hexOfSecret length]; i += 2) {
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings characterBuffer[0] = [hexOfSecret characterAtIndex:i];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings characterBuffer[1] = [hexOfSecret characterAtIndex:i+1];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings char *byte2 = NULL;
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings *byteTraversal++ = strtol(characterBuffer, &byte2, 16);
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings }
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings return [NSData dataWithBytesNoCopy:bytes length:[hexOfSecret length]/2 freeWhenDone:YES];
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings}
0fc1bec9becddcbec0d26541dd7ef40b43c0a67bKen Stubbings
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (NSData *)deserializeBytes:(NSString *)data {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (data == nil || [data isKindOfClass:[NSNull class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return nil;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [data dataUsingEncoding:NSUTF8StringEncoding];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma mark -
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott#pragma mark Data Sanity Functions
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (id)nonNilString:(NSString *)string {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (string == nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [NSNull null];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return string;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (NSString *)nullToEmpty:(NSString *)string {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (string == nil || [string isKindOfClass:[NSNull class]]) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return @"";
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return string;
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott+ (id)nonNilDate:(NSDate *)date {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott if (date != nil) {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSTimeInterval interval = [date timeIntervalSince1970];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott NSNumber *seconds = [NSNumber numberWithDouble:interval];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [seconds stringValue];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott } else {
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott return [NSNull null];
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott }
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott}
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott@end
721bb987c406979bcfe705fa1ca8d54497d40fcbRobert Wapshott