1/* Copyright (c) 1998,2011,2014 Apple Inc.  All Rights Reserved.
2 *
3 * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT
4 * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE
5 * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE
6 * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE,
7 * INC.  ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL
8 * EXPOSE YOU TO LIABILITY.
9 ***************************************************************************
10 *
11 * NSDESCryptor.m - DES encrypt/decrypt class
12 *
13 * Revision History
14 * ----------------
15 * 28 Mar 97 at Apple
16 *	Rewrote using feeDES module.
17 * 22 Feb 96 at NeXT
18 *	Created.
19 */
20
21#import <Foundation/Foundation.h>
22#import "NSDESCryptor.h"
23#import "feeDES.h"
24#import "falloc.h"
25#import "ckutilities.h"
26#import "feeFunctions.h"
27
28/*
29 * Note: Our _priv ivar is actuall a feeDES pointer.
30 */
31@implementation NSDESCryptor
32
33+ cryptorWithState:(NSData *)s {
34    return [[[self alloc] initWithState:s] autorelease];
35}
36
37- (void)setCryptorState:(NSData *)state {
38    if(_priv == NULL) {
39    	return;
40    }
41    feeDESSetState(_priv, [state bytes], [state length]);
42}
43
44- initWithState:(NSData *)state {
45    feeReturn 	frtn;
46
47    if(_priv == NULL) {
48    	_priv = feeDESNewWithState([state bytes], [state length]);
49    }
50    else {
51	frtn = feeDESSetState(_priv, [state bytes], [state length]);
52	if(frtn) {
53	    NSLog(@"NSDESCryptor: bad initial state\n");
54	    return nil;
55	}
56    }
57    return self;
58}
59
60- (void)dealloc
61{
62	if(_priv) {
63		feeDESFree(_priv);
64	}
65	[super dealloc];
66}
67
68- (void)setBlockMode:(BOOL)yorn {
69    if(_priv == NULL) {
70    	return;
71    }
72    if(yorn) {
73    	feeDESSetBlockMode(_priv);
74    }
75    else {
76    	feeDESSetChainMode(_priv);
77    }
78}
79
80- (NSData *)encryptData:(NSData *)input {
81    NSData		*result;
82    feeReturn		frtn;
83    unsigned char	*cipherText;
84    unsigned		cipherTextLen;
85
86    if(_priv == NULL) {
87    	return nil;
88    }
89    frtn = feeDESEncrypt(_priv,
90    	[input bytes],
91	[input length],
92	&cipherText,
93	&cipherTextLen);
94    if(frtn) {
95	NSLog(@"NSDESCryptor encrypt: %s", feeReturnString(frtn));
96	return nil;
97    }
98    result = [NSData dataWithBytes:cipherText length:cipherTextLen];
99    ffree(cipherText);
100    return result;
101}
102
103- (NSData *)decryptData:(NSData *)input {
104    NSData		*result;
105    feeReturn		frtn;
106    unsigned char	*plainText;
107    unsigned		plainTextLen;
108
109    if(_priv == NULL) {
110    	return nil;
111    }
112    frtn = feeDESDecrypt(_priv,
113    	[input bytes],
114	[input length],
115	&plainText,
116	&plainTextLen);
117    if(frtn) {
118	NSLog(@"NSDESCryptor decrypt: %s", feeReturnString(frtn));
119	return nil;
120    }
121    result = [NSData dataWithBytes:plainText length:plainTextLen];
122    ffree(plainText);
123    return result;
124}
125
126- (unsigned)keyBitsize {
127	return feeDESKeySize(_priv);
128}
129
130@end
131