Quellcode durchsuchen

Merge branch 'master' of ssh://10.10.100.21/source/UUEnt

huangyp vor 6 Jahren
Ursprung
Commit
5623ec83e0

+ 60 - 0
UU_Ent/UU_Ent.xcodeproj/project.pbxproj

@@ -23,6 +23,11 @@
 		2710E66E2281746E0002A4B0 /* UIPopoverListView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2710E66D2281746E0002A4B0 /* UIPopoverListView.m */; };
 		3FE47A8D89A70D18F98B1E41 /* libPods-UU_EntUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F4F857DEEC69AEDCFACDFD51 /* libPods-UU_EntUITests.a */; };
 		991C1464228275B70080B54A /* YRLoginManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 991C1463228275B70080B54A /* YRLoginManager.m */; };
+		991C146C2282D8600080B54A /* GTMBase64.m in Sources */ = {isa = PBXBuildFile; fileRef = 991C146A2282D85F0080B54A /* GTMBase64.m */; };
+		991C146F2282D8900080B54A /* NSString+secri.m in Sources */ = {isa = PBXBuildFile; fileRef = 991C146E2282D88F0080B54A /* NSString+secri.m */; };
+		991C14742282D89C0080B54A /* RSA.m in Sources */ = {isa = PBXBuildFile; fileRef = 991C14702282D89C0080B54A /* RSA.m */; };
+		991C14752282D89C0080B54A /* priva.txt in Resources */ = {isa = PBXBuildFile; fileRef = 991C14722282D89C0080B54A /* priva.txt */; };
+		991C14762282D89C0080B54A /* publi.txt in Resources */ = {isa = PBXBuildFile; fileRef = 991C14732282D89C0080B54A /* publi.txt */; };
 		9948171422783494007C7CEA /* msg_route.json in Resources */ = {isa = PBXBuildFile; fileRef = 9948171322783494007C7CEA /* msg_route.json */; };
 		9948171722785013007C7CEA /* YRWorkTabCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9948171622785013007C7CEA /* YRWorkTabCell.m */; };
 		9948171A22785044007C7CEA /* YRWorkCollCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9948171922785044007C7CEA /* YRWorkCollCell.m */; };
@@ -177,6 +182,15 @@
 		71B4DF45C8EC3368ACFC4193 /* Pods-UU_Ent.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-UU_Ent.debug.xcconfig"; path = "Pods/Target Support Files/Pods-UU_Ent/Pods-UU_Ent.debug.xcconfig"; sourceTree = "<group>"; };
 		991C1462228275B70080B54A /* YRLoginManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = YRLoginManager.h; sourceTree = "<group>"; };
 		991C1463228275B70080B54A /* YRLoginManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YRLoginManager.m; sourceTree = "<group>"; };
+		991C14692282D85F0080B54A /* GTMBase64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMBase64.h; sourceTree = "<group>"; };
+		991C146A2282D85F0080B54A /* GTMBase64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GTMBase64.m; sourceTree = "<group>"; };
+		991C146B2282D85F0080B54A /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GTMDefines.h; sourceTree = "<group>"; };
+		991C146D2282D88F0080B54A /* NSString+secri.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+secri.h"; sourceTree = "<group>"; };
+		991C146E2282D88F0080B54A /* NSString+secri.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+secri.m"; sourceTree = "<group>"; };
+		991C14702282D89C0080B54A /* RSA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSA.m; sourceTree = "<group>"; };
+		991C14712282D89C0080B54A /* RSA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSA.h; sourceTree = "<group>"; };
+		991C14722282D89C0080B54A /* priva.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = priva.txt; sourceTree = "<group>"; };
+		991C14732282D89C0080B54A /* publi.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = publi.txt; sourceTree = "<group>"; };
 		994817112278281F007C7CEA /* macro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = macro.h; sourceTree = "<group>"; };
 		994817122278290A007C7CEA /* import.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = import.h; sourceTree = "<group>"; };
 		9948171322783494007C7CEA /* msg_route.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = msg_route.json; sourceTree = "<group>"; };
@@ -489,6 +503,46 @@
 			path = Others;
 			sourceTree = "<group>";
 		};
+		991C14652282D8100080B54A /* encode */ = {
+			isa = PBXGroup;
+			children = (
+				991C14662282D8100080B54A /* GTMBase64 */,
+				991C14672282D8100080B54A /* RSA */,
+				991C14682282D8100080B54A /* NSString+secri */,
+			);
+			path = encode;
+			sourceTree = "<group>";
+		};
+		991C14662282D8100080B54A /* GTMBase64 */ = {
+			isa = PBXGroup;
+			children = (
+				991C14692282D85F0080B54A /* GTMBase64.h */,
+				991C146A2282D85F0080B54A /* GTMBase64.m */,
+				991C146B2282D85F0080B54A /* GTMDefines.h */,
+			);
+			path = GTMBase64;
+			sourceTree = "<group>";
+		};
+		991C14672282D8100080B54A /* RSA */ = {
+			isa = PBXGroup;
+			children = (
+				991C14722282D89C0080B54A /* priva.txt */,
+				991C14732282D89C0080B54A /* publi.txt */,
+				991C14712282D89C0080B54A /* RSA.h */,
+				991C14702282D89C0080B54A /* RSA.m */,
+			);
+			path = RSA;
+			sourceTree = "<group>";
+		};
+		991C14682282D8100080B54A /* NSString+secri */ = {
+			isa = PBXGroup;
+			children = (
+				991C146D2282D88F0080B54A /* NSString+secri.h */,
+				991C146E2282D88F0080B54A /* NSString+secri.m */,
+			);
+			path = "NSString+secri";
+			sourceTree = "<group>";
+		};
 		999F650C227E656B00329012 /* UIView */ = {
 			isa = PBXGroup;
 			children = (
@@ -697,6 +751,7 @@
 		99C6FE8D22768EC000C7070A /* Utils */ = {
 			isa = PBXGroup;
 			children = (
+				991C14652282D8100080B54A /* encode */,
 				2710E66B2281744C0002A4B0 /* UIPopoverListView */,
 				99B4252C22815E0700DAE304 /* AlertView */,
 				2710E65A22801D870002A4B0 /* UINavigation */,
@@ -1251,6 +1306,7 @@
 				99F4A8172277D845009AA6ED /* loading46.png in Resources */,
 				99F4A83A2277D845009AA6ED /* loading0.png in Resources */,
 				99F4A8102277D845009AA6ED /* loading24.png in Resources */,
+				991C14752282D89C0080B54A /* priva.txt in Resources */,
 				99F4A8302277D845009AA6ED /* loading62.png in Resources */,
 				99F4A8462277D845009AA6ED /* loading43.png in Resources */,
 				99F4A8262277D845009AA6ED /* loading22.png in Resources */,
@@ -1300,6 +1356,7 @@
 				99F4A80E2277D845009AA6ED /* loading60.png in Resources */,
 				99F4A8452277D845009AA6ED /* loading51.png in Resources */,
 				99F4A8392277D845009AA6ED /* loading2.png in Resources */,
+				991C14762282D89C0080B54A /* publi.txt in Resources */,
 				99F4A81C2277D845009AA6ED /* loading8.png in Resources */,
 				99F4A8422277D845009AA6ED /* loading58.png in Resources */,
 				99F4A8152277D845009AA6ED /* loading31.png in Resources */,
@@ -1423,6 +1480,7 @@
 				2710E66E2281746E0002A4B0 /* UIPopoverListView.m in Sources */,
 				99C16345228027C8002ED79D /* YRMsgHeader.m in Sources */,
 				991C1464228275B70080B54A /* YRLoginManager.m in Sources */,
+				991C14742282D89C0080B54A /* RSA.m in Sources */,
 				99C6FECB227696CA00C7070A /* YRMsgVC.m in Sources */,
 				99C16340227FD24E002ED79D /* YRWorkConModel.m in Sources */,
 				99C6FF262276FAE000C7070A /* YRMsgMainModel.m in Sources */,
@@ -1458,8 +1516,10 @@
 				9948171A22785044007C7CEA /* YRWorkCollCell.m in Sources */,
 				27029BC72276A23400D53A94 /* YRLoginVC.m in Sources */,
 				999F6513227E664C00329012 /* UIImageView+userId.m in Sources */,
+				991C146F2282D8900080B54A /* NSString+secri.m in Sources */,
 				999F651A227E697D00329012 /* UILabel+vertical.m in Sources */,
 				9948171722785013007C7CEA /* YRWorkTabCell.m in Sources */,
+				991C146C2282D8600080B54A /* GTMBase64.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 22 - 14
UU_Ent/UU_Ent/Modules/App/AppDelegate.m

@@ -50,29 +50,37 @@
             
         } failure:^(NSString * _Nonnull errorStr) {
             //自动登录失败
-            [YRAlertView showWithTitle:nil content:errorStr sureTitle:nil cancelTitle:nil click:^(NSInteger index) {
-               
-                YRLoginVC *loginVC = [[YRLoginVC alloc]init];
-                
-                loginVC.completed = ^(BOOL success) {
+            [YRAlertView showWithTitle:@"UU互联" content:errorStr sureTitle:@"确定" cancelTitle:@"" click:^(NSInteger index) {
+
+                [UIView animateWithDuration:0.3f animations:^{
+                   
+                    YRLoginVC *loginVC = [[YRLoginVC alloc]init];
                     
-                    YRMainVC *mainVC = [[YRMainVC alloc]init];
+                    self.window.rootViewController = loginVC;
                     
-                    [UIView animateWithDuration:0.3f animations:^{
+                    loginVC.completed = ^(BOOL success) {
                         
-                        self.window.rootViewController = mainVC;
+                        YRMainVC *mainVC = [[YRMainVC alloc]init];
                         
-                    }];
-                    
+                        [UIView animateWithDuration:0.3f animations:^{
+                            
+                            self.window.rootViewController = mainVC;
+                            
+                        }];
+                        
+                        
+                    };
                     
-                };
-                
-                self.window.rootViewController = loginVC;
-                
+                }];
+
+
             }];
             
+           
+            
         }];
         
+        
     }else{
     
     YRLoginVC *loginVC = [[YRLoginVC alloc]init];

+ 0 - 1
UU_Ent/UU_Ent/Modules/Login/Main/Others/YRLoginManager.h

@@ -15,7 +15,6 @@ NS_ASSUME_NONNULL_BEGIN
 
 /**
  自动登录
-
  */
 +(void)autoLoginsuccess:(void(^)(void))success failure:(void(^)(NSString *errorStr))failure;
 

+ 15 - 3
UU_Ent/UU_Ent/Modules/Login/Main/Others/YRLoginManager.m

@@ -8,15 +8,19 @@
 
 #import "YRLoginManager.h"
 #import "YRUserInfo.h"
-
+#import "NSString+secri.h"
 @implementation YRLoginManager
 
 +(void)autoLoginsuccess:(void(^)(void))success failure:(void(^)(NSString *errorStr))failure{
     
     NSString *phone = FORMAT(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"userAccount"]);
     
+    phone = [NSString encodeSeciWithStr:phone];
+    
     NSString *pwd = FORMAT(@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"userPassword"]);
     
+    pwd = [NSString encodeSeciWithStr:pwd];
+    
     if (phone.length != 11 || pwd.length == 0) {
         
         if (failure) {
@@ -116,6 +120,8 @@
                 //登录成功之后默认设置为自动登录
                 [YRUserInfo shareManager].autoLogin = YES;
                 
+                [YRUserInfo shareManager].userCompanyInfo = resDic;
+                
                 [YRUserInfo shareManager].currCompanyInfo = response.companyArray[0].mj_keyValues;
                 
                 [YRUserInfo shareManager].lastCompanyInfo = response.companyArray[0].mj_keyValues;
@@ -215,6 +221,8 @@
         
         if (response.responseHeader.success) {
             
+            [YRUserInfo shareManager].autoLogin = NO;
+            
             if (success) {
                 
                 success(response);
@@ -244,9 +252,13 @@
 #pragma mark --- 保存账号密码进沙盒
 +(void)saveUserDataToNSUserDefaultsWithPhone:(NSString *)phoneNumber  password:(NSString *)pwd
 {
-    [[NSUserDefaults standardUserDefaults] setObject:FORMAT(@"%@",phoneNumber) forKey:@"userAccount"];
+    phoneNumber = FORMAT(@"%@",[NSString codeSeciWithStr:phoneNumber]);
+    
+    pwd =  FORMAT(@"%@",[NSString codeSeciWithStr:pwd]);
+    
+    [[NSUserDefaults standardUserDefaults] setObject:phoneNumber forKey:@"userAccount"];
     
-    [[NSUserDefaults standardUserDefaults] setObject:FORMAT(@"%@",pwd) forKey:@"userPassword"];
+    [[NSUserDefaults standardUserDefaults] setObject:pwd forKey:@"userPassword"];
 }
 
 @end

+ 0 - 6
UU_Ent/UU_Ent/Modules/Main/Main/Controllers/YRMainVC.m

@@ -43,12 +43,6 @@
     
     self.tabBar.tintColor = HexColor(@"#1084D1");
     
-    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
-        
-        [tarBar showBadgeOnItemIndex:1];
-        [tarBar showBadgeOnItemIndex:2];
-        
-    });
 }
 
 

+ 2 - 0
UU_Ent/UU_Ent/Modules/Main/Main/Views/YRTabBar.m

@@ -115,6 +115,8 @@
 
 -(void)setRemindCount:(NSInteger)remindCount{
     
+    _remindCount = remindCount;
+    
     if (remindCount > 0) {
         
          self.labArr[0].hidden = NO;

+ 44 - 7
UU_Ent/UU_Ent/Modules/Message/Main/Controllers/YRMsgVC.m

@@ -26,19 +26,14 @@
 - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
-    DLog(@"%@",[YRUserInfo shareManager].userCompanyInfo);
+    
 }
 
 -(void)viewWillAppear:(BOOL)animated{
     
     [super viewWillAppear:animated];
     
-    if ([YRUserInfo shareManager].masChanged) {
-        
-         [self getDataFromServer];
-        
-        
-    }
+    [self loadData];
     
 }
 
@@ -52,10 +47,52 @@
         
     }];
     
+    
+    
 }
 
 #pragma mark - 网络请求
 
+-(void)loadData{
+    
+    if ([YRUserInfo shareManager].masChanged) {
+        
+        NSDictionary *comDic = [YRUserInfo shareManager].userCompanyInfo;
+        
+        if (comDic) {
+            
+            self.dataArr = [YRMsgMainModel mj_objectArrayWithKeyValuesArray:comDic[@"messageConfigArray"]];
+            
+            NSMutableArray *unArr =comDic[@"unreadMessageCountArray"];
+            
+            for (YRMsgMainModel *model in self.dataArr) {
+                
+                for (NSDictionary *unDic in unArr) {
+                    
+                    if ([model.code isEqualToString:FORMAT(@"%@",unDic[@"code"])]) {
+                        
+                        model.remindCount = [unDic[@"count"] integerValue]+arc4random_uniform(20);
+                        
+                    }
+                    
+                }
+                
+            }
+            
+            [self calculteRemindCount];
+            
+            [self.tableView reloadData];
+            
+        }else{
+        
+        [self getDataFromServer];
+        
+        }
+        
+    }
+    
+}
+
 /**
  获取配置信息
  */

+ 2 - 2
UU_Ent/UU_Ent/Modules/Mine/Child/Setting/Controllers/YRSettingVC.m

@@ -28,7 +28,7 @@ static NSString *cellID = @"cellID";
 }
 
 #pragma mark --- 退出登录
--(void)LoggingOutAction
+-(void)logoutAction
 {
     [MBProgressHUD showHUDAddedTo:self.view animated:YES];
     
@@ -132,7 +132,7 @@ static NSString *cellID = @"cellID";
         
         [footerView addSubview:btn];
         
-        [btn addTarget:self action:@selector(LoggingOutAction) forControlEvents:UIControlEventTouchUpInside];
+        [btn addTarget:self action:@selector(logoutAction) forControlEvents:UIControlEventTouchUpInside];
         
         return footerView;
     }

+ 3 - 3
UU_Ent/UU_Ent/Modules/Mine/Main/Others/YRUserInfo.m

@@ -25,7 +25,7 @@
     return instance;
 
 }
-
+#pragma mark - token
 -(void)setToken:(NSString *)token{
     
     if (token) {
@@ -41,7 +41,7 @@
     return [[NSUserDefaults standardUserDefaults] objectForKey:@"UUUserInfoToken"];
     
 }
-
+#pragma mark - 最后登录的公司信息
 -(void)setLastCompanyInfo:(NSDictionary *)lastCompanyInfo{
     
     [[NSUserDefaults standardUserDefaults] setObject:lastCompanyInfo forKey:@"UUCompanyLastCompanyInfo"];
@@ -56,7 +56,7 @@
 
 }
 
-
+#pragma mark - 自动登录
 -(void)setAutoLogin:(BOOL)autoLogin{
     
     [[NSUserDefaults standardUserDefaults] setObject:@(autoLogin) forKey:@"UUUserAutoLoginOrNot"];

+ 32 - 6
UU_Ent/UU_Ent/Modules/Work/Main/Controllers/YRWorkVC.m

@@ -130,7 +130,7 @@
 -(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
    
-  
+    //适应子页侧滑返回效果
     if ([YRUserInfo shareManager].isSubWork) {
         
         [self.navigationController setNavigationBarHidden:YES animated:YES];
@@ -141,11 +141,7 @@
         
     }
     
-    if ([YRUserInfo shareManager].masChanged) {
-        
-        [self loadDataFromServer];
-        
-    }
+    [self loadData];
     
 }
 
@@ -167,6 +163,36 @@
 }
 
 #pragma mark - 网络请求
+
+-(void)loadData{
+    
+    
+    if ([YRUserInfo shareManager].masChanged) {
+        
+        NSString *title = [NSString stringWithFormat:@"%@",[YRUserInfo shareManager].lastCompanyInfo[@"name"]];
+        
+        title = title.length != 0?title:@"工作";
+        
+        self.titleLabel.text = title;
+        
+        NSDictionary *comDic = [YRUserInfo shareManager].userCompanyInfo;
+        
+        if (comDic) {
+            
+            self.dataArr = [YRWorkConModel mj_objectArrayWithKeyValuesArray:comDic[@"appGroupConfigArray"]];
+            
+            [self.tableView reloadData];
+            
+        }else{
+        
+        [self loadDataFromServer];
+        
+        }
+        
+    }
+    
+}
+
 -(void)loadDataFromServer{
     
     [GRPCCall useInsecureConnectionsForHost:kHostAddress];

+ 7 - 1
UU_Ent/UU_Ent/Utils/AlertView/YRAlertView.m

@@ -24,7 +24,13 @@ static YRAlertView *alert = nil;
         
         alert = [[YRAlertView alloc]initWithFrame:[UIScreen mainScreen].bounds];
         
+        alert.windowLevel = UIWindowLevelAlert;
+        
         alert.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2f];
+        //防止某些情况下没有主window异常
+        UIViewController *viewC = [UIViewController new];
+        
+        alert.rootViewController = viewC;
         
         [alert makeKeyAndVisible];
         
@@ -126,7 +132,7 @@ static YRAlertView *alert = nil;
         [centView addSubview:sure];
         [sure addTarget:alert action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
         
-        if (cancelTitle) {
+        if (cancelTitle.length > 0) {
             [centView addSubview:cancel];
             [cancel mas_makeConstraints:^(MASConstraintMaker *make) {
                 

+ 2 - 2
UU_Ent/UU_Ent/Utils/UIPopoverListView/UIPopoverListView.m

@@ -134,7 +134,7 @@ UIView *popDetailView;
     _webView.delegate=self;
     _webView.scalesPageToFit=YES;
     NSMutableURLRequest *preRequest;
-    DLog(@"popWebView=%@",webViewLink);
+    
     preRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:webViewLink]];
     [_webView loadRequest:preRequest];
 
@@ -311,7 +311,7 @@ BOOL isfirstOpen=YES;
     popoverDateStr=str1;
     [self.delegate setDateText:popoverDateStr];
     isfirstOpen=NO;
-    DLog(@"date=%@",str1);
+    
 }
 -(void)buttonClicked1:(id)sender{
 //    [self.delegate setDateText:popoverDateStr];

+ 192 - 0
UU_Ent/UU_Ent/Utils/encode/GTMBase64/GTMBase64.h

@@ -0,0 +1,192 @@
+//
+//  GTMBase64.h
+//
+//  Copyright 2006-2008 Google Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+//  use this file except in compliance with the License.  You may obtain a copy
+//  of the License at
+// 
+//  http://www.apache.org/licenses/LICENSE-2.0
+// 
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+//  License for the specific language governing permissions and limitations under
+//  the License.
+//
+
+#import <Foundation/Foundation.h>
+#import "GTMDefines.h"
+
+// GTMBase64
+//
+/// Helper for handling Base64 and WebSafeBase64 encodings
+//
+/// The webSafe methods use different character set and also the results aren't
+/// always padded to a multiple of 4 characters.  This is done so the resulting
+/// data can be used in urls and url query arguments without needing any
+/// encoding.  You must use the webSafe* methods together, the data does not
+/// interop with the RFC methods.
+//
+@interface GTMBase64 : NSObject
+
+//
+// Standard Base64 (RFC) handling
+//
+
+// encodeData:
+//
+/// Base64 encodes contents of the NSData object.
+//
+/// Returns:
+///   A new autoreleased NSData with the encoded payload.  nil for any error.
+//
++(NSData *)encodeData:(NSData *)data;
+
+// decodeData:
+//
+/// Base64 decodes contents of the NSData object.
+//
+/// Returns:
+///   A new autoreleased NSData with the decoded payload.  nil for any error.
+//
++(NSData *)decodeData:(NSData *)data;
+
+// encodeBytes:length:
+//
+/// Base64 encodes the data pointed at by |bytes|.
+//
+/// Returns:
+///   A new autoreleased NSData with the encoded payload.  nil for any error.
+//
++(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length;
+
+// decodeBytes:length:
+//
+/// Base64 decodes the data pointed at by |bytes|.
+//
+/// Returns:
+///   A new autoreleased NSData with the encoded payload.  nil for any error.
+//
++(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length;
+
+// stringByEncodingData:
+//
+/// Base64 encodes contents of the NSData object.
+//
+/// Returns:
+///   A new autoreleased NSString with the encoded payload.  nil for any error.
+//
++(NSString *)stringByEncodingData:(NSData *)data;
+
+// stringByEncodingBytes:length:
+//
+/// Base64 encodes the data pointed at by |bytes|.
+//
+/// Returns:
+///   A new autoreleased NSString with the encoded payload.  nil for any error.
+//
++(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length;
+
+// decodeString:
+//
+/// Base64 decodes contents of the NSString.
+//
+/// Returns:
+///   A new autoreleased NSData with the decoded payload.  nil for any error.
+//
++(NSData *)decodeString:(NSString *)string;
+
+//
+// Modified Base64 encoding so the results can go onto urls.
+//
+// The changes are in the characters generated and also allows the result to
+// not be padded to a multiple of 4.
+// Must use the matching call to encode/decode, won't interop with the
+// RFC versions.
+//
+
+// webSafeEncodeData:padded:
+//
+/// WebSafe Base64 encodes contents of the NSData object.  If |padded| is YES
+/// then padding characters are added so the result length is a multiple of 4.
+//
+/// Returns:
+///   A new autoreleased NSData with the encoded payload.  nil for any error.
+//
++(NSData *)webSafeEncodeData:(NSData *)data
+                      padded:(BOOL)padded;
+
+// webSafeDecodeData:
+//
+/// WebSafe Base64 decodes contents of the NSData object.
+//
+/// Returns:
+///   A new autoreleased NSData with the decoded payload.  nil for any error.
+//
++(NSData *)webSafeDecodeData:(NSData *)data;
+
+// webSafeEncodeBytes:length:padded:
+//
+/// WebSafe Base64 encodes the data pointed at by |bytes|.  If |padded| is YES
+/// then padding characters are added so the result length is a multiple of 4.
+//
+/// Returns:
+///   A new autoreleased NSData with the encoded payload.  nil for any error.
+//
++(NSData *)webSafeEncodeBytes:(const void *)bytes
+                       length:(NSUInteger)length
+                       padded:(BOOL)padded;
+
+// webSafeDecodeBytes:length:
+//
+/// WebSafe Base64 decodes the data pointed at by |bytes|.
+//
+/// Returns:
+///   A new autoreleased NSData with the encoded payload.  nil for any error.
+//
++(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length;
+
+// stringByWebSafeEncodingData:padded:
+//
+/// WebSafe Base64 encodes contents of the NSData object.  If |padded| is YES
+/// then padding characters are added so the result length is a multiple of 4.
+//
+/// Returns:
+///   A new autoreleased NSString with the encoded payload.  nil for any error.
+//
++(NSString *)stringByWebSafeEncodingData:(NSData *)data
+                                  padded:(BOOL)padded;
+
+// stringByWebSafeEncodingBytes:length:padded:
+//
+/// WebSafe Base64 encodes the data pointed at by |bytes|.  If |padded| is YES
+/// then padding characters are added so the result length is a multiple of 4.
+//
+/// Returns:
+///   A new autoreleased NSString with the encoded payload.  nil for any error.
+//
++(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes
+                                   length:(NSUInteger)length
+                                   padded:(BOOL)padded;
+
+// webSafeDecodeString:
+//
+/// WebSafe Base64 decodes contents of the NSString.
+//
+/// Returns:
+///   A new autoreleased NSData with the decoded payload.  nil for any error.
+//
++(NSData *)webSafeDecodeString:(NSString *)string;
+
+
+
+#pragma mark - base64
++ (NSString*)md5_base64: (NSString *) inPutText;
++ (NSString*)encodeBase64String:(NSString *)input;
++ (NSString*)decodeBase64String:(NSString *)input;
++ (NSString*)encodeBase64Data:(NSData *)data;
++ (NSString*)decodeBase64Data:(NSData *)data;
+
+@end

+ 735 - 0
UU_Ent/UU_Ent/Utils/encode/GTMBase64/GTMBase64.m

@@ -0,0 +1,735 @@
+//
+//  GTMBase64.m
+//
+//  Copyright 2006-2008 Google Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+//  use this file except in compliance with the License.  You may obtain a copy
+//  of the License at
+// 
+//  http://www.apache.org/licenses/LICENSE-2.0
+// 
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+//  License for the specific language governing permissions and limitations under
+//  the License.
+//
+
+#import "GTMBase64.h"
+#import "GTMDefines.h"
+
+static const char *kBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static const char *kWebSafeBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+static const char kBase64PaddingChar = '=';
+static const char kBase64InvalidChar = 99;
+
+static const char kBase64DecodeChars[] = {
+  // This array was generated by the following code:
+  // #include <sys/time.h>
+  // #include <stdlib.h>
+  // #include <string.h>
+  // main()
+  // {
+  //   static const char Base64[] =
+  //     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  //   char *pos;
+  //   int idx, i, j;
+  //   printf("    ");
+  //   for (i = 0; i < 255; i += 8) {
+  //     for (j = i; j < i + 8; j++) {
+  //       pos = strchr(Base64, j);
+  //       if ((pos == NULL) || (j == 0))
+  //         idx = 99;
+  //       else
+  //         idx = pos - Base64;
+  //       if (idx == 99)
+  //         printf(" %2d,     ", idx);
+  //       else
+  //         printf(" %2d/*%c*/,", idx, j);
+  //     }
+  //     printf("\n    ");
+  //   }
+  // }
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      62/*+*/, 99,      99,      99,      63/*/ */,
+  52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,
+  60/*8*/, 61/*9*/, 99,      99,      99,      99,      99,      99,
+  99,       0/*A*/,  1/*B*/,  2/*C*/,  3/*D*/,  4/*E*/,  5/*F*/,  6/*G*/,
+  7/*H*/,  8/*I*/,  9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,
+  15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,
+  23/*X*/, 24/*Y*/, 25/*Z*/, 99,      99,      99,      99,      99,
+  99,      26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,
+  33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,
+  41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,
+  49/*x*/, 50/*y*/, 51/*z*/, 99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99
+};
+
+static const char kWebSafeBase64DecodeChars[] = {
+  // This array was generated by the following code:
+  // #include <sys/time.h>
+  // #include <stdlib.h>
+  // #include <string.h>
+  // main()
+  // {
+  //   static const char Base64[] =
+  //     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+  //   char *pos;
+  //   int idx, i, j;
+  //   printf("    ");
+  //   for (i = 0; i < 255; i += 8) {
+  //     for (j = i; j < i + 8; j++) {
+  //       pos = strchr(Base64, j);
+  //       if ((pos == NULL) || (j == 0))
+  //         idx = 99;
+  //       else
+  //         idx = pos - Base64;
+  //       if (idx == 99)
+  //         printf(" %2d,     ", idx);
+  //       else
+  //         printf(" %2d/*%c*/,", idx, j);
+  //     }
+  //     printf("\n    ");
+  //   }
+  // }
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      62/*-*/, 99,      99,
+  52/*0*/, 53/*1*/, 54/*2*/, 55/*3*/, 56/*4*/, 57/*5*/, 58/*6*/, 59/*7*/,
+  60/*8*/, 61/*9*/, 99,      99,      99,      99,      99,      99,
+  99,       0/*A*/,  1/*B*/,  2/*C*/,  3/*D*/,  4/*E*/,  5/*F*/,  6/*G*/,
+  7/*H*/,  8/*I*/,  9/*J*/, 10/*K*/, 11/*L*/, 12/*M*/, 13/*N*/, 14/*O*/,
+  15/*P*/, 16/*Q*/, 17/*R*/, 18/*S*/, 19/*T*/, 20/*U*/, 21/*V*/, 22/*W*/,
+  23/*X*/, 24/*Y*/, 25/*Z*/, 99,      99,      99,      99,      63/*_*/,
+  99,      26/*a*/, 27/*b*/, 28/*c*/, 29/*d*/, 30/*e*/, 31/*f*/, 32/*g*/,
+  33/*h*/, 34/*i*/, 35/*j*/, 36/*k*/, 37/*l*/, 38/*m*/, 39/*n*/, 40/*o*/,
+  41/*p*/, 42/*q*/, 43/*r*/, 44/*s*/, 45/*t*/, 46/*u*/, 47/*v*/, 48/*w*/,
+  49/*x*/, 50/*y*/, 51/*z*/, 99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99,
+  99,      99,      99,      99,      99,      99,      99,      99
+};
+
+
+// Tests a character to see if it's a whitespace character.
+//
+// Returns:
+//   YES if the character is a whitespace character.
+//   NO if the character is not a whitespace character.
+//
+GTM_INLINE BOOL IsSpace(unsigned char c) {
+  // we use our own mapping here because we don't want anything w/ locale
+  // support.
+  static BOOL kSpaces[256] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  // 0-9
+    1, 1, 1, 1, 0, 0, 0, 0, 0, 0,  // 10-19
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 20-29
+    0, 0, 1, 0, 0, 0, 0, 0, 0, 0,  // 30-39
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 40-49
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 50-59
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 60-69
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 70-79
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 80-89
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 90-99
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 100-109
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 110-119
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 120-129
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 130-139
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 140-149
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 150-159
+    1, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 160-169
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 170-179
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 180-189
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 190-199
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 200-209
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 210-219
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 220-229
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 230-239
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  // 240-249
+    0, 0, 0, 0, 0, 1,              // 250-255
+  };
+  return kSpaces[c];
+}
+
+// Calculate how long the data will be once it's base64 encoded.
+//
+// Returns:
+//   The guessed encoded length for a source length
+//
+GTM_INLINE NSUInteger CalcEncodedLength(NSUInteger srcLen, BOOL padded) {
+  NSUInteger intermediate_result = 8 * srcLen + 5;
+  NSUInteger len = intermediate_result / 6;
+  if (padded) {
+    len = ((len + 3) / 4) * 4;
+  }
+  return len;
+}
+
+// Tries to calculate how long the data will be once it's base64 decoded.
+// Unlike the above, this is always an upperbound, since the source data
+// could have spaces and might end with the padding characters on them.
+//
+// Returns:
+//   The guessed decoded length for a source length
+//
+GTM_INLINE NSUInteger GuessDecodedLength(NSUInteger srcLen) {
+  return (srcLen + 3) / 4 * 3;
+}
+
+
+@interface GTMBase64 (PrivateMethods)
+
++(NSData *)baseEncode:(const void *)bytes
+               length:(NSUInteger)length
+              charset:(const char *)charset
+               padded:(BOOL)padded;
+
++(NSData *)baseDecode:(const void *)bytes
+               length:(NSUInteger)length
+              charset:(const char*)charset
+       requirePadding:(BOOL)requirePadding;
+
++(NSUInteger)baseEncode:(const char *)srcBytes
+                 srcLen:(NSUInteger)srcLen
+              destBytes:(char *)destBytes
+                destLen:(NSUInteger)destLen
+                charset:(const char *)charset
+                 padded:(BOOL)padded;
+
++(NSUInteger)baseDecode:(const char *)srcBytes
+                 srcLen:(NSUInteger)srcLen
+              destBytes:(char *)destBytes
+                destLen:(NSUInteger)destLen
+                charset:(const char *)charset
+         requirePadding:(BOOL)requirePadding;
+
+
+@end
+
+
+@implementation GTMBase64
+
+//
+// Standard Base64 (RFC) handling
+//
+
++(NSData *)encodeData:(NSData *)data {
+  return [self baseEncode:[data bytes]
+                   length:[data length]
+                  charset:kBase64EncodeChars
+                   padded:YES];
+}
+
++(NSData *)decodeData:(NSData *)data {
+  return [self baseDecode:[data bytes]
+                   length:[data length]
+                  charset:kBase64DecodeChars
+           requirePadding:YES];
+}
+
++(NSData *)encodeBytes:(const void *)bytes length:(NSUInteger)length {
+  return [self baseEncode:bytes
+                   length:length
+                  charset:kBase64EncodeChars
+                   padded:YES];
+}
+
++(NSData *)decodeBytes:(const void *)bytes length:(NSUInteger)length {
+  return [self baseDecode:bytes
+                   length:length
+                  charset:kBase64DecodeChars
+           requirePadding:YES];
+}
+
++(NSString *)stringByEncodingData:(NSData *)data {
+  NSString *result = nil;
+  NSData *converted = [self baseEncode:[data bytes]
+                                length:[data length]
+                               charset:kBase64EncodeChars
+                                padded:YES];
+  if (converted) {
+    result = [[NSString alloc] initWithData:converted
+                                    encoding:NSASCIIStringEncoding];
+  }
+  return result;
+}
+
++(NSString *)stringByEncodingBytes:(const void *)bytes length:(NSUInteger)length {
+  NSString *result = nil;
+  NSData *converted = [self baseEncode:bytes
+                                length:length
+                               charset:kBase64EncodeChars
+                                padded:YES];
+  if (converted) {
+    result = [[NSString alloc] initWithData:converted
+                                    encoding:NSASCIIStringEncoding];
+  }
+  return result;
+}
+
++(NSData *)decodeString:(NSString *)string {
+  NSData *result = nil;
+  NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding];
+  if (data) {
+    result = [self baseDecode:[data bytes]
+                       length:[data length]
+                      charset:kBase64DecodeChars
+               requirePadding:YES];
+  }
+  return result;
+}
+
+//
+// Modified Base64 encoding so the results can go onto urls.
+//
+// The changes are in the characters generated and also the result isn't
+// padded to a multiple of 4.
+// Must use the matching call to encode/decode, won't interop with the
+// RFC versions.
+//
+
++(NSData *)webSafeEncodeData:(NSData *)data
+                      padded:(BOOL)padded {
+  return [self baseEncode:[data bytes]
+                   length:[data length]
+                  charset:kWebSafeBase64EncodeChars
+                   padded:padded];
+}
+
++(NSData *)webSafeDecodeData:(NSData *)data {
+  return [self baseDecode:[data bytes]
+                   length:[data length]
+                  charset:kWebSafeBase64DecodeChars
+           requirePadding:NO];
+}
+
++(NSData *)webSafeEncodeBytes:(const void *)bytes
+                       length:(NSUInteger)length
+                       padded:(BOOL)padded {
+  return [self baseEncode:bytes
+                   length:length
+                  charset:kWebSafeBase64EncodeChars
+                   padded:padded];
+}
+
++(NSData *)webSafeDecodeBytes:(const void *)bytes length:(NSUInteger)length {
+  return [self baseDecode:bytes
+                   length:length
+                  charset:kWebSafeBase64DecodeChars
+           requirePadding:NO];
+}
+
++(NSString *)stringByWebSafeEncodingData:(NSData *)data
+                                  padded:(BOOL)padded {
+  NSString *result = nil;
+  NSData *converted = [self baseEncode:[data bytes]
+                                length:[data length]
+                               charset:kWebSafeBase64EncodeChars
+                                padded:padded];
+  if (converted) {
+    result = [[NSString alloc] initWithData:converted
+                                    encoding:NSASCIIStringEncoding];
+  }
+  return result;
+}
+
++(NSString *)stringByWebSafeEncodingBytes:(const void *)bytes
+                                   length:(NSUInteger)length
+                                   padded:(BOOL)padded {
+  NSString *result = nil;
+  NSData *converted = [self baseEncode:bytes
+                                length:length
+                               charset:kWebSafeBase64EncodeChars
+                                padded:padded];
+  if (converted) {
+    result = [[NSString alloc] initWithData:converted
+                                    encoding:NSASCIIStringEncoding];
+  }
+  return result;
+}
+
++(NSData *)webSafeDecodeString:(NSString *)string {
+  NSData *result = nil;
+  NSData *data = [string dataUsingEncoding:NSASCIIStringEncoding];
+  if (data) {
+    result = [self baseDecode:[data bytes]
+                       length:[data length]
+                      charset:kWebSafeBase64DecodeChars
+               requirePadding:NO];
+  }
+  return result;
+}
+
+#pragma mark - base64
++ (NSString *) md5_base64: (NSString *) inPutText
+{
+    const char *cStr = [inPutText UTF8String];
+    unsigned char digest[16];
+    //CC_MD5( cStr, strlen(cStr), digest );
+    
+    NSData * base64 = [[NSData alloc]initWithBytes:digest length:16];
+    base64 = [GTMBase64 encodeData:base64];
+    
+    NSString * output = [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];
+    return output;
+}
++ (NSString*)encodeBase64String:(NSString * )input {
+    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
+    data = [GTMBase64 encodeData:data];
+    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+    return base64String;
+}
+
++ (NSString*)decodeBase64String:(NSString * )input {
+    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
+    data = [GTMBase64 decodeData:data];
+    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+    return base64String;
+}
+
++ (NSString*)encodeBase64Data:(NSData *)data {
+    data = [GTMBase64 encodeData:data];
+    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+    return base64String;
+}
+
++ (NSString*)decodeBase64Data:(NSData *)data {
+    data = [GTMBase64 decodeData:data];
+    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+    return base64String;
+}
+
+@end
+
+@implementation GTMBase64 (PrivateMethods)
+
+//
+// baseEncode:length:charset:padded:
+//
+// Does the common lifting of creating the dest NSData.  it creates & sizes the
+// data for the results.  |charset| is the characters to use for the encoding
+// of the data.  |padding| controls if the encoded data should be padded to a
+// multiple of 4.
+//
+// Returns:
+//   an autorelease NSData with the encoded data, nil if any error.
+//
++(NSData *)baseEncode:(const void *)bytes
+               length:(NSUInteger)length
+              charset:(const char *)charset
+               padded:(BOOL)padded {
+  // how big could it be?
+  NSUInteger maxLength = CalcEncodedLength(length, padded);
+  // make space
+  NSMutableData *result = [NSMutableData data];
+  [result setLength:maxLength];
+  // do it
+  NSUInteger finalLength = [self baseEncode:bytes
+                                        srcLen:length
+                                     destBytes:[result mutableBytes]
+                                       destLen:[result length]
+                                       charset:charset
+                                        padded:padded];
+  if (finalLength) {
+    _GTMDevAssert(finalLength == maxLength, @"how did we calc the length wrong?");
+  } else {
+    // shouldn't happen, this means we ran out of space
+    result = nil;
+  }
+  return result;
+}
+
+//
+// baseDecode:length:charset:requirePadding:
+//
+// Does the common lifting of creating the dest NSData.  it creates & sizes the
+// data for the results.  |charset| is the characters to use for the decoding
+// of the data.
+//
+// Returns:
+//   an autorelease NSData with the decoded data, nil if any error.
+//
+//
++(NSData *)baseDecode:(const void *)bytes
+               length:(NSUInteger)length
+              charset:(const char *)charset
+       requirePadding:(BOOL)requirePadding {
+  // could try to calculate what it will end up as
+  NSUInteger maxLength = GuessDecodedLength(length);
+  // make space
+  NSMutableData *result = [NSMutableData data];
+  [result setLength:maxLength];
+  // do it
+  NSUInteger finalLength = [self baseDecode:bytes
+                                     srcLen:length
+                                  destBytes:[result mutableBytes]
+                                    destLen:[result length]
+                                    charset:charset
+                             requirePadding:requirePadding];
+  if (finalLength) {
+    if (finalLength != maxLength) {
+      // resize down to how big it was
+      [result setLength:finalLength];
+    }
+  } else {
+    // either an error in the args, or we ran out of space
+    result = nil;
+  }
+  return result;
+}
+
+//
+// baseEncode:srcLen:destBytes:destLen:charset:padded:
+//
+// Encodes the buffer into the larger.  returns the length of the encoded
+// data, or zero for an error.
+// |charset| is the characters to use for the encoding
+// |padded| tells if the result should be padded to a multiple of 4.
+//
+// Returns:
+//   the length of the encoded data.  zero if any error.
+//
++(NSUInteger)baseEncode:(const char *)srcBytes
+                 srcLen:(NSUInteger)srcLen
+              destBytes:(char *)destBytes
+                destLen:(NSUInteger)destLen
+                charset:(const char *)charset
+                 padded:(BOOL)padded {
+  if (!srcLen || !destLen || !srcBytes || !destBytes) {
+    return 0;
+  }
+
+  char *curDest = destBytes;
+  const unsigned char *curSrc = (const unsigned char *)(srcBytes);
+  
+  // Three bytes of data encodes to four characters of cyphertext.
+  // So we can pump through three-byte chunks atomically.
+  while (srcLen > 2) {
+    // space?
+    _GTMDevAssert(destLen >= 4, @"our calc for encoded length was wrong");
+    curDest[0] = charset[curSrc[0] >> 2];
+    curDest[1] = charset[((curSrc[0] & 0x03) << 4) + (curSrc[1] >> 4)];
+    curDest[2] = charset[((curSrc[1] & 0x0f) << 2) + (curSrc[2] >> 6)];
+    curDest[3] = charset[curSrc[2] & 0x3f];
+
+    curDest += 4;
+    curSrc += 3;
+    srcLen -= 3;
+    destLen -= 4;
+  }
+
+  // now deal with the tail (<=2 bytes)
+  switch (srcLen) {
+    case 0:
+      // Nothing left; nothing more to do.
+      break;
+    case 1:
+      // One byte left: this encodes to two characters, and (optionally)
+      // two pad characters to round out the four-character cypherblock.
+      _GTMDevAssert(destLen >= 2, @"our calc for encoded length was wrong");
+      curDest[0] = charset[curSrc[0] >> 2];
+      curDest[1] = charset[(curSrc[0] & 0x03) << 4];
+      curDest += 2;
+      destLen -= 2;
+      if (padded) {
+        _GTMDevAssert(destLen >= 2, @"our calc for encoded length was wrong");
+        curDest[0] = kBase64PaddingChar;
+        curDest[1] = kBase64PaddingChar;
+        curDest += 2;
+      }
+      break;
+    case 2:
+      // Two bytes left: this encodes to three characters, and (optionally)
+      // one pad character to round out the four-character cypherblock.
+      _GTMDevAssert(destLen >= 3, @"our calc for encoded length was wrong");
+      curDest[0] = charset[curSrc[0] >> 2];
+      curDest[1] = charset[((curSrc[0] & 0x03) << 4) + (curSrc[1] >> 4)];
+      curDest[2] = charset[(curSrc[1] & 0x0f) << 2];
+      curDest += 3;
+      destLen -= 3;
+      if (padded) {
+        _GTMDevAssert(destLen >= 1, @"our calc for encoded length was wrong");
+        curDest[0] = kBase64PaddingChar;
+        curDest += 1;
+      }
+      break;
+  }
+  // return the length
+  return (curDest - destBytes);
+}
+
+//
+// baseDecode:srcLen:destBytes:destLen:charset:requirePadding:
+//
+// Decodes the buffer into the larger.  returns the length of the decoded
+// data, or zero for an error.
+// |charset| is the character decoding buffer to use
+//
+// Returns:
+//   the length of the encoded data.  zero if any error.
+//
++(NSUInteger)baseDecode:(const char *)srcBytes
+                 srcLen:(NSUInteger)srcLen
+              destBytes:(char *)destBytes
+                destLen:(NSUInteger)destLen
+                charset:(const char *)charset
+         requirePadding:(BOOL)requirePadding {
+  if (!srcLen || !destLen || !srcBytes || !destBytes) {
+    return 0;
+  }
+
+  int decode;
+  NSUInteger destIndex = 0;
+  int state = 0;
+  char ch = 0;
+  while (srcLen-- && (ch = *srcBytes++) != 0)  {
+    if (IsSpace(ch))  // Skip whitespace
+      continue;
+    
+    if (ch == kBase64PaddingChar)
+      break;
+    
+    decode = charset[(unsigned int)ch];
+    if (decode == kBase64InvalidChar)
+      return 0;
+    
+    // Four cyphertext characters decode to three bytes.
+    // Therefore we can be in one of four states.
+    switch (state) {
+      case 0:
+        // We're at the beginning of a four-character cyphertext block.
+        // This sets the high six bits of the first byte of the
+        // plaintext block.
+        _GTMDevAssert(destIndex < destLen, @"our calc for decoded length was wrong");
+        destBytes[destIndex] = decode << 2;
+        state = 1;
+        break;
+      case 1:
+        // We're one character into a four-character cyphertext block.
+        // This sets the low two bits of the first plaintext byte,
+        // and the high four bits of the second plaintext byte.
+        _GTMDevAssert((destIndex+1) < destLen, @"our calc for decoded length was wrong");
+        destBytes[destIndex] |= decode >> 4;
+        destBytes[destIndex+1] = (decode & 0x0f) << 4;
+        destIndex++;
+        state = 2;
+        break;
+      case 2:
+        // We're two characters into a four-character cyphertext block.
+        // This sets the low four bits of the second plaintext
+        // byte, and the high two bits of the third plaintext byte.
+        // However, if this is the end of data, and those two
+        // bits are zero, it could be that those two bits are
+        // leftovers from the encoding of data that had a length
+        // of two mod three.
+        _GTMDevAssert((destIndex+1) < destLen, @"our calc for decoded length was wrong");
+        destBytes[destIndex] |= decode >> 2;
+        destBytes[destIndex+1] = (decode & 0x03) << 6;
+        destIndex++;
+        state = 3;
+        break;
+      case 3:
+        // We're at the last character of a four-character cyphertext block.
+        // This sets the low six bits of the third plaintext byte.
+        _GTMDevAssert(destIndex < destLen, @"our calc for decoded length was wrong");
+        destBytes[destIndex] |= decode;
+        destIndex++;
+        state = 0;
+        break;
+    }
+  }
+  
+  // We are done decoding Base-64 chars.  Let's see if we ended
+  //      on a byte boundary, and/or with erroneous trailing characters.
+  if (ch == kBase64PaddingChar) {               // We got a pad char
+    if ((state == 0) || (state == 1)) {
+      return 0;  // Invalid '=' in first or second position
+    }
+    if (srcLen == 0) {
+      if (state == 2) { // We run out of input but we still need another '='
+        return 0;
+      }
+      // Otherwise, we are in state 3 and only need this '='
+    } else {
+      if (state == 2) {  // need another '='
+        while ((ch = *srcBytes++) && (srcLen-- > 0)) {
+          if (!IsSpace(ch))
+            break;
+        }
+        if (ch != kBase64PaddingChar) {
+          return 0;
+        }
+      }
+      // state = 1 or 2, check if all remain padding is space
+      while ((ch = *srcBytes++) && (srcLen-- > 0)) {
+        if (!IsSpace(ch)) {
+          return 0;
+        }
+      }
+    }
+  } else {
+    // We ended by seeing the end of the string.
+    
+    if (requirePadding) {
+      // If we require padding, then anything but state 0 is an error.
+      if (state != 0) {
+        return 0;
+      }
+    } else {
+      // Make sure we have no partial bytes lying around.  Note that we do not
+      // require trailing '=', so states 2 and 3 are okay too.
+      if (state == 1) {
+        return 0;
+      }
+    }
+  }
+  
+  // If then next piece of output was valid and got written to it means we got a
+  // very carefully crafted input that appeared valid but contains some trailing
+  // bits past the real length, so just toss the thing.
+  if ((destIndex < destLen) &&
+      (destBytes[destIndex] != 0)) {
+    return 0;
+  }
+  
+  return destIndex;
+}
+
+
+@end

+ 252 - 0
UU_Ent/UU_Ent/Utils/encode/GTMBase64/GTMDefines.h

@@ -0,0 +1,252 @@
+// 
+// GTMDefines.h
+//
+//  Copyright 2008 Google Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
+//  use this file except in compliance with the License.  You may obtain a copy
+//  of the License at
+// 
+//  http://www.apache.org/licenses/LICENSE-2.0
+// 
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+//  License for the specific language governing permissions and limitations under
+//  the License.
+//
+ 
+// ============================================================================
+
+#include <AvailabilityMacros.h>
+
+// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs
+#ifndef MAC_OS_X_VERSION_10_5
+  #define MAC_OS_X_VERSION_10_5 1050
+#endif
+#ifndef MAC_OS_X_VERSION_10_6
+  #define MAC_OS_X_VERSION_10_6 1060
+#endif
+
+// ----------------------------------------------------------------------------
+// CPP symbols that can be overridden in a prefix to control how the toolbox
+// is compiled.
+// ----------------------------------------------------------------------------
+
+
+// GTMHTTPFetcher will support logging by default but only hook its input
+// stream support for logging when requested.  You can control the inclusion of
+// the code by providing your own definitions for these w/in a prefix header.
+//
+#ifndef GTM_HTTPFETCHER_ENABLE_LOGGING
+  #define GTM_HTTPFETCHER_ENABLE_LOGGING 1
+#endif // GTM_HTTPFETCHER_ENABLE_LOGGING
+#ifndef GTM_HTTPFETCHER_ENABLE_INPUTSTREAM_LOGGING
+  #define GTM_HTTPFETCHER_ENABLE_INPUTSTREAM_LOGGING 0
+#endif // GTM_HTTPFETCHER_ENABLE_INPUTSTREAM_LOGGING
+
+// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and 
+// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens
+// when a validation fails. If you implement your own validators, you may want
+// to control their internals using the same macros for consistency.
+#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
+  #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0
+#endif
+
+// Give ourselves a consistent way to do inlines.  Apple's macros even use
+// a few different actual definitions, so we're based off of the foundation
+// one.
+#if !defined(GTM_INLINE)
+  #if defined (__GNUC__) && (__GNUC__ == 4)
+    #define GTM_INLINE static __inline__ __attribute__((always_inline))
+  #else
+    #define GTM_INLINE static __inline__
+  #endif
+#endif
+
+// Give ourselves a consistent way of doing externs that links up nicely
+// when mixing objc and objc++
+#if !defined (GTM_EXTERN)
+  #if defined __cplusplus
+    #define GTM_EXTERN extern "C"
+  #else
+    #define GTM_EXTERN extern
+  #endif
+#endif
+
+// Give ourselves a consistent way of exporting things if we have visibility
+// set to hidden.
+#if !defined (GTM_EXPORT)
+  #define GTM_EXPORT __attribute__((visibility("default")))
+#endif
+
+// _GTMDevLog & _GTMDevAssert
+//
+// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for
+// developer level errors.  This implementation simply macros to NSLog/NSAssert.
+// It is not intended to be a general logging/reporting system.
+//
+// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert
+// for a little more background on the usage of these macros.
+//
+//    _GTMDevLog           log some error/problem in debug builds
+//    _GTMDevAssert        assert if conditon isn't met w/in a method/function
+//                           in all builds.
+// 
+// To replace this system, just provide different macro definitions in your
+// prefix header.  Remember, any implementation you provide *must* be thread
+// safe since this could be called by anything in what ever situtation it has
+// been placed in.
+// 
+
+// We only define the simple macros if nothing else has defined this.
+#ifndef _GTMDevLog
+
+#ifdef DEBUG
+  #define _GTMDevLog(...) NSLog(__VA_ARGS__)
+#else
+  #define _GTMDevLog(...) do { } while (0)
+#endif
+
+#endif // _GTMDevLog
+
+// Declared here so that it can easily be used for logging tracking if
+// necessary. See GTMUnitTestDevLog.h for details.
+@class NSString;
+GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...);
+
+#ifndef _GTMDevAssert
+// we directly invoke the NSAssert handler so we can pass on the varargs
+// (NSAssert doesn't have a macro we can use that takes varargs)
+#if !defined(NS_BLOCK_ASSERTIONS)
+  #define _GTMDevAssert(condition, ...)                                       \
+    do {                                                                      \
+      if (!(condition)) {                                                     \
+        [[NSAssertionHandler currentHandler]                                  \
+            handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \
+                               file:[NSString stringWithUTF8String:__FILE__]  \
+                         lineNumber:__LINE__                                  \
+                        description:__VA_ARGS__];                             \
+      }                                                                       \
+    } while(0)
+#else // !defined(NS_BLOCK_ASSERTIONS)
+  #define _GTMDevAssert(condition, ...) do { } while (0)
+#endif // !defined(NS_BLOCK_ASSERTIONS)
+
+#endif // _GTMDevAssert
+
+// _GTMCompileAssert
+// _GTMCompileAssert is an assert that is meant to fire at compile time if you
+// want to check things at compile instead of runtime. For example if you
+// want to check that a wchar is 4 bytes instead of 2 you would use
+// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X)
+// Note that the second "arg" is not in quotes, and must be a valid processor
+// symbol in it's own right (no spaces, punctuation etc).
+
+// Wrapping this in an #ifndef allows external groups to define their own
+// compile time assert scheme.
+#ifndef _GTMCompileAssert
+  // We got this technique from here:
+  // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html
+
+  #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg
+  #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg)
+  #define _GTMCompileAssert(test, msg) \
+    typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
+#endif // _GTMCompileAssert
+
+// Macro to allow fast enumeration when building for 10.5 or later, and
+// reliance on NSEnumerator for 10.4.  Remember, NSDictionary w/ FastEnumeration
+// does keys, so pick the right thing, nothing is done on the FastEnumeration
+// side to be sure you're getting what you wanted.
+#ifndef GTM_FOREACH_OBJECT
+  #if defined(TARGET_OS_IPHONE) || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
+    #define GTM_FOREACH_OBJECT(element, collection) \
+      for (element in collection)
+    #define GTM_FOREACH_KEY(element, collection) \
+      for (element in collection)
+  #else
+    #define GTM_FOREACH_OBJECT(element, collection) \
+      for (NSEnumerator * _ ## element ## _enum = [collection objectEnumerator]; \
+           (element = [_ ## element ## _enum nextObject]) != nil; )
+    #define GTM_FOREACH_KEY(element, collection) \
+      for (NSEnumerator * _ ## element ## _enum = [collection keyEnumerator]; \
+           (element = [_ ## element ## _enum nextObject]) != nil; )
+  #endif
+#endif
+
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// CPP symbols defined based on the project settings so the GTM code has
+// simple things to test against w/o scattering the knowledge of project
+// setting through all the code.
+// ----------------------------------------------------------------------------
+
+// Provide a single constant CPP symbol that all of GTM uses for ifdefing
+// iPhone code.
+#include <TargetConditionals.h>
+#if TARGET_OS_IPHONE // iPhone SDK
+  // For iPhone specific stuff
+  #define GTM_IPHONE_SDK 1
+  #if TARGET_IPHONE_SIMULATOR
+    #define GTM_IPHONE_SIMULATOR 1
+  #else
+    #define GTM_IPHONE_DEVICE 1
+  #endif  // TARGET_IPHONE_SIMULATOR
+#else
+  // For MacOS specific stuff
+  #define GTM_MACOS_SDK 1
+#endif
+
+// Provide a symbol to include/exclude extra code for GC support.  (This mainly
+// just controls the inclusion of finalize methods).
+#ifndef GTM_SUPPORT_GC
+  #if GTM_IPHONE_SDK
+    // iPhone never needs GC
+    #define GTM_SUPPORT_GC 0
+  #else
+    // We can't find a symbol to tell if GC is supported/required, so best we
+    // do on Mac targets is include it if we're on 10.5 or later.
+    #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
+      #define GTM_SUPPORT_GC 0
+    #else
+      #define GTM_SUPPORT_GC 1
+    #endif
+  #endif
+#endif
+
+// To simplify support for 64bit (and Leopard in general), we provide the type
+// defines for non Leopard SDKs
+#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
+ // NSInteger/NSUInteger and Max/Mins
+  #ifndef NSINTEGER_DEFINED
+    #if __LP64__ || NS_BUILD_32_LIKE_64
+      typedef long NSInteger;
+      typedef unsigned long NSUInteger;
+    #else
+      typedef int NSInteger;
+      typedef unsigned int NSUInteger;
+    #endif
+    #define NSIntegerMax    LONG_MAX
+    #define NSIntegerMin    LONG_MIN
+    #define NSUIntegerMax   ULONG_MAX
+    #define NSINTEGER_DEFINED 1
+  #endif  // NSINTEGER_DEFINED
+  // CGFloat
+  #ifndef CGFLOAT_DEFINED
+    #if defined(__LP64__) && __LP64__
+      // This really is an untested path (64bit on Tiger?)
+      typedef double CGFloat;
+      #define CGFLOAT_MIN DBL_MIN
+      #define CGFLOAT_MAX DBL_MAX
+      #define CGFLOAT_IS_DOUBLE 1
+    #else /* !defined(__LP64__) || !__LP64__ */
+      typedef float CGFloat;
+      #define CGFLOAT_MIN FLT_MIN
+      #define CGFLOAT_MAX FLT_MAX
+      #define CGFLOAT_IS_DOUBLE 0
+    #endif /* !defined(__LP64__) || !__LP64__ */
+    #define CGFLOAT_DEFINED 1
+  #endif // CGFLOAT_DEFINED
+#endif  // MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4

+ 17 - 0
UU_Ent/UU_Ent/Utils/encode/NSString+secri/NSString+secri.h

@@ -0,0 +1,17 @@
+//
+//  NSString+secri.h
+//  shiku_im
+//
+//  Created by ime on 2018/6/13.
+//
+
+#import <Foundation/Foundation.h>
+#import "RSA.h"
+#import "GTMBase64.h"
+@interface NSString (secri)
+
++(NSString *)codeSeciWithStr:(NSString *)codeStr;
+
++(NSString *)encodeSeciWithStr:(NSString *)encodeStr;
+
+@end

+ 72 - 0
UU_Ent/UU_Ent/Utils/encode/NSString+secri/NSString+secri.m

@@ -0,0 +1,72 @@
+//
+//  NSString+secri.m
+//  shiku_im
+//
+//  Created by ime on 2018/6/13.
+//
+
+#import "NSString+secri.h"
+
+static NSString *salt = @"  VU+2bRMLDXEc/MOmAQJBAP+Sv6JdkrY+7WGuQN5O5PjsB15lOGcr4vcfz4vAQ/uyEGYZh6IO2Eu0lW6sw2x6uRg0c6hMiFEJcO89qlH/B10CQQDDdtGrzXWVG457vA27kpduDpM6BQWTX6wYV9zRlcYYMFHwAQkE0BTvIYde2il6DKGyzokgI6zQyhgtRJ1xtthxsy=+y";
+
+@implementation NSString (secri)
+
++(NSString *)codeSeciWithStr:(NSString *)codeStr{
+    
+    NSString *pubKey = [self scriKeyWithResource:@"publi"];
+    
+    codeStr = [GTMBase64 encodeBase64String:codeStr];
+    
+    codeStr = [codeStr stringByAppendingString:salt];
+    
+    codeStr = [RSA encryptString:codeStr publicKey:pubKey];
+    
+    codeStr = [GTMBase64 encodeBase64String:codeStr];
+    
+    codeStr = [RSA encryptString:codeStr publicKey:pubKey];
+    
+    return codeStr;
+    
+}
+
++(NSString *)encodeSeciWithStr:(NSString *)encodeStr{
+    
+    NSString *priKey = [self scriKeyWithResource:@"priva"];
+    
+    encodeStr = [RSA decryptString:encodeStr privateKey:priKey];
+    
+    encodeStr = [GTMBase64 decodeBase64String:encodeStr];
+    
+    encodeStr = [RSA decryptString:encodeStr privateKey:priKey];
+    
+    encodeStr = [encodeStr stringByReplacingOccurrencesOfString:salt withString:@""];
+    
+    encodeStr = [GTMBase64 decodeBase64String:encodeStr];
+    
+    return encodeStr;
+    
+}
+
++(NSString *)scriKeyWithResource:(NSString *)resour{
+    
+    NSString *path = [[NSBundle mainBundle]pathForResource:resour ofType:@"txt"];
+    
+    NSData *data = [NSData dataWithContentsOfFile:path];
+    
+    NSString *key = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
+    
+    
+    if (key) {
+        
+        return key;
+        
+    }else{
+        
+        return @"";
+        
+    }
+    
+}
+
+
+@end

+ 25 - 0
UU_Ent/UU_Ent/Utils/encode/RSA/RSA.h

@@ -0,0 +1,25 @@
+/*
+ @author: ideawu
+ @link: https://github.com/ideawu/Objective-C-RSA
+*/
+
+#import <Foundation/Foundation.h>
+
+@interface RSA : NSObject
+
+// return base64 encoded string
++ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey;
+// return raw data
++ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey;
+// return base64 encoded string
++ (NSString *)encryptString:(NSString *)str privateKey:(NSString *)privKey;
+// return raw data
++ (NSData *)encryptData:(NSData *)data privateKey:(NSString *)privKey;
+
+// decrypt base64 encoded string, convert result to string(not base64 encoded)
++ (NSString *)decryptString:(NSString *)str publicKey:(NSString *)pubKey;
++ (NSData *)decryptData:(NSData *)data publicKey:(NSString *)pubKey;
++ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey;
++ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey;
+
+@end

+ 418 - 0
UU_Ent/UU_Ent/Utils/encode/RSA/RSA.m

@@ -0,0 +1,418 @@
+/*
+ @author: ideawu
+ @link: https://github.com/ideawu/Objective-C-RSA
+*/
+
+#import "RSA.h"
+#import <Security/Security.h>
+
+@implementation RSA
+
+/*
+static NSString *base64_encode(NSString *str){
+	NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
+	if(!data){
+		return nil;
+	}
+	return base64_encode_data(data);
+}
+*/
+
+static NSString *base64_encode_data(NSData *data){
+	data = [data base64EncodedDataWithOptions:0];
+	NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+	return ret;
+}
+
+static NSData *base64_decode(NSString *str){
+	NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
+	return data;
+}
+
++ (NSData *)stripPublicKeyHeader:(NSData *)d_key{
+	// Skip ASN.1 public key header
+	if (d_key == nil) return(nil);
+	
+	unsigned long len = [d_key length];
+	if (!len) return(nil);
+	
+	unsigned char *c_key = (unsigned char *)[d_key bytes];
+	unsigned int  idx	 = 0;
+	
+	if (c_key[idx++] != 0x30) return(nil);
+	
+	if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;
+	else idx++;
+	
+	// PKCS #1 rsaEncryption szOID_RSA_RSA
+	static unsigned char seqiod[] =
+	{ 0x30,   0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+		0x01, 0x05, 0x00 };
+	if (memcmp(&c_key[idx], seqiod, 15)) return(nil);
+	
+	idx += 15;
+	
+	if (c_key[idx++] != 0x03) return(nil);
+	
+	if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;
+	else idx++;
+	
+	if (c_key[idx++] != '\0') return(nil);
+	
+	// Now make a new NSData from this buffer
+	return([NSData dataWithBytes:&c_key[idx] length:len - idx]);
+}
+
+//credit: http://hg.mozilla.org/services/fx-home/file/tip/Sources/NetworkAndStorage/CryptoUtils.m#l1036
++ (NSData *)stripPrivateKeyHeader:(NSData *)d_key{
+	// Skip ASN.1 private key header
+	if (d_key == nil) return(nil);
+
+	unsigned long len = [d_key length];
+	if (!len) return(nil);
+
+	unsigned char *c_key = (unsigned char *)[d_key bytes];
+	unsigned int  idx	 = 22; //magic byte at offset 22
+
+	if (0x04 != c_key[idx++]) return nil;
+
+	//calculate length of the key
+	unsigned int c_len = c_key[idx++];
+	int det = c_len & 0x80;
+	if (!det) {
+		c_len = c_len & 0x7f;
+	} else {
+		int byteCount = c_len & 0x7f;
+		if (byteCount + idx > len) {
+			//rsa length field longer than buffer
+			return nil;
+		}
+		unsigned int accum = 0;
+		unsigned char *ptr = &c_key[idx];
+		idx += byteCount;
+		while (byteCount) {
+			accum = (accum << 8) + *ptr;
+			ptr++;
+			byteCount--;
+		}
+		c_len = accum;
+	}
+
+	// Now make a new NSData from this buffer
+	return [d_key subdataWithRange:NSMakeRange(idx, c_len)];
+}
+
++ (SecKeyRef)addPublicKey:(NSString *)key{
+	NSRange spos = [key rangeOfString:@"-----BEGIN PUBLIC KEY-----"];
+	NSRange epos = [key rangeOfString:@"-----END PUBLIC KEY-----"];
+	if(spos.location != NSNotFound && epos.location != NSNotFound){
+		NSUInteger s = spos.location + spos.length;
+		NSUInteger e = epos.location;
+		NSRange range = NSMakeRange(s, e-s);
+		key = [key substringWithRange:range];
+	}
+	key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];
+	key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];
+	key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];
+	key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];
+	
+	// This will be base64 encoded, decode it.
+	NSData *data = base64_decode(key);
+	data = [RSA stripPublicKeyHeader:data];
+	if(!data){
+		return nil;
+	}
+
+	//a tag to read/write keychain storage
+	NSString *tag = @"RSAUtil_PubKey";
+	NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];
+	
+	// Delete any old lingering key with the same tag
+	NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
+	[publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
+	[publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
+	[publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];
+	SecItemDelete((__bridge CFDictionaryRef)publicKey);
+	
+	// Add persistent version of the key to system keychain
+	[publicKey setObject:data forKey:(__bridge id)kSecValueData];
+	[publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)
+	 kSecAttrKeyClass];
+	[publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)
+	 kSecReturnPersistentRef];
+	
+	CFTypeRef persistKey = nil;
+	OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);
+	if (persistKey != nil){
+		CFRelease(persistKey);
+	}
+	if ((status != noErr) && (status != errSecDuplicateItem)) {
+		return nil;
+	}
+
+	[publicKey removeObjectForKey:(__bridge id)kSecValueData];
+	[publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
+	[publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
+	[publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
+	
+	// Now fetch the SecKeyRef version of the key
+	SecKeyRef keyRef = nil;
+	status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef);
+	if(status != noErr){
+		return nil;
+	}
+	return keyRef;
+}
+
++ (SecKeyRef)addPrivateKey:(NSString *)key{
+	NSRange spos;
+	NSRange epos;
+	spos = [key rangeOfString:@"-----BEGIN RSA PRIVATE KEY-----"];
+	if(spos.length > 0){
+		epos = [key rangeOfString:@"-----END RSA PRIVATE KEY-----"];
+	}else{
+		spos = [key rangeOfString:@"-----BEGIN PRIVATE KEY-----"];
+		epos = [key rangeOfString:@"-----END PRIVATE KEY-----"];
+	}
+	if(spos.location != NSNotFound && epos.location != NSNotFound){
+		NSUInteger s = spos.location + spos.length;
+		NSUInteger e = epos.location;
+		NSRange range = NSMakeRange(s, e-s);
+		key = [key substringWithRange:range];
+	}
+	key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];
+	key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];
+	key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];
+	key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];
+
+	// This will be base64 encoded, decode it.
+	NSData *data = base64_decode(key);
+	data = [RSA stripPrivateKeyHeader:data];
+	if(!data){
+		return nil;
+	}
+
+	//a tag to read/write keychain storage
+	NSString *tag = @"RSAUtil_PrivKey";
+	NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];
+
+	// Delete any old lingering key with the same tag
+	NSMutableDictionary *privateKey = [[NSMutableDictionary alloc] init];
+	[privateKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
+	[privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
+	[privateKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];
+	SecItemDelete((__bridge CFDictionaryRef)privateKey);
+
+	// Add persistent version of the key to system keychain
+	[privateKey setObject:data forKey:(__bridge id)kSecValueData];
+	[privateKey setObject:(__bridge id) kSecAttrKeyClassPrivate forKey:(__bridge id)
+	 kSecAttrKeyClass];
+	[privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)
+	 kSecReturnPersistentRef];
+
+	CFTypeRef persistKey = nil;
+	OSStatus status = SecItemAdd((__bridge CFDictionaryRef)privateKey, &persistKey);
+	if (persistKey != nil){
+		CFRelease(persistKey);
+	}
+	if ((status != noErr) && (status != errSecDuplicateItem)) {
+		return nil;
+	}
+
+	[privateKey removeObjectForKey:(__bridge id)kSecValueData];
+	[privateKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
+	[privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
+	[privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
+
+	// Now fetch the SecKeyRef version of the key
+	SecKeyRef keyRef = nil;
+	status = SecItemCopyMatching((__bridge CFDictionaryRef)privateKey, (CFTypeRef *)&keyRef);
+	if(status != noErr){
+		return nil;
+	}
+	return keyRef;
+}
+
+/* START: Encryption & Decryption with RSA private key */
+
++ (NSData *)encryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef isSign:(BOOL)isSign {
+	const uint8_t *srcbuf = (const uint8_t *)[data bytes];
+	size_t srclen = (size_t)data.length;
+	
+	size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);
+	void *outbuf = malloc(block_size);
+	size_t src_block_size = block_size - 11;
+	
+	NSMutableData *ret = [[NSMutableData alloc] init];
+	for(int idx=0; idx<srclen; idx+=src_block_size){
+		//NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);
+		size_t data_len = srclen - idx;
+		if(data_len > src_block_size){
+			data_len = src_block_size;
+		}
+		
+		size_t outlen = block_size;
+		OSStatus status = noErr;
+        
+        if (isSign) {
+            status = SecKeyRawSign(keyRef,
+                                   kSecPaddingPKCS1,
+                                   srcbuf + idx,
+                                   data_len,
+                                   outbuf,
+                                   &outlen
+                                   );
+        } else {
+            status = SecKeyEncrypt(keyRef,
+                                   kSecPaddingPKCS1,
+                                   srcbuf + idx,
+                                   data_len,
+                                   outbuf,
+                                   &outlen
+                                   );
+        }
+		if (status != 0) {
+			NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);
+			ret = nil;
+			break;
+		}else{
+			[ret appendBytes:outbuf length:outlen];
+		}
+	}
+	
+	free(outbuf);
+	CFRelease(keyRef);
+	return ret;
+}
+
++ (NSString *)encryptString:(NSString *)str privateKey:(NSString *)privKey{
+	NSData *data = [RSA encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] privateKey:privKey];
+	NSString *ret = base64_encode_data(data);
+	return ret;
+}
+
++ (NSData *)encryptData:(NSData *)data privateKey:(NSString *)privKey{
+	if(!data || !privKey){
+		return nil;
+	}
+	SecKeyRef keyRef = [RSA addPrivateKey:privKey];
+	if(!keyRef){
+		return nil;
+	}
+	return [RSA encryptData:data withKeyRef:keyRef isSign:YES];
+}
+
++ (NSData *)decryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{
+	const uint8_t *srcbuf = (const uint8_t *)[data bytes];
+	size_t srclen = (size_t)data.length;
+	
+	size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);
+	UInt8 *outbuf = malloc(block_size);
+	size_t src_block_size = block_size;
+	
+	NSMutableData *ret = [[NSMutableData alloc] init];
+	for(int idx=0; idx<srclen; idx+=src_block_size){
+		//NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);
+		size_t data_len = srclen - idx;
+		if(data_len > src_block_size){
+			data_len = src_block_size;
+		}
+		
+		size_t outlen = block_size;
+		OSStatus status = noErr;
+		status = SecKeyDecrypt(keyRef,
+							   kSecPaddingNone,
+							   srcbuf + idx,
+							   data_len,
+							   outbuf,
+							   &outlen
+							   );
+		if (status != 0) {
+			NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);
+			ret = nil;
+			break;
+		}else{
+			//the actual decrypted data is in the middle, locate it!
+			int idxFirstZero = -1;
+			int idxNextZero = (int)outlen;
+			for ( int i = 0; i < outlen; i++ ) {
+				if ( outbuf[i] == 0 ) {
+					if ( idxFirstZero < 0 ) {
+						idxFirstZero = i;
+					} else {
+						idxNextZero = i;
+						break;
+					}
+				}
+			}
+			
+			[ret appendBytes:&outbuf[idxFirstZero+1] length:idxNextZero-idxFirstZero-1];
+		}
+	}
+	
+	free(outbuf);
+	CFRelease(keyRef);
+	return ret;
+}
+
+
++ (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey{
+	NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
+	data = [RSA decryptData:data privateKey:privKey];
+	NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+	return ret;
+}
+
++ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey{
+	if(!data || !privKey){
+		return nil;
+	}
+	SecKeyRef keyRef = [RSA addPrivateKey:privKey];
+	if(!keyRef){
+		return nil;
+	}
+	return [RSA decryptData:data withKeyRef:keyRef];
+}
+
+/* END: Encryption & Decryption with RSA private key */
+
+/* START: Encryption & Decryption with RSA public key */
+
++ (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey{
+	NSData *data = [RSA encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] publicKey:pubKey];
+	NSString *ret = base64_encode_data(data);
+	return ret;
+}
+
++ (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey{
+	if(!data || !pubKey){
+		return nil;
+	}
+	SecKeyRef keyRef = [RSA addPublicKey:pubKey];
+	if(!keyRef){
+		return nil;
+	}
+	return [RSA encryptData:data withKeyRef:keyRef isSign:NO];
+}
+
++ (NSString *)decryptString:(NSString *)str publicKey:(NSString *)pubKey{
+	NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
+	data = [RSA decryptData:data publicKey:pubKey];
+	NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+	return ret;
+}
+
++ (NSData *)decryptData:(NSData *)data publicKey:(NSString *)pubKey{
+	if(!data || !pubKey){
+		return nil;
+	}
+	SecKeyRef keyRef = [RSA addPublicKey:pubKey];
+	if(!keyRef){
+		return nil;
+	}
+	return [RSA decryptData:data withKeyRef:keyRef];
+}
+
+/* END: Encryption & Decryption with RSA public key */
+
+@end

+ 16 - 0
UU_Ent/UU_Ent/Utils/encode/RSA/priva.txt

@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMMjZu9UtVitvgHS
+tpmAU/rRVdhy9GaT2rnpCJOYSb0deVI+rXPKHI9Aca2LkWiRgkzM1wqbRvAvWrqK
+gm4PgQUjnoNr7vRd1HPUKNA9ATfJetddW86yar0ux3FMVaxUFN6F0KatqkplVXHo
+8qXubKHRx9dCbK95P96rJkrWBiO9AgMBAAECgYBO1UKEdYg9pxMX0XSLVtiWf3Na
+2jX6Ksk2Sfp5BhDkIcAdhcy09nXLOZGzNqsrv30QYcCOPGTQK5FPwx0mMYVBRAdo
+OLYp7NzxW/File//169O3ZFpkZ7MF0I2oQcNGTpMCUpaY6xMmxqN22INgi8SHp3w
+VU+2bRMLDXEc/MOmAQJBAP+Sv6JdkrY+7WGuQN5O5PjsB15lOGcr4vcfz4vAQ/uy
+EGYZh6IO2Eu0lW6sw2x6uRg0c6hMiFEJcO89qlH/B10CQQDDdtGrzXWVG457vA27
+kpduDpM6BQWTX6wYV9zRlcYYMFHwAQkE0BTvIYde2il6DKGyzokgI6zQyhgtRJ1x
+L6fhAkB9NvvW4/uWeLw7CHHVuVersZBmqjb5LWJU62v3L2rfbT1lmIqAVr+YT9CK
+2fAhPPtkpYYo5d4/vd1sCY1iAQ4tAkEAm2yPrJzjMn2G/ry57rzRzKGqUChOFrGs
+lm7HF6CQtAs4HC+2jC0peDyg97th37rLmPLB9txnPl50ewpkZuwOAQJBAM/eJnFw
+F5QAcL4CYDbfBKocx82VX/pFXng50T7FODiWbbL4UnxICE0UBFInNNiWJxNEb6jL
+5xd0pcy9O2DOeso=
+-----END PRIVATE KEY-----

+ 6 - 0
UU_Ent/UU_Ent/Utils/encode/RSA/publi.txt

@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI2bvVLVYrb4B0raZgFP60VXY
+cvRmk9q56QiTmEm9HXlSPq1zyhyPQHGti5FokYJMzNcKm0bwL1q6ioJuD4EFI56D
+a+70XdRz1CjQPQE3yXrXXVvOsmq9LsdxTFWsVBTehdCmrapKZVVx6PKl7myh0cfX
+QmyveT/eqyZK1gYjvQIDAQAB
+-----END PUBLIC KEY-----