From aa3ba0229bb20e4dbb52537fdf105e9d6a599328 Mon Sep 17 00:00:00 2001 From: Kelp Date: Tue, 15 May 2012 21:50:57 +0800 Subject: [PATCH] update ARC version --- CocoaSecurity.xcodeproj/project.pbxproj | 2 + .../UserInterfaceState.xcuserstate | Bin 40863 -> 45493 bytes CocoaSecurity/CocoaSecurity.h | 19 ++-- CocoaSecurity/CocoaSecurity.m | 93 +++++++++++++++++- .../GTMBase64/CocoaSecurity-GTMBase64.m | 28 +++++- CocoaSecurityTests/CocoaSecurityTests.m | 12 +-- README.md | 10 +- iOS View/CocoaSecurityAppDelegate.m | 4 +- 8 files changed, 143 insertions(+), 25 deletions(-) diff --git a/CocoaSecurity.xcodeproj/project.pbxproj b/CocoaSecurity.xcodeproj/project.pbxproj index 36f62d2..cd14f53 100644 --- a/CocoaSecurity.xcodeproj/project.pbxproj +++ b/CocoaSecurity.xcodeproj/project.pbxproj @@ -337,6 +337,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -362,6 +363,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/CocoaSecurity.xcodeproj/project.xcworkspace/xcuserdata/Kelp.xcuserdatad/UserInterfaceState.xcuserstate b/CocoaSecurity.xcodeproj/project.xcworkspace/xcuserdata/Kelp.xcuserdatad/UserInterfaceState.xcuserstate index 9d1809a24609feff68b6329abb6dd6d323ab70a2..29f18ef9b5ce68a148b39238e47e07ca4485ad40 100644 GIT binary patch delta 19816 zcma)j2V4}#_xR21?e6U^y&N39i%9Q9Iw*$}?~dN9iZlxrM7|3J9dNG7x)2x5C8%}5C{e#AQXgy2oMS4fgB`(p+Er&K@lhhC7=|PfpSm@s=yd9 z7Sw}DKn+?zE0_V=Ksyk?9MA*igT-JaSO>O%t>6=|8|(pl!C`O$oCg=cMQ{~-1MY$Q z;0N#k{0RO4e}Xq^@E3RsMG!y;3CKVe8bCv62CbnDbb@X$5C*|u7y)Bo5=@3EFcl7k z!{Bf@0#?A0uo70mYFGnn;V3v3PJol(6v)FyI0JUUd2l{l09U}3a24DHKZ2X#Nq7pL zhM&VT@GLwB&%+DwB2-_3m*MyD9=s2KfDho0@F9Eze}*sMZv-R=LQIf^gy0Ar!ibO( zGQyc~A^H)nM1R7I@FskSNFs`eCSr(KB94eB1`&xw3Xw{vh<2ij=qBb83y3Aea$+^H zj@U$eOl%`|5W9(e#3AA+agz9)I8R(s6JHWniEoKp#9iV(@sM~-{7n2x{6_piycI(+ zC1%9BVgs>>*i39Gwh=psoyGmd?qYATpEyVyDozl~#fjn};v{jhc&Jz*R*F^PLUEC} zSX?456_<(2#lys7#AC&E;&I~f;tAr3;(Bqjc)GYn+$x?U?h(%wtLKSViC2r)h}VkO ziPwuah&PHq6Ymu767Lr85$_f66Q2^F7Jn{2BR(rWCq6H}AiggCR(wNzQ~Xf;Nc@xd zH}UV{*QA8xNF7p_)FUlOOVWz8Ci|0aNscEckQ2#zvYDJtwvesl9I}U;OU@%#k*moyxgp z6+#W9qNrGEFqKH9QR!3$RYa+asS>J+s-|kFiBvr`iE5&nsp-@#YBtqPEvA-GOR2Tg zMrt$l3H2#;ggQzcqmEN2sFTzw>O6IUx1S&C7y2drJN+m9RstoYL?YoNdJ;p4 ziNs7|A+eU&NgO3ElKv8RiI>Dz5+Dhdgh?VK(ULgHU`e7RSu#|jl4MA-C3%uUNr|Lf zGD1=*sgaD9)JY~tCP}79cuAvVx@3l=L((Pbmh?#GOBP9%N>)f#OV&v?N;XT>TP52i zpGkI0_DK#(j!2G6PD##4&Py&yu1LO?T$9|8+?L#x+?V_)`APCr@?7#l@|)xj$zKd$ z#0<@_j4orq7&B5v##k}7j05A$xH1D6PsWGwXM&heCY*_4VwpjVoJnF*86}g>WHGr+ z0aMJBF~gaWOtqRB#f)XfGxf}5M$JrPnweIno#|v|Gjo`E%tB@fvz%GQtYtPZA2C~) zZOjg47qgc+z#L|dF(;YNnRCoV<_qR4<{Rc)<`(lEbB}qzJYt?OKQq5Fub9`&8&<>; zEX6Xc4y(@^v8Jp!YsuQM_N)`zk9A|!9;`1L$i}hp>>ze9o50H1M0O~vU^CbPwva7i zi`fcxBwNYWvUTh@c09|oh@HkZvQ2C&JD**^E@T(6i`gaYQg$V~hW(iRg#DD=$?jqI zvxnGY>}B>V_G|V!`z?E$y~EyP@3RltN9@n+bM__s7Y8{?&2gL|XU17__M9WvpL63p zIe#vci{WCqI4+(W#3gabTnd-PWpg=PE?2@;an)Q6SIdp!Mss7h$=nofDyQaVaBW;W z*To6kDsDBmhFi<6N?lbNHcZ562o#ak&7r9H^W$p{^3imDNc!Rsi zJ>s5n&$wT?7u@gMYwj=Ztq!3h){*EiI=VV~Iz~c&%F{S+rASYt&qJPADKZop@nZgz zFp^3F#llW11mtZ0nQ8<0VX`EIZsObd{d|tFPjUfR2>M&{-qI`m|UME*L>S=8{xVCn9Rk^dTcifnY z@#S8FE9w%)l?X%a`w7dvbhhW~9@j{A)Q<`&ULm@{hp!Ob;v>?Miz{m0OVttG75%{H ztrC4Nx+l8NNAgj8^eWKOSFC~9VRxAm zg$6FdVLK~fkFg#Z1)@QWaL!ofTEzSEA}zN;U~qbhDqWeh5+sPiv_G|wL@-3qGch+! z)bPKIoz98;KnkzF0;KY#LYRqzmkMO_#cMzsNCz1p6J+t_{4jnvKZ37V19Ctv$itrn z{7Al%ug0IXLWfC$)BwKsq!bJX6@2juFoLfV9+X$AJl&$MO8A z6<{JiS{Q0-;ne^p^OIJBDPSr;hM(}BlMXQ@%lihFg5@7HUcuw(!af5HU^QQebzTG3@>6;A9$N=&03ZEB zr_JDFUd{8_^0@f;vWmLeF^*9!vwAh^quCBV`v=WVu#2C@HwwF@&g%W(;0Ni4_~!T0 zk7^ut3>@dD^E3JwodRe6!RRbF$G7mULmi{02mcS5m%*3+1NCc++U6KlYxj3d50MmH z2eCK`Fq=?PzUN^M?qbF@d~KV zFA+w`%+9$&lxs$d#ShZ!&vX2EQj19SP!{Kxzjek=b8zm4C{f6DLJ zAaa5Qun-pE?-E#wKg;pVe8%tOcjNCp{9gRIPv9-Dt4G5z{I2D_F$U}4IGoAe#h9wR zZWSIG-9qhWn7dT%5_9Q>FR|Hk9$_v85YH2k~I@MhS8{ok87U@L#%T_C`A ze$p!F-T`OAPW~W&gg^eCLI=)VGo?kAL0)Sl(mc5BDnM)uw`&Lf0REa#9G^% zt%2+R0owpK@+bI{LW8x7dJEjk7jJ@F;U{n#+zvm5JK$$h!#(_I{&W5ef0jST zpXV>|7x_#4W&VpzqJD6{C>0)rhu~p&1RjOQG|Qd0;IHuBh>#(|1`+m%h(<&VB2uwS za|#ViVsP%N993IUQ#UpmZwcdz>&nXt4J@|X*%*V^EAU$!S@28v75o}rh2Owy@H+n` z{}ul=f0h4+zs6r*2XDZe@D{uc@4)ZiUH)7CKK}-RPZ2ndz#RnN2nXzJx6ifB0|Oqz zr z4*%UM_?8e6fWOOs&)*X^*;nh+y#D(sC0Kr!(9glqTaPfnf(U*7hZTe&|KkTigh{WU z2Ok6x=Dc5_LABr$k|-Q=@aShr*x>*ptO#quhOp%y@{jnR_{XcUP+P*0aKd6A^H2Dn z1#`!G{Q-oBMu(h0oN zZ85MQGKfqfi^wK&h+HC%$R`SjLZXN$CQ67>qKqgfh7rSw5kv(slBfg(QBBkkwftWQ zh!B7Xh!LPr3XmYcBA|nS9s&jk7$IPSfD{391S}A+Lcj(AI|LjMa6-TZ0av~d0XGEP z5%ARLFq#-cj3w%bam09Hf)L>BR7JEQ;Eg~i0x<|AB9MZB5`i29iV>(lpc;Wu2#iHw zA_9{U;1Os$E7g|)~KGd&;gPt)$ zp}o04eZab=#WL-~x+%QXDYWhrc}I(3)`xKqV-z@!=tFs+MUnNP{G`$9xbSVue!<*L z=be2|wP==oXun{MDujdXGQIf({gd_T?zq?&P zi2s!A27ezP{M&m9UfIfC9x1LAS0NCKKpX<`2n<>+t`XN_zM~PqY9?s- z$~An2O8*1A zl=Mh`^uCbS;N$1(>+5b8>>n@%8{_Bi-CI%inXo{-RKs|oc#(LqcnJb31kw;lM<8Rh zc$s)PX1o%COuW}*X*g$N8zu`+eDoqSG-c}Feesd_6Ah!y;*Z5!#9I-_MIaA>d;|(s zi?@llYZ>7ksHl(6*Z_0S1LC6^vV-D7;=|%22$UdDia;3x<*UWV#K$q&Nd$%=FkC}6 zqE~!CpuOiM@mK#U?Q8K>Om+={kqA_3$f|^Gegiyji|_p_$$jw;S_Nwmu0wkbb@8!L zKM~^sL0WZ?J+SWQYvGt5VZ zKs^GJG+Y`4KCqt`X-hi&n<=C->4Iro5txE-fsJX@!XbYTHR(zE{hP-~e=Frtz6CrimPED^W`QLdp51n%byjLpSujpz{vo}oOq11u|29JlNKGCf7m|y}#U#!H%Me(O zzzPIbt|pg}I1i9G53EACsev_Jqe*4zl38`N5|dtCef@*5u0Fy4L)VW;O-}e<-7j(* ziSq%u1A%o2tk*EypivXIzf9irveUG`K6Jl6kpp4Zs*AJ@+X@*-B_G6EkXuth_%Rk#-Hq`pet(1`hulXjE5rIoS` zf$hCgdME9c)Zlin=6>FPU-tLOANk^yLKNYm@kZoT9SEz@1^nSM(C&ie_9(6yF* z?);O)W!ehz4FY>skZ%##D?ANxlu-n(WGFEL`>u#K*jplS zq>sHdC82CZIJl4Xaz84hhJK>{peN-_;fie?Q9|`2@~Qr~N-Ch-dn=t2z2(oT-oi%@ zfzQ`bo|G5mP5Ds1lplpt;#mYPAb=Y-IOyPv~pA?uzHTI%@ zgTS@kNC*fFo`M%iQANR3c&TqPTd9u!%%GFP*%({!Edn?G$>8hL^>?%k)VTXk&7tON zw5`I2E?krj>OFGBYP4NQ;k1W2+(O`8F#7pwR4A?hs{5<@R9H@}!cj@Bpm0X}4uS7i zQmd&o2;4`#dTIlRTCbh8yM43v5$}h)WNEm1OLOR3MO(CZ_xkX*YgSR#e<>^!QQo1{ zXVgA?AfR?qyQtmN9%?TFKOlh9#E%F(MBvdHYCm;=I!GO&4kPdr0*?`Rg}`qJUfjMn zN)H%OpHpWw(RBuaCo3qtK%Q#)n1NpCRz#z0o?gK{4!A!NcrDmPWeHxf#?HS{f8yz)ey3hje;|O9&0h$-T}8d2{-WL@ zD8gGMf>0P9Tb@Sap3n+ff*|o;Z7I#sMtt#FT8Gx9^=N(CfHp)>j39|1g&>U}#%9*i z#|wsEt7weV4_OxO_TX7R2kNZa$1R?rRz>byH%(ayq( zT3f-cOiy?`%utQH_p~cNX^X*OxoBk4-Iims+>=vsOdJ(?avkEQGA zarAh40zHwgrzg=3^kjMpJ(X6|JdNmSbR*qFH`CMU7P^(5LATNEbO$|??xefuS@dkW zn-=IfbPqk3o=4B87tjmoMf75N3B8nFMlYvV&@0vSDta}&hF(jrqu0|L=#BIy`XhQX z{V~0T-b#N$Z=<)E_ye;hu%x?qxaJX=!5hj`Y?TjK1v^>kJBgUlk_S2 zH2pb!hCWN5qtDY9=!^6v`ZE0meTDv#{)+yZzDj>XU!$+n-_keeoAfREHhqWI|Bk*( ze^1||@6$if59lAa&l}tb)ChJVI19nq2zDbVAUFrX9t7tiI1j=32rfWyA%cq#T#Von z1eYSX48i3Hu0U`lf~yc*jo=yt*CMzM!Sx7kKyV|1n-Kg6!OaMMjNldow<7ong4+<> zj^L*V?m+M}1a~613njwc2<|~}FM|6J+>hV^1P>y32*JY$9zpOZg2xa%j^GIdPa=2< z!P5wSj^G&t&mwpZ!SnCe+E0R`++7o}atH8S7%O)IFNFDW5Ad6CLhcRz5MIe$!C!)1 zqBE2L{ADH-B~~`tZ*)|AC%|{FBAQt#6WN#;s+(hLh+C!D3J)2Yh7t!sNb-gfXW@8~Bb2xb50hM>WB~rM z61B#yRIGtg7@Fz?CF#QWR4*vW z64s?+yK;q#so0AYukloN_!_sr-qeDAFEVlT)eVykUZ%Fui3))O03Tufl*<7 z<_QB;n8`w+NQHG>B6O%cpk%qQSM#(=_(6p+*9tmm*drSRzcdW{NGQ=fZ4qXqVU%sc z4$apN;Z7Q6wo5Qc$Nt|d#H3^64hYrhK~Qp7SeuUNjtO6C22XZp;5qqRaLovXl5@hP z3`;?sVFD!=g&xhw7kI>rmVBkL!cJJ2VaL4p?KgsVrXToLD9iK*w}b_m&fq)YV5Sea zC;W`Z9|+D_0pO94o8<8^F?5MKgdu*e9i#KFv1wkmyWP3#|bj}!toqO$QTI^bG#vADp=*Z(M)fD-&wHF zwGf8q8qtiUR$I;U!dzXNvFUq0m8%OGdrT%1p5+?SOmDNxUPEdclP*ufbMwwVrk{o= zS^!1!_WZVRlmj)RR0hHMaTZ^QEPQEE*yak&Ae<3s99y0jAJX`}Y6+YHL0)@_U z?c?wHSmO|km=2kNA4WG6;L%9T)LZzgz=>vJH1hngya9$uNg2t7NolF?Rf!jt*J)WT zD8!m12wMt=KxT-L+^dPH;9X=uGb!)&^%BMx$snT;W)~?SlO`N0*3z068$%`&E9oKR z6kE|uj)ovqxKrXP94e!QkBW^TlaH|nL#7Bz(ClxlU@(jlf=jF*Q~GYp(+)M4VB}#R zcEJ-RSgi`dbC`#~lw#YfuoQnGt<;oeYBf@VK1f+sst=hl!q(DM$c)3TOoYrtY)2eq z8n9>Oa>y*`b;s%9*d2>C7=FDBOh#bqmI-#1+C4sfgfnDT z3X?|+qnR}ttT^FLg@+)muz}2a>}6ZwP%SIWs^Nr@71og1^lr#l*js@meJp%i5eb=3 z1nZGGH1la6{icyNG_zClJQ(wH>SgeDB&OJdB`axWzXlZDD{5_}CCwbtJSX)&zo>M9 z%+cPJc&OG`NUbubnG+f?b^z9FQI!Q`P7CKp^%rhe;V?P-L8H_vN_bi&F&?T+O-oJ7 z9vZKDzs4>IQ%Ct?PQ7r`l=#dfdCL0~#a!0#R`v4!q1pp7U*cKOSZypM)L@IRVlTdT zf*s9V*I@f%Y$xG*jTGGcAl<3f4&1?h@E7W9`+@KA48?#SK0r0Htwvc;4>ja?f-5|Q zk)w>kW2{&zc!sUXp?=YTaxlnMI53(P@<;pO^XBZ)r4%k#wZ>}zl;AqX0{n@+=qrpH zV^6((5A+aDkFlUx*!OHU)&jC54ljRU_*fIjO7PDR;j^*&G|OqQG-`MVQFU~8oepI6 z-q~r4N6cu}@E;g@8PQ4U?>)wvU`7d$HR}ze_shd(9Hz3+Pz@GlkMk31$5}$w8Yc#= zFEtK0HqM%6?KCJc!lm(ng3WkinswAXNB2J0j5nfL7tQm)-sk<}bs^hdI6GcWv+kPV z2+gozX0$Rzo-!EEF1`!Ida_-qX|?5La#A z|NqLZezBTvMYr!!!!_^Km9i7r$+#|I>#5gl1A@5J`3u1ZtJo>*R2CmKe?;&hf{!wX zj;S4qi~dU`u=uq4>$?bMS8JyKePWb(;i`mP z$4^?zu4gx}8`(|lM=Uaer~w4Cf3SbDSA?7O_NIgmBJ>b^i?wFoa`CX-x! z2;JUjz!C=TCXu|kA(p@AX3q!m{_zM`}|skXHD+G3&btYM!Km%t@zbdw{(b_F*C z5q83X$<8j^P%aGzE2rR;oC*;Rh;T%N(<&~V%iuB*;f#n#L_`UaDb?}@E}x&Ynk(Q6 zxgxF@5!gsHx@a;WBJakKM3+>(mJpjCLNTNIXoFM;BxK684w#W?w3 zbLMgLx#8SGZc(pML5K*(b|E4J5ut0jCA2ZOj9ZR-C3t~^Y4Q&-5D^i*iHODd4bMpL zJtBPbOj$mvR=7AtU$}`{)Z7NF;zn+hM!~v@>T*pg?fI@rWQd4x?ZV#7eXP}~d?mM8 z6jp1XFG>^DipoUAqI!`X{;U((rEsbQe2X$vnnkpm+k=Q$M8vP;_Hp|WF&Gg^*nVvi;SOozKd!s6z@RsOaM}wK#2{WI6!jbF zpxvOj&$)AWx8crkXAzNr2>D9xJa+*RiHH~?yl!;0;=bZEJ+i+eT;r}IA{h}WLPV4K zkOuBHKWQWR10cA&-1po)?mqVe_kjD6!yUUF_;w936cI{9q#+^$5m|`HK|~%R3i>pC ztkqP3^*Zcn`(OVKjw?*9Ezh+yDqi$|x~^c}*Q4fMX-U)nucUo99k@TWq?sDh|IbAn z<6b>=fR-X#L-BvOLGzA^(o*GWsQ!D;)a{)^bhMW+h}={NBSXrW?QcFqfIntY&sH$C($bgbl*4B$W2Pc+kntVpp)M z@QViP@F`*wyP4gBUpP2|Uo<#@_wmo!vv|+G$X-^nH`te)nA7K+aZb*|FAMP8B5ntc zp|dz@F5=7okMO;I3mtnM51l}rV4YB%fjSX7Q93a?nK~nN>UBDF*6VE4`AFwuovk|C zbiUVltn*aorOt0UuXX;^C3OvSjdV?PeRM;0vvmt}r|3@CZPjhl6?7NtF4bMG`?2m` zUG;I@OS)g^eyRJl?rq(NxE-Ly>W$Y^>$U1F)mx>vTknY8W4-74*7||^!TO>4 z1N9^H2kXoAlk`*cGxd@Fbp5URyY+ABe{aAVm>I|ntPE@n>dfN1i z=|$7ardLdFoBn9}TneNTsj1XVYA%&YU8Jtk0a6dCx71e}CJmRyNaLh~q$+8;G)I~z zRToH0rRCD$($UgM(iZ6qX{U6Sv|Bn)x@>}^r-Z>^px~-={e~I=~d}9=`HCU z>0RkF>2v8T>F?4%%tU6;Ol(G)>6uxYS(`bSIhnbb4KVXC^D+xIi#Ho=Hq=aMmS&b= zmSt9KR%%vmHr%Yjtix=R*+H{gWN?DPtT2?C? zBde25kk!kk%UWgavYE13vTm6mTP|BETO(U1+bH`;wp+GWc0hJWc2ss;roJq@BD*2G zCA%ZLE4wFqB6}u#F8fvX(n4$@vv9F+wHRRGVc~7zYY}M?Z4qM;YcbS9X_0M_YmskJ zXfe!UgvCgUDvK72r4|P)?pQprcxFjhl9se3W64?STIyRGS{hrLTDn@gS-M+#T6$ah zTKZcCS_WH&TBci;Sx&U4*gR)ekNR*6X6kJR^M9vX!XeInbmWvU#)((`orptHD_&NZEx*p?P~32?QZR3t@g7Huuia6 zSQl6qSx>O8w{EbWVy(7D){WN9)-BdEtlO<;TCcWVYrWojqxEL%t=8MEKeOI#z0dl9 z^&#u8t$(%AvvIcZwJEomU^CBVo6T99yEe~kp4$Rj!j`n9Z5dn6R@YYF*2dP(*1^`v zwx6w=t%t3*ZI10K+p~6JyKuGL1iKY>AKPuU+ithRZkOF2yOVaO?atVpv-`^Ks(qM! zf_z&YqT7&sU? z*gDudI662xcsh7HEO*%Ku*G4Q!yboy4hI|#Ih=Ml<8aR5g2N?;$Bw|UpQAd;G1)QI zQR$fGnCY19IL>jZW4q%_$N7#69Tz(;bzJVa(s8rn7ROH$1|-0674@x0>;Cw-?t zr%0znr%b18ryQqTr!uEuP8Cj-PSsA6oF+R>ahmGX?ljZsn9~WT(@tldE;wCw`qJsD z({-ntPIsKXclyEUq0?ihXHLI3y>$BB%IQz1x6aU+bf%qIXI*Cl=fTd2&dJV0omI{m zg8uA&>Tc&A=atT@o!2_AcmBkAyNiWOKbQV4?k=7#K`tRKt6a9aY;)P+veV^|%aMMq z{d)S%>$kAq;(lxTt#dVZb$0FN>gMY18sHk_y2*8y>mJwrt_NLDxqjY1seg9=-2Mgq zi~3jeuk8O-|GWL~^?%U+VgFzHzi=yc8|5~}ZJgT#H{NZU+U=R!8@IOu-~jOe-2wUo zCJksAFk?W+fX)H)1}ty~?t1P9?#Aw>?l$gr?o-^`+&kR6+-JKlbYJZLy9ebV@!&jk zJ)|Dy9=AOndpz}c?(wU~8;`f1!#(Rf$9vX$Hh4C9PWOE5`P%bO&$nK{i}lj+8tpaJ zi}z~uYWC{%n&qW_=Jm$wtvB=*d+U1Zdmr#V<9*KiqW5L*>)tnf!hI5bl6+Eq6h1jV zc|Iq7uK0ZA^Nr7SpYMI{`zm}3e2aWbean4od`J0S^}Xl&gYQG%pL}2VzVgfStMIGz ztMMDLBNZESAn8HB9IDX0(AmS1I+_11FZw?0>c7J0!IbT4_p!WQQ&8RM+1)s zo)5efcqQ=bz-xhb1Mdg^82BjgNe~m{9TX8XET}f9A!vG#5Y!X2G-yT8>Y#N&8-un7 zeHOGkXm8Mgpp!wDgVZ;I9tQms^djiDpg)5C3dR+4ux_wHuu-sSuubrQ;K1P6;P~K_ zU`23RaAt5$aB1+c;ELeN;F{nW!CQk51m6#S8vI-E+Yp@)y%4hyixBG&yAa0^_YkiT z-w^+hpb%w9eMn2lmXKW`heOVXTnzapW1E3waXqbI7kDFV!Kxhnj?jg~~%m zhfWG@4DASA5V|OIb?Ca#jiH-Ew}$Qx-4}W=^l<30&~u^JLhpq>5B)Xt4Su1G2&2N7 zFrzTjF!L~rFzYavFrTo9u&6M3SW;MOm@+IqtRSp7tSoF;SVh>Fu!gYKu(q(Cu=!z& z!j^`u2wNStC2U*RjOEom!%l>q8hCBs-GR>r{t+$-XTy!drQx!0t8m+J*YE-1 zp5fl%e&GYd6T%hY1>r^E72#Fkwc%sJ$AwP~N8wH3)5B+kcZV+z-yFUtd|&wS@KfPu z!q10a3cnV9Bm8#wcj5QKpM<}P5JylE`VmGErV-{5mJv=7{UY2V+#|fy5y27B5s49* z5!n$X5#67T zEHWZ8Dl#@QDKb4WKXPPbRphwHiIEMFQzKDiTjb2hS&`k5J&{WzH%9J=JQ8^<@?7M_ z$S)$liu@+>yU2Ty4m96(x^K zizx2S-Oo$419T z4~~{cE2Gn+v!ZjN^P`7F*G5l_ZjNq=o)s-b&y8LXy*PSJ^!n&c(VL^Us-t&DABnyY zeJT1{^o{7-(RZWoM?Z~z9{nQvRrKo^B1R|1B*s3*F~&W{3ts^ahzX8~j){vI93ziO zib;eVl{EPVC;{S;MYY-SD9z+i^86+Jf8)P}iX^_jHwS%?~+A(O?pgn_*4mv*AeQ=0+ zaM<98!BKD6hqWlZ_Rrz)KP5C4FWBD`rbNL_g zH;HM9#fhbf!xBd%j!qn#cs}uZ;*G=yiH{PWB>tTEYvQXRa0od>GK3qVH^gvAw0cO@ zkVQj2AM!d$n&g<|oaCA`AjvbyCn-KDC243s#v?*y<(w?M)Nk@{7Cw-oDF6m;@H%Tv&{z?`l6UkJvS+aeyQ*ys#w`7mx=H$-g zMafH&S0}Ga-k7{O`P1Z`$$OIbCm&Bfo2>ph`E812ic^Y9O8*r1l#rCLl!TNaDJdz6 zl(dx0l$?~|DI-&=Q)*L2r;JS*pRy=rXUfe~ajH{lVyY@NJvA#eH?=HvSnAT$b*UQ^ zo(dm@zamHxst8v^DPk3a6mmt9B2}SOq${!%xrzcsv7$^dTrpBntr(>ks~E4SS1Tqf z)QV|}W<{%_UD2tSt(c>jr&y?1qFAn2rC6)jp!i6!MX^n>L$OP-S8+gbSaD2oQt`Rs zoZ_P53&mH8Zxr7uZYjP~+*3SIJW@PS{H*v@@k;Sp@kS|95=u(RD0P(jN+YGI(p+h& zv{BkCos|8QZb}cOx6)4;s8ok22Pz|#G0J#lf^vv5MX6AxDKnKh%6w&!vQ#-tS)r^_ z)+)y+$0;W&8ES+!KPPPIXGSoOK;tm?k%sp{u6lQioz+qC$!l(eB~HE9#l z>eG7CmZqtfr|nBSo^~?rY1(gTuhT8lozh*>NkIZ%N;kz9;=n29+Vn z@XrX(h|H+Vn3AE+SeLOiV_U|ZjE5ONWg2H%W!hv0XGUknW|m}DW>#l*WcFmv%iNK9 zAoEb>qs(73UuMa&9I~9UlCv_hva-fyP0ix7mSnBXTCdJJopm|uO4g&SU$b6j8)aK& zTW7~-r(_S!uF4*lJt2E(_PXp1*~hZaWnajCk^NVWD90wJUrzrVRZd<`LC)ly=A4$C zwK-dIKFPU|b2aB$&L6qrTq@Ttw}0+{TvcvfZb2@eJ0rI}cT?`Cxu50U&iyg>Q69)+ z^K|mU^5XIa<*7&Hjm{gJ*ORw2Z+YJCyd!zX@*d~C%=<0hAYYbmneUq)mLHyJ@qw1{a1FmK0VNRu|4HTu`{EaBtzU!V`tRstex~zAbVraxd~MN-4@L z$}SpTq%J~5+luxU?Jv4p^i$E3V%uWZVz=U<#o5KV#Z!x0if0sWE8bhYzxapZXT{G; zbW5Zq<|UCO2_=aoV@oENOfA_^vaRIPk}D-QN^X@hrADPDr2|XjO9z)$m5wW&P`ada zZRz^b&r823{j$uYOl@6eTUJmuysV;3C|g{%wCqsX>9R9rkIP<`{Z?*VZdGnm9$X$> z9$P-Ld~Er+^10>9%2$-1F27uUrTo<}(J(m7d6?%g?_r8zIm7aX@xx{eYae!D*wtaz zhC2`U9PT}Q^zcc;Cl5b0{L=6*Mi`H6IrcFH~Nt z(yKD7l2v6^6;+i~t*+W!wWaEZs%KTttKF*osspNPswY&}SMRPqQhluYuNu0BsY$KL zs>!KYRI|EfZOxsUhc!RdhStW`s^e?hYvfGx5>H_L2>+0&p*PX1pSa*4xY@EY5r*SpoCXA~ecVyg| zap%Z@jJ&K8h>O0IYDoN!Gxj-6%#5aY@e`i!hwmzM4gFx6U!!6 zPpqA|W8#5{hw4T3Og&d0RWGj}QZLjmu3uXJwEnmH*OPoFg-r^d)I6zk(yU2mCw)2T z>jtX^=Z1a_6B_u2X$`j;9yC0h96LE_a?0e{lNU~2JXw8j@{`HWrua=6I3;2Vn$k9< zW6GH+SEhV5)pV-ORJ*BpQ_H6gpSo`9)~Va3KAHMz>hJ1cb+kHG-K_3Z&r)Ag-&Nn^ zefUs*AdmPq{KEW2{8sLDWPu!!Gb%?lXcYPc?LpVjooQg2*)*qVF4Ou=bDb72EofTI zwD@TW(}t+0rA$*y%bQj>tz=sHv=P%Pr!AUxV%m#Fr^d9#QH@g?)s52{n;Tmj+Z&fP zu5aAfxTSGh&9!14;uey5;qw(88?|XSvJ`;IX1a8^>6ZR zN@>b$%5KVQDr_3nG`4AcQ+?CqrmvfBH$858+VryN_ohFa)Nh-qW~N!ES-;t=d0=y5 z^RVXH=F!b{%@dlNnx{7l&2yUEovNOkX;E`SexO*G}Iu{gdgBr@x&3TMOADY2jM*S`1rETFhGPS{z!2w4}9UwA8dr zXsK`6*0Q%{f6MQ!P~9qSjcZMAO>OONUDmpyb!F?S)~&7ETKBgeYCYO|qV;s^+19UH zueIK2z1@1Z^?vIwtuI=CYkfV#YsSDC5i_D^#Lk#Fqj^TljJ6paGY-!+S-J+p0@dIi`urf9c??;cA-suvF(etuiCz8 zyWjS@UANt!UDod0?$#dI9@(DNUf4ddy|aB$`;zwM?W@|?wy$sB(Y~{NPy7D%L+wY~ z&$gd$ztn!E{m1r4?LW0YZGYbWq62o29Y!4{9cCRC9o8Lo9RoY!I|g?ob|iO{bd+_J zcZ}$$?5OEz=$O*McQkfP?`Tzb^mNSYSlqF!V`ay>j*T6gI}UezGjr6;aWkjQY?|3J zvu)kjUY>>kvu z>Q3)2=`Qac(OubH(>=Pot{ZhXb+>f4bb@b+f{zd?#0o=%G$B(c5{3&^ z!c3t{SR$+y)(e}2&B7jGpKw?$91~6oXN3#GW#N`^NBCa2KPO_&kU7b7hR#vW**)jP zoKtho&AB+|i#b>4T%U7u&i8X3&G~iCn;y1Dr^m3zq{pnss>im+p=Uske@}Q%WKUX8 zW>0ocUQc09Nl$sth@Q%xnx4@;Q+xQH#-8S$$33rm{_J@>7tAf5TQhgm+_7_W$Ibn6 z?ss#)pZmkyALps&70oM|S3Ym}yzBEG%zHTR@w}(=6X$2n&z_$*zhM69`CrYyI{*6o d8w(N^~Vf@&}v)Pn}l22`LE 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 QC%dudss1I^KjY2*9|P-W3;+NC diff --git a/CocoaSecurity/CocoaSecurity.h b/CocoaSecurity/CocoaSecurity.h index 2aec8e5..1ffe07e 100644 --- a/CocoaSecurity/CocoaSecurity.h +++ b/CocoaSecurity/CocoaSecurity.h @@ -1,9 +1,16 @@ -// -// CocoaSecurity.h -// -// Created by Kelp on 12/5/12. -// Copyright (c) 2012 Kelp http://kelp.phate.org/ -// +/* + CocoaSecurity 1.0.1 + + Created by Kelp on 12/5/12. + Copyright (c) 2012 Kelp http://kelp.phate.org/ + MIT License + + CocoaSecurity is core. It provides AES encrypt, AES decrypt, Hash(MD5, HmacMD5, SHA1~SHA512, HmacSHA1~HmacSHA512) messages. + + 1.0.1 2012-05-15 + update ARC version + +*/ #import #import diff --git a/CocoaSecurity/CocoaSecurity.m b/CocoaSecurity/CocoaSecurity.m index b0475e6..888f5d7 100644 --- a/CocoaSecurity/CocoaSecurity.m +++ b/CocoaSecurity/CocoaSecurity.m @@ -3,6 +3,7 @@ // // Created by Kelp on 12/5/12. // Copyright (c) 2012 Kelp http://kelp.phate.org/ +// MIT License // #import "CocoaSecurity.h" @@ -26,7 +27,9 @@ CocoaSecurityDecoder *decoder = [[CocoaSecurityDecoder alloc] init]; NSData *aesKey = [decoder hex:key]; NSData *aesIv = [decoder hex:iv]; +#if !__has_feature(objc_arc) [decoder release]; +#endif return [self aesEncrypt:data key:aesKey iv:aesIv]; } @@ -64,9 +67,13 @@ [data length], buffer, bufferSize, - &encryptedSize); + &encryptedSize); if (cryptStatus == kCCSuccess) { +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:buffer length:encryptedSize]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:buffer length:encryptedSize] autorelease]; +#endif free(buffer); return result; @@ -94,13 +101,19 @@ CocoaSecurityDecoder *decoder = [[CocoaSecurityDecoder alloc] init]; NSData *aesKey = [decoder hex:key]; NSData *aesIv = [decoder hex:iv]; +#if !__has_feature(objc_arc) [decoder release]; +#endif return [self aesDecryptWithBase64:data key:aesKey iv:aesIv]; } - (CocoaSecurityResult *)aesDecryptWithBase64:(NSString *)data key:(NSData *)key iv:(NSData *)iv { +#if __has_feature(objc_arc) + CocoaSecurityDecoder *decoder = [[CocoaSecurityDecoder alloc] init]; +#else CocoaSecurityDecoder *decoder = [[[CocoaSecurityDecoder alloc] init] autorelease]; +#endif return [self aesDecryptWithData:[decoder base64:data] key:key iv:iv]; } @@ -134,9 +147,13 @@ [data length], buffer, bufferSize, - &encryptedSize); + &encryptedSize); if (cryptStatus == kCCSuccess) { +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:buffer length:encryptedSize]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:buffer length:encryptedSize] autorelease]; +#endif free(buffer); return result; @@ -160,7 +177,11 @@ digest = malloc(CC_MD5_DIGEST_LENGTH); CC_MD5([hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH] autorelease]; +#endif free(digest); return result; @@ -177,7 +198,11 @@ const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; CCHmac(kCCHmacAlgMD5, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_MD5_DIGEST_LENGTH] autorelease]; +#endif free(digest); cKey = nil; @@ -195,7 +220,11 @@ digest = malloc(CC_SHA1_DIGEST_LENGTH); CC_SHA1([hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH] autorelease]; +#endif free(digest); return result; @@ -211,7 +240,11 @@ digest = malloc(CC_SHA224_DIGEST_LENGTH); CC_SHA224([hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA224_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA224_DIGEST_LENGTH] autorelease]; +#endif free(digest); return result; @@ -227,7 +260,11 @@ digest = malloc(CC_SHA256_DIGEST_LENGTH); CC_SHA256([hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH] autorelease]; +#endif free(digest); return result; @@ -243,7 +280,11 @@ digest = malloc(CC_SHA384_DIGEST_LENGTH); CC_SHA384([hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA384_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA384_DIGEST_LENGTH] autorelease]; +#endif free(digest); return result; @@ -259,7 +300,11 @@ digest = malloc(CC_SHA512_DIGEST_LENGTH); CC_SHA512([hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA512_DIGEST_LENGTH] autorelease]; +#endif free(digest); return result; @@ -277,7 +322,11 @@ const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA1_DIGEST_LENGTH] autorelease]; +#endif free(digest); cKey = nil; @@ -295,7 +344,11 @@ const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; CCHmac(kCCHmacAlgSHA224, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA224_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA224_DIGEST_LENGTH] autorelease]; +#endif free(digest); cKey = nil; @@ -313,7 +366,11 @@ const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA256_DIGEST_LENGTH] autorelease]; +#endif free(digest); cKey = nil; @@ -331,7 +388,11 @@ const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; CCHmac(kCCHmacAlgSHA384, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA384_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA384_DIGEST_LENGTH] autorelease]; +#endif free(digest); cKey = nil; @@ -349,7 +410,11 @@ const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding]; CCHmac(kCCHmacAlgSHA512, cKey, strlen(cKey), [hashData bytes], [hashData length], digest); +#if __has_feature(objc_arc) + CocoaSecurityResult *result = [[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA512_DIGEST_LENGTH]; +#else CocoaSecurityResult *result = [[[CocoaSecurityResult alloc] initWithBytes:digest length:CC_SHA512_DIGEST_LENGTH] autorelease]; +#endif free(digest); cKey = nil; @@ -376,7 +441,11 @@ // convert CocoaSecurityResult to UTF8 string - (NSString *)utf8String { +#if __has_feature(objc_arc) + NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +#else NSString *result = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; +#endif return result; } @@ -385,13 +454,21 @@ // convert CocoaSecurityResult to HEX string - (NSString *)hex { +#if __has_feature(objc_arc) + CocoaSecurityEncoder *encoder = [[CocoaSecurityEncoder alloc] init]; +#else CocoaSecurityEncoder *encoder = [[[CocoaSecurityEncoder alloc] init] autorelease]; +#endif return [encoder hex:data useLower:false]; } - (NSString *)hexLower { +#if __has_feature(objc_arc) + CocoaSecurityEncoder *encoder = [[CocoaSecurityEncoder alloc] init]; +#else CocoaSecurityEncoder *encoder = [[[CocoaSecurityEncoder alloc] init] autorelease]; +#endif return [encoder hex:data useLower:true]; } @@ -400,7 +477,11 @@ // convert CocoaSecurityResult to Base64 string - (NSString *)base64 { +#if __has_feature(objc_arc) + CocoaSecurityEncoder *encoder = [[CocoaSecurityEncoder alloc] init]; +#else CocoaSecurityEncoder *encoder = [[[CocoaSecurityEncoder alloc] init] autorelease]; +#endif return [encoder base64:data]; } @@ -416,7 +497,11 @@ { // base on GTMBase64 NSString *result = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding]; +#if __has_feature(objc_arc) + return result; +#else return [result autorelease]; +#endif } // convert NSData to hex string @@ -464,7 +549,11 @@ { // base on GTMBase64 NSData *result = [[NSData alloc] initWithData:[GTMBase64 decodeString:data]]; +#if __has_feature(objc_arc) + return result; +#else return [result autorelease]; +#endif } - (NSData *)hex: (NSString *)data diff --git a/CocoaSecurity/GTMBase64/CocoaSecurity-GTMBase64.m b/CocoaSecurity/GTMBase64/CocoaSecurity-GTMBase64.m index cb1a0c9..aeaf5d2 100644 --- a/CocoaSecurity/GTMBase64/CocoaSecurity-GTMBase64.m +++ b/CocoaSecurity/GTMBase64/CocoaSecurity-GTMBase64.m @@ -283,8 +283,13 @@ GTM_INLINE NSUInteger GuessDecodedLength(NSUInteger srcLen) { charset:kBase64EncodeChars padded:YES]; if (converted) { - result = [[[NSString alloc] initWithData:converted +#if __has_feature(objc_arc) + result = [[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding]; +#else + result = [[[NSString alloc] initWithData:converted encoding:NSASCIIStringEncoding] autorelease]; +#endif } return result; } @@ -296,8 +301,13 @@ GTM_INLINE NSUInteger GuessDecodedLength(NSUInteger srcLen) { charset:kBase64EncodeChars padded:YES]; if (converted) { - result = [[[NSString alloc] initWithData:converted +#if __has_feature(objc_arc) + result = [[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding]; +#else + result = [[[NSString alloc] initWithData:converted encoding:NSASCIIStringEncoding] autorelease]; +#endif } return result; } @@ -362,8 +372,13 @@ GTM_INLINE NSUInteger GuessDecodedLength(NSUInteger srcLen) { charset:kWebSafeBase64EncodeChars padded:padded]; if (converted) { - result = [[[NSString alloc] initWithData:converted +#if __has_feature(objc_arc) + result = [[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding]; +#else + result = [[[NSString alloc] initWithData:converted encoding:NSASCIIStringEncoding] autorelease]; +#endif } return result; } @@ -377,8 +392,13 @@ GTM_INLINE NSUInteger GuessDecodedLength(NSUInteger srcLen) { charset:kWebSafeBase64EncodeChars padded:padded]; if (converted) { - result = [[[NSString alloc] initWithData:converted +#if __has_feature(objc_arc) + result = [[NSString alloc] initWithData:converted + encoding:NSASCIIStringEncoding]; +#else + result = [[[NSString alloc] initWithData:converted encoding:NSASCIIStringEncoding] autorelease]; +#endif } return result; } diff --git a/CocoaSecurityTests/CocoaSecurityTests.m b/CocoaSecurityTests/CocoaSecurityTests.m index a905ff1..1150da0 100644 --- a/CocoaSecurityTests/CocoaSecurityTests.m +++ b/CocoaSecurityTests/CocoaSecurityTests.m @@ -26,8 +26,8 @@ - (void)testEncodeDecode { - CocoaSecurityDecoder *decoder = [[[CocoaSecurityDecoder alloc] init] autorelease]; - CocoaSecurityEncoder *encoder = [[[CocoaSecurityEncoder alloc] init] autorelease]; + CocoaSecurityDecoder *decoder = [[CocoaSecurityDecoder alloc] init]; + CocoaSecurityEncoder *encoder = [[CocoaSecurityEncoder alloc] init]; // HEX STAssertEqualObjects([encoder hex:[decoder hex:@"CC0A69779E15780ADAE46C45EB451A23"] useLower:false], @@ -39,8 +39,8 @@ - (void)testAES { - CocoaSecurity *cs = [[[CocoaSecurity alloc] init] autorelease]; - CocoaSecurityDecoder *decoder = [[[CocoaSecurityDecoder alloc] init] autorelease]; + CocoaSecurity *cs = [[CocoaSecurity alloc] init]; + CocoaSecurityDecoder *decoder = [[CocoaSecurityDecoder alloc] init]; // AES128 CocoaSecurityResult *aes128 = [cs aesEncryptWithData:[@"kelp" dataUsingEncoding:NSUTF8StringEncoding] @@ -78,7 +78,7 @@ - (void)testMD5 { - CocoaSecurity *cs = [[[CocoaSecurity alloc] init] autorelease]; + CocoaSecurity *cs = [[CocoaSecurity alloc] init]; CocoaSecurityResult *md5Result = [cs md5:@"kelp"]; CocoaSecurityResult *hmacMd5Result = [cs hmacMd5:@"kelp" hmacKey:@"key"]; @@ -93,7 +93,7 @@ - (void)testSHA { - CocoaSecurity *cs = [[[CocoaSecurity alloc] init] autorelease]; + CocoaSecurity *cs = [[CocoaSecurity alloc] init]; CocoaSecurityResult *sha1Result = [cs sha1:@"kelp"]; CocoaSecurityResult *sha224Result = [cs sha224:@"kelp"]; CocoaSecurityResult *sha256Result = [cs sha256:@"kelp"]; diff --git a/README.md b/README.md index d8b38e9..129f614 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -##CocoaSecurity 1.0 +#CocoaSecurity 1.0.1 Kelp http://kelp.phate.org/
MIT License
@@ -7,7 +7,7 @@ Apache Licence 2.0: GTMBase64 by Google Inc. CocoaSecurity include 4 classes, **CocoaSecurity**, **CocoaSecurityResult**, **CocoaSecurityEncoder** and **CocoaSecurityDecoder**. -###CocoaSecurity +##CocoaSecurity CocoaSecurity is core. It provides AES encrypt, AES decrypt, Hash(MD5, HmacMD5, SHA1~SHA512, HmacSHA1~HmacSHA512) messages.

**MD5:** @@ -52,7 +52,7 @@ CocoaSecurityResult *aes256Decrypt = [cs aesDecryptWithBase64:@"WQYg5qvcGyCBY3IF ``` -###CocoaSecurityResult +##CocoaSecurityResult CocoaSecurityResult is the result class of CocoaSecurity. It provides convert result data to NSData, NSString, HEX string, Base64 string. ```objective-c @@ -64,7 +64,7 @@ CocoaSecurityResult is the result class of CocoaSecurity. It provides convert re ``` -###CocoaSecurityEncoder +##CocoaSecurityEncoder CocoaSecurityEncoder provides convert NSData to HEX string, Base64 string. ```objective-c @@ -80,7 +80,7 @@ NSString *str2 = [encoder base64:[@"kelp" dataUsingEncoding:NSUTF8StringEncoding // str2 = 'a2VscA==' ``` -###CocoaSecurityDecoder +##CocoaSecurityDecoder CocoaSecurityEncoder provides convert HEX string or Base64 string to NSData. ```objective-c diff --git a/iOS View/CocoaSecurityAppDelegate.m b/iOS View/CocoaSecurityAppDelegate.m index 46b1ed2..e6df9d6 100644 --- a/iOS View/CocoaSecurityAppDelegate.m +++ b/iOS View/CocoaSecurityAppDelegate.m @@ -14,8 +14,8 @@ - (void)dealloc { - [_window release]; - [super dealloc]; + //[_window release]; + //[super dealloc]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions