--- /dev/null
+/* Copyright (c) 1998,2011,2014 Apple Inc. All Rights Reserved.
+ *
+ * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT
+ * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE
+ * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE
+ * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE,
+ * INC. ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL
+ * EXPOSE YOU TO LIABILITY.
+ ***************************************************************************
+ *
+ * NSDESCryptor.m - DES encrypt/decrypt class
+ *
+ * Revision History
+ * ----------------
+ * 28 Mar 97 at Apple
+ * Rewrote using feeDES module.
+ * 22 Feb 96 at NeXT
+ * Created.
+ */
+
+#import <Foundation/Foundation.h>
+#import "NSDESCryptor.h"
+#import "feeDES.h"
+#import "falloc.h"
+#import "ckutilities.h"
+#import "feeFunctions.h"
+
+/*
+ * Note: Our _priv ivar is actuall a feeDES pointer.
+ */
+@implementation NSDESCryptor
+
++ cryptorWithState:(NSData *)s {
+ return [[[self alloc] initWithState:s] autorelease];
+}
+
+- (void)setCryptorState:(NSData *)state {
+ if(_priv == NULL) {
+ return;
+ }
+ feeDESSetState(_priv, [state bytes], [state length]);
+}
+
+- initWithState:(NSData *)state {
+ feeReturn frtn;
+
+ if(_priv == NULL) {
+ _priv = feeDESNewWithState([state bytes], [state length]);
+ }
+ else {
+ frtn = feeDESSetState(_priv, [state bytes], [state length]);
+ if(frtn) {
+ NSLog(@"NSDESCryptor: bad initial state\n");
+ return nil;
+ }
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ if(_priv) {
+ feeDESFree(_priv);
+ }
+ [super dealloc];
+}
+
+- (void)setBlockMode:(BOOL)yorn {
+ if(_priv == NULL) {
+ return;
+ }
+ if(yorn) {
+ feeDESSetBlockMode(_priv);
+ }
+ else {
+ feeDESSetChainMode(_priv);
+ }
+}
+
+- (NSData *)encryptData:(NSData *)input {
+ NSData *result;
+ feeReturn frtn;
+ unsigned char *cipherText;
+ unsigned cipherTextLen;
+
+ if(_priv == NULL) {
+ return nil;
+ }
+ frtn = feeDESEncrypt(_priv,
+ [input bytes],
+ [input length],
+ &cipherText,
+ &cipherTextLen);
+ if(frtn) {
+ NSLog(@"NSDESCryptor encrypt: %s", feeReturnString(frtn));
+ return nil;
+ }
+ result = [NSData dataWithBytes:cipherText length:cipherTextLen];
+ ffree(cipherText);
+ return result;
+}
+
+- (NSData *)decryptData:(NSData *)input {
+ NSData *result;
+ feeReturn frtn;
+ unsigned char *plainText;
+ unsigned plainTextLen;
+
+ if(_priv == NULL) {
+ return nil;
+ }
+ frtn = feeDESDecrypt(_priv,
+ [input bytes],
+ [input length],
+ &plainText,
+ &plainTextLen);
+ if(frtn) {
+ NSLog(@"NSDESCryptor decrypt: %s", feeReturnString(frtn));
+ return nil;
+ }
+ result = [NSData dataWithBytes:plainText length:plainTextLen];
+ ffree(plainText);
+ return result;
+}
+
+- (unsigned)keyBitsize {
+ return feeDESKeySize(_priv);
+}
+
+@end