From 4912a7ef9e762436bf5d4d3d4f1a1b7b91d467bb Mon Sep 17 00:00:00 2001 From: Nathaniel McCallum Date: Wed, 3 Jul 2013 19:48:33 -0400 Subject: [PATCH] Initial commit --- .classpath | 9 + .gitignore | 2 + .project | 33 + .settings/org.eclipse.jdt.core.prefs | 4 + AndroidManifest.xml | 47 ++ ic_launcher-web.png | Bin 0 -> 38248 bytes logo.svg | 770 ++++++++++++++++++ proguard-project.txt | 20 + project.properties | 14 + res/drawable-hdpi/delete.png | Bin 0 -> 1624 bytes res/drawable-hdpi/generate.png | Bin 0 -> 1939 bytes res/drawable-hdpi/ic_launcher.png | Bin 0 -> 4143 bytes res/drawable-hdpi/scan.png | Bin 0 -> 1673 bytes res/drawable-mdpi/delete.png | Bin 0 -> 1359 bytes res/drawable-mdpi/generate.png | Bin 0 -> 1567 bytes res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2725 bytes res/drawable-mdpi/scan.png | Bin 0 -> 1421 bytes res/drawable-xhdpi/delete.png | Bin 0 -> 1848 bytes res/drawable-xhdpi/generate.png | Bin 0 -> 2332 bytes res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 5943 bytes res/drawable-xhdpi/scan.png | Bin 0 -> 1926 bytes res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 9092 bytes res/layout/common.xml | 64 ++ res/layout/hotp.xml | 48 ++ res/layout/totp.xml | 48 ++ res/menu/main.xml | 31 + res/values-v11/styles.xml | 11 + res/values-v14/styles.xml | 12 + res/values/strings.xml | 8 + res/values/styles.xml | 20 + .../apps/authenticator/Base32String.java | 161 ++++ .../freeotp/CircleProgressBar.java | 76 ++ .../fedorahosted/freeotp/MainActivity.java | 78 ++ src/org/fedorahosted/freeotp/Token.java | 292 +++++++ .../fedorahosted/freeotp/TokenAdapter.java | 204 +++++ 35 files changed, 1952 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 AndroidManifest.xml create mode 100644 ic_launcher-web.png create mode 100644 logo.svg create mode 100644 proguard-project.txt create mode 100644 project.properties create mode 100755 res/drawable-hdpi/delete.png create mode 100755 res/drawable-hdpi/generate.png create mode 100644 res/drawable-hdpi/ic_launcher.png create mode 100644 res/drawable-hdpi/scan.png create mode 100755 res/drawable-mdpi/delete.png create mode 100755 res/drawable-mdpi/generate.png create mode 100644 res/drawable-mdpi/ic_launcher.png create mode 100644 res/drawable-mdpi/scan.png create mode 100755 res/drawable-xhdpi/delete.png create mode 100755 res/drawable-xhdpi/generate.png create mode 100644 res/drawable-xhdpi/ic_launcher.png create mode 100644 res/drawable-xhdpi/scan.png create mode 100644 res/drawable-xxhdpi/ic_launcher.png create mode 100644 res/layout/common.xml create mode 100644 res/layout/hotp.xml create mode 100644 res/layout/totp.xml create mode 100644 res/menu/main.xml create mode 100644 res/values-v11/styles.xml create mode 100644 res/values-v14/styles.xml create mode 100644 res/values/strings.xml create mode 100644 res/values/styles.xml create mode 100644 src/com/google/android/apps/authenticator/Base32String.java create mode 100644 src/org/fedorahosted/freeotp/CircleProgressBar.java create mode 100644 src/org/fedorahosted/freeotp/MainActivity.java create mode 100644 src/org/fedorahosted/freeotp/Token.java create mode 100644 src/org/fedorahosted/freeotp/TokenAdapter.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..7bc01d9 --- /dev/null +++ b/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e614fbb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin +gen diff --git a/.project b/.project new file mode 100644 index 0000000..7ddaa7b --- /dev/null +++ b/.project @@ -0,0 +1,33 @@ + + + FreeOTP + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..b080d2d --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..5b597b4 --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + diff --git a/ic_launcher-web.png b/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3877906ececbd6141d0196588887e2964a84cb GIT binary patch literal 38248 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 Y72P-dK^plnR4@^DS09(VPGP721L76ZhyVZp literal 0 HcmV?d00001 diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..7b0b97e --- /dev/null +++ b/logo.svg @@ -0,0 +1,770 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + t + p + o + + + diff --git a/proguard-project.txt b/proguard-project.txt new file mode 100644 index 0000000..f2fe155 --- /dev/null +++ b/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/project.properties b/project.properties new file mode 100644 index 0000000..a3ee5ab --- /dev/null +++ b/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-17 diff --git a/res/drawable-hdpi/delete.png b/res/drawable-hdpi/delete.png new file mode 100755 index 0000000000000000000000000000000000000000..e9ce89e0460b368de996f6b1d7ee149ae5fb1315 GIT binary patch literal 1624 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip$=JZnz{SMW$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19ytk=TD+111qr(RHE$SnZc?2=lPS(cjOR+OKs0QR(1 zCT_PF;WQ7bHwCL(!2U4CsaGH97=2LGB1JV!2$+6AOnAZta^OinH4m8Hi+~B+%vbIe z0|V13PZ!6Kid%1H?#{d7Akt=gFXxa}LsLURu0o7zi^jA`<_i`+W?Zm*$s@~*%NH+R zXvlc6{oy5tLrPp7J3JkH%r++T{}ohGWQnO{QGEW{Jdi7HLD-f z+p}1=Fhw!`pV?5iKfX+p<@rIo34TA$YW)aEOEHiL`ILU_VbUB%^8@Q9y`J^Gn(bXv zuDCg`ESCj0pLF-4;}-W>pZ|E7vZIDc(%!zfHJLN8PF=B-GiJU(Trc;9k_zTMvc)a5QEt0Y)$g(v$yFCgT?QxCiS=hvNQAb?{wZXE^IeT%-r3ZrgJKc zyVK&hg_vM4!<| z7sK0JLlV^|7eqgB)M$NBJD({@ZSk5rnd_3m76!a7sPl4~Et?_5c)#NCrsf=V?u2uJ zTW)3;itq67iswChBGuC;T6sQ`nT)xbX0F+-ATy&J)-}eBu~(eCwq2{`@{m) zD~{#lSYCLj%tQV*@4p)6@Y0fu&^BP&THD}u+@Fz+;rN|9?#>?y0zqZHr>mdKI;Vst0H|?TumAu6 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/generate.png b/res/drawable-hdpi/generate.png new file mode 100755 index 0000000000000000000000000000000000000000..0f3ceec7cf7777190076701723d9b1162989b8a5 GIT binary patch literal 1939 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/scan.png b/res/drawable-hdpi/scan.png new file mode 100644 index 0000000000000000000000000000000000000000..593b163c7090097f997ece44e2454b433ccb0a78 GIT binary patch literal 1673 zcmaJ?Yfuwc6kY-bjL?cjc~xB(!Ge(Nh5%+E@=7AH1`%Qjh)PHnvSPB!W-$S=Mi>iK z7{@w_2$YUm>kF$z+gL0nl<|Qx;)r(efx{FP9~45VucEaZ1lk{^JF|Q5J#)VAeCM8T zWFn9<>7h}G}wF|0&$H9 zN{^7kaxxLq;z`96mR6jsP#5Q`g&HV!F&JY)83G+ft3Z=(z21PDM9?TN%IqCs9t4i2 z(D@?hohYR|1xzF;42!q2v2?5!a}q&XnkG>m&uBDqjp1B^%HttIp^yjjd3=5tlM!Yp($gwanBEXD&LGAN zY6>T5oX~>~MpX_`NQ)pw>AMzmU0y?209h{ zNAG_U8x%z(#!JNvL?NYS2A3P)C`F=)6sDpHNJ`laClOz!wfo-sVv4Qd;_MDQiKj1Z5qWV*CL*jZw#xMR104+DVE2G z;Wo76UJo@6V}J{jNd87*n8U8y8wVSA`{0eOt<@MKGxny@%n6+EDvp2 zI`oDWFFpuz^jU|e86mEhrzAehZS^B5Sz_LP)Z*2)JKEEGf6oP|;-i;wo_D?C6~`;I z$4UonD4zH0<{ocubz99rnVxmlzG7d^7sCx3JD&dXJf@?4I3z>3cB?tTIzK(V^=ig@ zd(0uE&DG9%efdW-mc3Bv`Vgq?*lb?VgZgaim26<)^nyihxn*qax@M?(g=@8~2;Ld! zG-8`Kr@Ek_`%6v?=P5hgCTke<6DB;hIr)9F@r=9F1{$-cJ(?12g)Q1**N~nW%BdGl zcYJ7{_D5OYwyq|x;hFucfS}GtekUQYxnk%0GkY-+(BX4;*edNT%-&74JPW*tpL)LD zZ|@bL`h12i)2ylc#G2>fr*v+zCXl7iRCO$Gan(gjsii)k?V2b%T)n@%HFUsy;07mv z_38JB^+3g(zXsMtR!Zex7fkiZ0q!^z*q4ht`_7u)Zhh=ya=*8PtSEWwZ&7DjBLk1o zS!Gr)(&JoYa9ruI&ri2Fs@Lvzw=DQp)wZD}dpWh4Lm^0~X=zqh|CalGa&li){mxwO zB~x(f3%o0HmWAI`d8H_BpT$3@ZwuJ_KzVmcd2qI;vYi#wWR12*YL2(HIR94p?Wv+G z_mhtJuYFi_fdW!1xj*%Ac=TBryCChz$-v@Gih8}7vN$(1x;G}fB(1E!O26`~+y1yatnp^@vbeA#?%Ja>%2(G~H`rGVTYk>>sky#} z3Nf4xT}kv=1umE5-N4I%;alFhU#)3aRmC5y{PVg`@Y^2-w)D17A56c*-t;8y@{^uf zcOqZMez!1GLj^ke^2JuZ{B#F?yS>(|;2z{S%{~|Vdt=rt7eUue=^R9!JFnm#8~z~X o!MVDHPLk=~ERGX${5;DYI5cwSI=d_#ar_))l4S9TgzVD40m1ouPXGV_ literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/delete.png b/res/drawable-mdpi/delete.png new file mode 100755 index 0000000000000000000000000000000000000000..cedb1085b85cf28fec0152168da61defb93fd6fa GIT binary patch literal 1359 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s00+w{G(#^lGsVip$->3i)zr|`$-u?X(ACh=#L&{!#L3yw z&D7A`#K{n**Cju>G&eP`1g19yq1OnfUQlAlEdbi=l3J8mmYU*Ll%J~r_Ow+dPPdr2 z;WQ7bHwCv_3~=hz2RcR{6tzfE4HE*U9}p9saDg0n(of9;ruQOX!d}0Wsg!|%@t~)R zV@SoVH`6zIF*^#hy?=C6g-guwsFP#h8kgDHTg9ZM<&U^+5L)9>BXHj#C&z`mTO&zx zT9ae*f(6sxsFwfZ-v2N{FC{-;wN>(m#iln#|IeK}mvhIWZ?0q1LCFogtQCLNe(YP% z=i4ayK#Yce2gqtnB)xR0HN`4y-a-l?twJ8cGA$`yVt0o>EPi&ZH#tDLU}k$&Few z*s>G4nfyL+MJx%P_$Xj2-$b)hTX*(9n3O1+e&R7pR^E~c6XKJCfxTz9hNZ&+UUN8KCg4=bPQ&9;3uO;UDdhwy^~Z4DE2 zHavK7t*grZ`7S1c&zvGKR= zFt4=+eGLWz3OQwmFFfFIn$5(-%-HD5c*vn)gKokC%MZsM1-(%|@>Hfjd(B?X{D|A; zKVE1A*UTx9+30>ksOG5YHI@_Z$1HawOkcgpd77|)(ae(fyKEOoZ+cjNxL*H(djlf_ XdqiO|XOH7mP!Z?p>gTe~DWM4f=>_8H literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/generate.png b/res/drawable-mdpi/generate.png new file mode 100755 index 0000000000000000000000000000000000000000..ca28ba39cc90472e847183416875762abcb3164f GIT binary patch literal 1567 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/delete.png b/res/drawable-xhdpi/delete.png new file mode 100755 index 0000000000000000000000000000000000000000..98c73da1f35b06932d1a76de6468afb2768998d4 GIT binary patch literal 1848 zcmaJ?X;c$e7!430Q7Iq-qE?2WC|fcU6CsfZSpWkB5h8|CDMK6uuGVt(JlY^Hm)M)k3>q-#f~WCl zpOTVEq5vU^Apn~W`pUtX5HOQPhgcwo#qj}{AOtcXCIj^Ig+MObj|)P;=Z8i_!xYKf zXi>=LSj34(OT}>wm%-5KbadSeI*O$*AP$Ga0GSLX)0gn@)n=-3SnsRWx(_jk5Um_j zYH%g0226}_5}JYYXhf!;N>FKrY1P`#Z6X@R(8C%AL|&4SQ?xXyi-2 z|4FQsW@->dG@?Z_FgY=}WOq|24OfUEFpgqU6ipxMVpJ-MquNwd0|;Z-bO?~Za;4g2 z8AM1VT(Me*XsyHh$;Ub!M~mxm@dIcH_wQ&GUlo*REN8ZQG4iS*pV> z_uN_wGQ^uD%vnW>luoy}+7ewyO7Ht^McnP$AA5Rhjeg;VsSRTjsRzkZ>MBB?ltxV# zWvX^)FoU=q$Z~rniC%NAOHWYo`+B2q!ZQ8gyq8#jryz%x6=XaQ^$RL98W$GWC0O1zdK;VcYRPD`TIxzaYBjIp z-JIhr6Ffilz+%aAqsIDKM!e^y z8ZKOtPLUH=m9zOfYPk-8N=x(9zbKusxh`|F!iSv-er-q#ls= zP`xO22?HLm4rtEg6{g#C&N?dGeZ{FHNZ4?jnh@HoPJA>|UK_vR^y7jpd3}dM zzdsUIJgM}ZSM0%2=I7()o$wfw<5;&WEM}b!@cv_3<&|FYGyDDaE$*jN%v)M6OmpSO zxmflnGWR;|bcl@rg36ECQs+`rD0}RkEM1muywk(CvYnp|BPDG<3+9O|o4V&3ZTC8@ z4>O)MbeJ={i}PL{*08(U)$}WmyN$cvzAqA!FZxJ&-X-<- zj~k~c(_2Qixs(Rhc~2QgwVb3}IR9wnCW99xbxHf1Fk8>+qq#0piF;6U1hpf((0qDT z-463;_vU8NZvM>==gce;mb*_S_T%l9aF=-9Be<8HzQk@=+wP4{c3HUycE zb+zKH_imW6(Xi<}D67qHBj0)=MOTB;)azT{8ypJcP4zDDxvZT|^d=d%i*DhP2BPM(3e|qe(Q^`q83+L?mTpxFbvQVS* z+Z{+rJlsMFUzku0KOD%vWL7eYqcwIsIVm`dj z5H}E2SR7$!zIxB%B;|r^z(0KZ)4sgsNjcqR-P4&?YE_X5+*pt_*;U*3(dO2ow!!NnGxsseSA8UpCnefGaLNVRzcKyG N#KDoG{er|5{{R}rz~}$~ literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/generate.png b/res/drawable-xhdpi/generate.png new file mode 100755 index 0000000000000000000000000000000000000000..a80b9ab47b92cf696a51b612bca8451c5e6f8049 GIT binary patch literal 2332 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 Z{|}C=R^SW`Vvhg-002ovPDHLkV1k}(pQr!; literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/scan.png b/res/drawable-xhdpi/scan.png new file mode 100644 index 0000000000000000000000000000000000000000..e61a09f5e85c3af92b7c434c110dfd9cea928731 GIT binary patch literal 1926 zcmaJ?X;2eM6rLaf7EvRYD2ihgErA>Z36Mx6kOU19%tC~KSH@%{5t9j%K?1TGz?0P~ z%Tna>DABS66&1Wzj-Y}iqVb?a(Opnj1fjrdS15Gdi2}PnmYuGd?tb;Y?|rY|>zdut z=p~aJXE*`?FiE^r7(>i_>+4`gd`mSczY)`PTqMV1(e-#5j3Gdn3SEbQVlAA6#2~OL zJ>?D(0ss@{X=HL-E{WnQQ7s*|`p}J9J%I**kWix@Rwg4jxDH9u=y=qD>$Ox+qvBEH z*%GEiFF@3qr5P9!n-MKjW+W>)Dr)FrFvQ3u2($yNMD6?dxUBP7$!C)d^Pd$&3_EcYTiW?fiG`xeFLx_2iG8^*KLeFpVkK zJW42OQ{9@cZZ|>nhgVev;)bu#R|OQ6X35tjm7bcNc_N_t!5_7ypVq9nbTIOyj8o+1 zNEsVa*D{+}v!C={+YWwEH#s!NhdIUo@at7Kx)PV^mQ9CPNSpGcWz=b)Dz1uu2v&gjh zj$l^5lbmmPp0MZj?CdSfqt)IdA2aZj>{T?M@3Qvup=BN3Z)THP2A``Y7o<9Ea}Maw zKFoR55W4c#>xSjzqSe%EB2r>y!_PkTAm+&Wh==g^z=my({Dv6~dSEpw8CB+{E`b!eHAM4avEyGkx>(Qgxm=@cyq0 zrh9Iv%D9tnaa-F|KOE_s)hqv4Y=4xKIiu%GQ$R#QV0;m1YOHwoi^CvY+Jd>alY*)uC!UD$#EZ^@ue#C;TDFoH=9s)oH}~`x><@0(eAE=D zf7l^=Qv~RgHQ5z4)$Q&JA}dv(1t z|4Fx}ymH>9kKP@hi{nZ@4T5IMV|AC@O<*eUsg7?slv>;OE4yMBblydGG?Q70B8*4eZH+JZP&bz`39iWZ&=S7iSUEVc4* literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_launcher.png b/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d01e9b63481ee535855f94c380a72252f2443c43 GIT binary patch literal 9092 zcmX9^1ymeOv&A()a9P|vL4)g}!GpWQ;_mK?ySqEV-Q696dmu<~hw%3M-<+MDv(wYn zx9Z-i-kBb-l7bW(3K0qv6cn0_G*AU{jQ?*(LV$c9OYXNp4sgz5GO9?B%?HUe0`eQ# zL0Zch3JOs7-wv%$lt2tQN$4V>>GH$g+{N9<$qdTf-JKO=XYFia|G{@GI6L(`eQP&++Z9xMws}ZfCBfVTeHJ)l7uP<=jl(n`kI}@Fvz5!zcN|a_ z&Z;(khfxh9s~w6ZG+(D+mJI4~FHD&Azas=8-zTNp#?YTt1nms@)+gr=O)$Nv zZ=9>B7Ob<0c!~UEZnzxZ;Ne`{ymfVPV;w_VhXaM-{vARLs>aGOdD&S)ySjO6OQRl} zRO|9M6GHhtLz<2o%~rkk!*G-=S}m|advBkr@Mm;;P<(zv+UA*?TUpx*;Fi`dKnOyp zZ_I`h{Zy2Fm(c#MPfCr6!4FZf05K5=dfJ77XP$P<8QmGEUKa>RYfle#(X~044$ABu zXusGuBnwsp7{4=!$qE<&{x3Gt{~;l2XUrC>qePUBYwdA>*i$#uX_yJaf&eLlezNbI z{o%1Ub!5AX9ge|8#?(ZyW-5+U-nj8&R&7rc#b!puvQHSQ*BR2UcW%Tq*p(%J#!it0 z;sDGrOLn_Q;0{8M2L#EBFLd<}Xg$msd+1&yO;np1Z5}bN7Prc|u>Vb_%O(<(DB#P<+Si&PR}2f9MpJPV6u{!Mr7(t-SOAs<>;;cgI)4Zj zPtd(i5Nxd|wqwRPp#cz_d#HYu_036>%;antm@}Py# zl1;0&rk9N#Y)MAzdSoj+gvXOps9@0m(*Qm4i9pEed zmH}(iDBe1Bpz;W8<=1&>WyY=k_|=*E$>y_uKn_he&5czLSvK~6eoX`z(6HoYBU_}B z+>8FT$+#D~DO_C}n&ue}-@cdp7m=X@ct5wwr6`%+UDc;4QG_+bv#N+El~|PZco!on z`d9cU31xubcMB2kxR2o1s{cf7K*5rIQ_a-{hahtR>yCkiy-i-6tNY+3^K%~u!x;Np zf)ZSG7>?*YJ*Mryfx3V|ClDFU!i8=w<6h0=@|e}UcM^z!1OH81D>;esoULOI??8OCi)Hz+s@zxhzX&VnKU)260rz z-P-=}hQj)PSrgLaAS9j}%JKcx?i=^_2*P{ML@zhN)(9~BA5z(&9J#QmE?&*=Jo*uH zr)ovcTmjQ*QHa&DA{rsL47;m=kv4!7WZK|~?yRz3s<<@OxwQGDlVjK{VR~JmPS<{> z!vppG+5$aXb;uWW}7e?kp{26O)G+hU1A`1BnpQjTZUn62`Bi(SH5 zBKfCRSip<<$o3e;wpjZe`Fu!*#w!4+wvN@Bro3+l=Hneg#+)`l=UVaXsOay-c7~<0 zg$}JLxPP1-N3D-`J4nK2tSu&jyRU5_rk`^v?ws^@i==R&(i7S-GiAayvPW6t#x1tB zt<5m$*z)`%{4TzB<^=ZZrJVu+nz4TAAEsfWgtbo3$d?-eqk92S*XOn62HQw}`ZV;< z(ONw0b0YM)HJmSn`!u^rkm{6YFg;C(iqvQLdCgmDaH(ZwLUtjNm7dGYk+j_wM^q^z z@wI^uz=4FGZ459k$W0nlyNgRJIs=%8`{NNlIqzaX(mdAO>7Y_FJhIU7?n!#Oafj^l z!2HswWR;dFqvcUJtSfyaF!Tj~k^1klcl@#( zgV#9c*mv-vfI#$7%pjSv2zmJyGJV zu@{p|lTT{oK8bU=byP6a@wC06%Pi>%sqS_3m0rIKEo`i*@jfn6bbD1v`l6+&arJrF zf2nF5M38N+VsU4E;##xf{}I+jBZpwK+3Ff3dHf14h0||W8ZH0QP4P1EEUBwz^k9ei zQ@V!GyXdD|Y}?;{kZ=0KmW%?LhO?aw$bLzMR*VJ46>XRF+7H46%hgy>d#5YF4f8Gf|ee|hLMupKFxhPoh+Zv0mzBWGV z-?)xY&vS3~ zk`AfT9tH;85m3YR*w9QX{gIyJY%Fw&@D9EBfq_go8K3r zezC-%pubrxq07Y$kTgb{fjG${dhY?rLq@v+2GSvN?F2QFB2f`#6SyWatVM*nPIZwX ziY-a7!?zQ>nP^o9Kjtsr;n@7?o%~D}yu&L&-&t&MXJDs~8b%G+*hvq2Ix`V;vT|5( z`q$@m_Zh%xv$I}BowXiC_#8Kqj<)F`5BBN9+SKRt6?28&PJBd0_n#V0idN8@$k_dNP+dK5 z;)LE*B%vWK4PrHt1wo8|9K(Fww%gJhdBaH+sb@Pz>AunYxXHEomiuUHZa{AL`rpRMy=1cI(CL{RgdcagUXj6NhxL7LUS0;s`z8TG(Uvua;fO3@3q*} zYW^8w}btM&Uh`^W?jn`&t4QMa~)TDSnVzVlbCZkkS(*|Pj7OmH!! z(Bs4~30gDFBI08+b&O<1ef$G6kQuZ)>^yB#i|#yY4qau03Vne%)VvqH(Ew(h7w_ls5$!vz8~AKjT?N0g9bm{k!_@j% z5aEXgkaxS?jezG#j#(8(Nd@QD4Nkw}>$RrF)5PjmAG~=)3bLr5PM*a#(<8rA%J`y4 zV8Fs88uruku%R^n3c(XGwCo63q)G{C1Yluhp~H=icJ;7imf})(m0H4ae&A+AgTw2AD*6QFeIvBH; zgr@V4h%7m=W1O6Vy|Sw7cW%H;av}B{Gyay)>YSyLx5H&=lKg!MKf^$Ck>x_)_@1l+ zx&|efPf|vFQB-+2d#Vyj5G%@nH212d*woXSl{B6~f{7eTOMMvM-{X0v5@lnl2vJ+y zJgI=brzup43tDY5X9RnEX>M*v)mI>4GrKXoI>{9wXv9o!+yYdPFz9(AILj^e`@Zaf&Z*ix#ZylU@JvodqKhSLy?xRORvGy12S7 zb#~4$hW2l6N_Zo&J!uIt`Mg16e1GrNK@MH#Z@HQ z)jY>NohUcHm@8v1L5*kd<0@{AAiv<8V7cV@t1KoE6HXbps_H_5vpfO3QW$~tmSJpX z`P{k($2qy=;^OUo3A)JTC(>_swZ7LgtOBpD(~zgu>sgy>4CRERG+clHrQO}g&* z)b`dkx4+%PKH5}bOZ2Bq9{=gcO;5i*xQCZ*;!+qT`R!;|@qvea_9=!1L3TppVFC{N zG*dpp7)$NqfaQ@+x%u3GmKQ%>`R2!u7Zgdy%n4aoSFU{eUDSY8Zo@ z07bVo>^6H3P6A)cyfg1~Dn-Pg3NT@wp4zGqNga#e%*y(u%5R+V9aBkm z(;iVBHTwZ!?6QJ4SAm}J6`Ms}Cr0w3!=m~(EpD!}CSjvNEx-3EkyKZNEymHnBt3D(4Zp|73(GU@{QsOBJ*K8<&j|WCSP$7G{+$+U%oN4}$9h`Gno5kz_9^;4 zXW7*H<%Z!QTP&Yu;Yb8_NG7PB(ii=ExAbx|@SK68&Q~#b5ajN3$$g232L-ZjSmONZ zneKbAMKJfF?fGcPL&f(7PwJ${o=Yt{yN^haC%0W>Sj<{>x-AK{9zS$!^;N0@VuuHd zk``&es*Kjbcaq1L+EoUH^Je+g#ur}94ByDX$g<2ua0hEKZqsYVq80blct4^snzHb5 zW_1~vfI>GEsKW2q+^3A;mbFie+>1)JQ&|!MTf)yC?w5qq_|g9O>bWuminN3HVN&gf zgiJEU4H|z-3f|EE8>V789rqe4A~9f%QQ6AXqNMw5ea0&a$})Ll#%WgwR^8hC-OV{^ zh|X_jVq1`JIreg|iG)h8hTFZ^w7KW<6;{#b12I@iRbII9u36U9!6nFjlZs~E!+3g@ zwORi?Az5pyN!>qBGA&TW!i_&Xkv#`R>LCs=2@a?pVVlD~UvKX)i0_Ar>m8LFMXXWf zQBc-+Auf!6EmSZ`+C%KUnO>|(3wzsvt7Q_YD7UilFqRem#&d`y!OpnfOpbob)0x>b z_0VAtWyl@!YyQfW(RxTiFs?Q@dtq*A%3p~#DPryC@662Gv2lVi)ARu?yW*kxmY*{h z8=rjM%78r!9I^9PXd}Uw;>ym6WRI*JwHuJK^cI+OOgkfVeYL_6C9^KfcJNK%HMpf& zVVt5na#Q7*eVN9BO~<8>jj1rdp=i%KIk~vpHdA;xHcYLQPSqF_SN^-=JPS8?T@u-Q ze4>z?COCk)cFSajh7P8Iz`}B7Vc)_vWo-5%I@F?vR0^kOxcox~hozMgCSpjX)&HRL zIGEqwIlU26+vqc-Mi3YDdw$A7JI#!tXULgM%db5rFl#~Pwq@(?Ec_HNYZZ+)4jhDt zI_1w8x^V?jv`X^&0yedA*;W zRB0uZ>T;y&N=BVWz_WCstnck|Efbb10YIgV=UIq0=(~oIG8e}`OD44h=!w*dE>3`5 zvDKQM&ZK-O`<662p}|83cA1&JpS(G3N1imh9%7#rF@@*#r?f5X&E8q*4OsIbYZp^? zpg?|E`16uKtMRgy9tgN$rDVG50*xWq zF+ef=)NX|zuAE!x%hwo(mPBxy92|htjB`1) zuo@j*N&YL17-`aquqcr3dPehk)gqDJdE(~0YkF+UJ9;U#Cq6B7#D+>=rgYUcooJEZ zdP`Adrdl$nvP>|&M=qfNC`U(Jr;}6gJsul+T$`bPcR_T2KE0=~qODSk5VeUzh~fGz z>bB9H)ccnlSg#-C?Y#Veml(tx z3Mv?W{S6e8Qr6(6QsP8RDvRyI@La_AD!wi2GFdy`i8Eeb!i=I)nq>D`T z#HRwwz=@`}3OKN2Ru+vh&L8q!i!dyM$q5Ju^>jr#5VR38V3FGs9E|aI{8&So4K8b2 zn}{H@15kdP$@FJ|K2CY10%!GpRCO(JA~h}MP)YA7P*;2vzR+3`CPOOL?EqfIO5Q8G z5s9`jKzYK(p7wKZmgeRd#!kBMw&y+@Hmym7%H&#f4GZ;kd1NUe(vV(N$Byxx5j)E} z(V%FkWdkc6MGbEhVk9l#giLc2pg9GTn64$+PzuNZpC6rMO>}8#fyH+VU?sC3K7gMi zUkr!Oq(`{+WobHkIu^dVHR4zKBG*-k8xqlqcdCQ-77pb^>XV}!fJPIYSK&-wu;W9f zn3{n}8%nBFql#0)G{?Dul5&!vShtnvJ4{I6HU(3(#v+w7B)qfzIyO9IWt^N0X}g63 zCt7kX*Fsd9I}BzYVio!3klIOtA!*5rQ)xJ3e$V$`K3`1Ok1Y{biiGmpV$7xN z+(Q1*&5x{9lHw@g?fzV}$0TaF>Vn)AKQRoyg43r^dnF}Skf%(fX2hM%`Z5)B)_57^BJ{MDK#J`sBky2zY{dEB<`1Mzn=X5GfrHdYF_DaV5xdSuL| z_irCF#&PP4lQOPst=Sww{7x(Eemr!OHgkQU5yP?)w!Q@ zQhx5Y89SGr6eE{0707@pXL(hW8yPBO5RR{B?nXyNnu_1DWG?nnv;;mGMv|C-FQPC=a5x z2gk~%N+xeR8+^Ux35t=>Z}|zEc>x4m-3^ zDKfQVP_4ulT_m?qeiY>JGL<{9cw)v^^MOlS79aIIw`09PGG3>8M;;tSB=>95L&I>Y z`=9BVIPkgys@;%-)AOe~?o7o#bGEGbWW7Wl*sNO(nQA>P%g2;PjM#iqIHH?lwa4x9 znfDE$!m1<95H=KW$RiBbE10;}MqnwGH(*2`X-2LtP5J0R4IF3Qr%$o0^+7XA_`70! z*VuRsB4Sk7U2pLKr8$TgjZ`@r?Y~#8r|Y44V#k+eWuRXkpJcHgV6S47qai$9Ax{00 zOVjA`qe1~uXir5wUQfqhssC{FCJ)GzgjE>*ym8tSs@##;WXbjds`1M0)czOSaf->k zW2LPsa9utzW)@0uIrwDq%r8V$2VYuPQNwdM>2nXDdfOjmNtf3!@cR)wgFI)Z?#7iIjph(1%0pNtX_5@Z&g7=q2?a#r5(LM_a>_#qzi zDxhnQh}Q6ailvH7%w81xK_EZDHQ89v5q!DQZ#1$Yn>Qlg9hvJry1EaQhb zn&XU5f-S`na$yYTZm=yhPM4Fiiyuitn#z!ek-y`AwfvyOQUBp8-?*lG2-Mo5wYPKhdb6d)twY{If1 z^zie1dq~J0dZ`Wx!d;7|ZZ%1U@i|!Icw34?<>b~C=Gp9?l(vonM zrpHhKgSs9uIhNHX&vuOQ5<*=4u?9NJBWK#AXipXiay`G&nVqp0fse$A#F)xLn~S zH!Bn6{DHNoJWMp_C1IY%D!4iMiX;35RAoTO4H3ch<(Et{3CtxhUOI|kB)Pz>u(05S zR37`HQeMs%x|D@Q!VFJsRUNcSMs^Ncs*^b5ujLTwm`8=xic&M@k1;kFTP*p1Nh%N= zvvR~u9s`Q_!*Rk2C)!fE0BM8b3asjGO6qj?D=;$F7CPK)5yk%y>eg#qr^jxNlz%|s zKKNDBlF>52AORCyA)gRzd5HtZ-wpe%hkrrtu)?ROC$C?xG(=MQ4KeN8&?K4{-kTQ% zZsNhOk2SXDY!1rM{kdsDs@4+fwsK)BI~37`iU(VQ7Y2xSG%SVHdCG@z7lQ!av8cKU zf!j;u!usWKlWe{stVsL|-flpUS`BQw_xj-9+y?{rzwp}=wK9LEqUv{(KIt}Hwfd7C zA7+HY-lpv@n1vGNiE*l_h7;TKtTe@+`~?Z4pTi0bXIGY5)0C+0UAyk0ZOiPqtNi!Z zG5xxR`HT~1<@s?NXYWu!Wg-)OtUW2vU)!oSOpsGB{<>M3C#HU(zoFyW3bS-&^wqha%){LE?aEo_M{|ANR6 zh4vw_vDmc_tiC5{I5l1Rpf(?byNA*J|LE4tVxa#QMauxu>9NUwb$PxO`-%7}OT_K;9#*C#w!(oVkzmk@ z*qje%w_!9~R2EB-H(}YSutFV&tF`RT_G@7=9ngPaV;OJk?sqmbb%*!*LEmKu-%Bn+ z50t6vpyaX*FtMu2+%d^LA+Q(mUw&(q?Xt2vuO8U#u_+G`9de}*!W*)KGf>BabJrlS zcDuHPi!3)GO*9A+qNrlTwGUwZ@tTc|S0KN4=ei#wU_VgcZzzN@i-5RJzLy^94xLHc zkq!CUBePw1ug-P-S+_yYywW!Bbpu#8*gSZ3f%V?;N)LcXS8LV9o^Avp3QhuqyEF(1 zAJ}aqPYM(^zjnJ|1>nywF05YlS;#`m)ZG6LBx4JmzOKm#X4PoJ+q8d5uH0llzJ z8n~c?&j|mBpBf=1rq1Ba0}HQ2R`>sc{Il*@ueJErp`c*y|9cnUqip;J!IrJyZ1-_u zh*BfgXd;^W53B!odyS1tTv-7nAnA$rrr-t9)oN{QPhHZ#LOv856?I6_8WCg!7boof z;ie6GtiDsneZsnW?bfp$Y;SZp!YK(bcYJJ$gH~+kd)b!qg506@(bj-9fo8@)3cOIZ zkM8Iv3{xkliPgYa$XWod+VyB5-W)T;h08X+7dym%{8s=|$6#)`fLW5*VAs_|UzZ z8_O+rD+4Rd5Z7Jr1c4BlSP6bKBhkZ_2F$|xuR@ytDok&DhJkT#y(5&767fSHlV!Au zg~x&Whw~H#q3Og4AD;>EA4K{FJ?o}xptD#pBGI;hbI9&Y#agbDuN=O-HVdfOx#=s$fNA{O=eKeVu=)SUWcui2WGKKx2;2zk%acA!9+n3Db}$QmPz=oLfrQHQFz@oh zis|ox|IL& + + + + + + + + + + + + + diff --git a/res/layout/hotp.xml b/res/layout/hotp.xml new file mode 100644 index 0000000..41c8745 --- /dev/null +++ b/res/layout/hotp.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/res/layout/totp.xml b/res/layout/totp.xml new file mode 100644 index 0000000..da8dfcf --- /dev/null +++ b/res/layout/totp.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/res/menu/main.xml b/res/menu/main.xml new file mode 100644 index 0000000..cbe751c --- /dev/null +++ b/res/menu/main.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/res/values-v11/styles.xml b/res/values-v11/styles.xml new file mode 100644 index 0000000..3c02242 --- /dev/null +++ b/res/values-v11/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/res/values-v14/styles.xml b/res/values-v14/styles.xml new file mode 100644 index 0000000..a91fd03 --- /dev/null +++ b/res/values-v14/styles.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..886d7d9 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,8 @@ + + + FreeOTP + Add + The scanned token data was invalid! + Are you sure you want to remove this token?\n\nNOTE: This will NOT disable two-factor authentication on the server.\n\n + Delete + diff --git a/res/values/styles.xml b/res/values/styles.xml new file mode 100644 index 0000000..6ce89c7 --- /dev/null +++ b/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/src/com/google/android/apps/authenticator/Base32String.java b/src/com/google/android/apps/authenticator/Base32String.java new file mode 100644 index 0000000..d5d5531 --- /dev/null +++ b/src/com/google/android/apps/authenticator/Base32String.java @@ -0,0 +1,161 @@ +/* + * Copyright 2009 Google Inc. All Rights Reserved. + * + * 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. + */ + +package com.google.android.apps.authenticator; + +import java.util.HashMap; +import java.util.Locale; + +/** + * Encodes arbitrary byte arrays as case-insensitive base-32 strings. + *

+ * The implementation is slightly different than in RFC 4648. During encoding, + * padding is not added, and during decoding the last incomplete chunk is not + * taken into account. The result is that multiple strings decode to the same + * byte array, for example, string of sixteen 7s ("7...7") and seventeen 7s both + * decode to the same byte array. + * TODO(sarvar): Revisit this encoding and whether this ambiguity needs fixing. + * + * @author sweis@google.com (Steve Weis) + * @author Neal Gafter + */ +public class Base32String { + // singleton + + private static final Base32String INSTANCE = + new Base32String("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"); // RFC 4648/3548 + + static Base32String getInstance() { + return INSTANCE; + } + + // 32 alpha-numeric characters. + private String ALPHABET; + private char[] DIGITS; + private int MASK; + private int SHIFT; + private HashMap CHAR_MAP; + + static final String SEPARATOR = "-"; + + protected Base32String(String alphabet) { + this.ALPHABET = alphabet; + DIGITS = ALPHABET.toCharArray(); + MASK = DIGITS.length - 1; + SHIFT = Integer.numberOfTrailingZeros(DIGITS.length); + CHAR_MAP = new HashMap(); + for (int i = 0; i < DIGITS.length; i++) { + CHAR_MAP.put(DIGITS[i], i); + } + } + + public static byte[] decode(String encoded) throws DecodingException { + return getInstance().decodeInternal(encoded); + } + + protected byte[] decodeInternal(String encoded) throws DecodingException { + // Remove whitespace and separators + encoded = encoded.trim().replaceAll(SEPARATOR, "").replaceAll(" ", ""); + + // Remove padding. Note: the padding is used as hint to determine how many + // bits to decode from the last incomplete chunk (which is commented out + // below, so this may have been wrong to start with). + encoded = encoded.replaceFirst("[=]*$", ""); + + // Canonicalize to all upper case + encoded = encoded.toUpperCase(Locale.US); + if (encoded.length() == 0) { + return new byte[0]; + } + int encodedLength = encoded.length(); + int outLength = encodedLength * SHIFT / 8; + byte[] result = new byte[outLength]; + int buffer = 0; + int next = 0; + int bitsLeft = 0; + for (char c : encoded.toCharArray()) { + if (!CHAR_MAP.containsKey(c)) { + throw new DecodingException("Illegal character: " + c); + } + buffer <<= SHIFT; + buffer |= CHAR_MAP.get(c) & MASK; + bitsLeft += SHIFT; + if (bitsLeft >= 8) { + result[next++] = (byte) (buffer >> (bitsLeft - 8)); + bitsLeft -= 8; + } + } + // We'll ignore leftover bits for now. + // + // if (next != outLength || bitsLeft >= SHIFT) { + // throw new DecodingException("Bits left: " + bitsLeft); + // } + return result; + } + + public static String encode(byte[] data) { + return getInstance().encodeInternal(data); + } + + protected String encodeInternal(byte[] data) { + if (data.length == 0) { + return ""; + } + + // SHIFT is the number of bits per output character, so the length of the + // output is the length of the input multiplied by 8/SHIFT, rounded up. + if (data.length >= (1 << 28)) { + // The computation below will fail, so don't do it. + throw new IllegalArgumentException(); + } + + int outputLength = (data.length * 8 + SHIFT - 1) / SHIFT; + StringBuilder result = new StringBuilder(outputLength); + + int buffer = data[0]; + int next = 1; + int bitsLeft = 8; + while (bitsLeft > 0 || next < data.length) { + if (bitsLeft < SHIFT) { + if (next < data.length) { + buffer <<= 8; + buffer |= (data[next++] & 0xff); + bitsLeft += 8; + } else { + int pad = SHIFT - bitsLeft; + buffer <<= pad; + bitsLeft += pad; + } + } + int index = MASK & (buffer >> (bitsLeft - SHIFT)); + bitsLeft -= SHIFT; + result.append(DIGITS[index]); + } + return result.toString(); + } + + @Override + // enforce that this class is a singleton + public Object clone() throws CloneNotSupportedException { + throw new CloneNotSupportedException(); + } + + public static class DecodingException extends Exception { + public DecodingException(String message) { + super(message); + } + } +} diff --git a/src/org/fedorahosted/freeotp/CircleProgressBar.java b/src/org/fedorahosted/freeotp/CircleProgressBar.java new file mode 100644 index 0000000..0734e40 --- /dev/null +++ b/src/org/fedorahosted/freeotp/CircleProgressBar.java @@ -0,0 +1,76 @@ +/* + * FreeOTP + * + * Authors: Nathaniel McCallum + * + * Copyright (C) 2013 Nathaniel McCallum, Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.fedorahosted.freeotp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.Rect; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.widget.ProgressBar; + +public class CircleProgressBar extends ProgressBar { + private Paint paint; + private RectF rectf; + private Rect rect; + + public CircleProgressBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setup(); + } + + public CircleProgressBar(Context context, AttributeSet attrs) { + super(context, attrs); + setup(); + } + + public CircleProgressBar(Context context) { + super(context); + setup(); + } + + private void setup() { + paint = new Paint(); + rectf = new RectF(); + rect = new Rect(); + + paint.setColor(0x33333300); + paint.setAlpha(0x99); + paint.setAntiAlias(true); + paint.setStyle(Style.FILL_AND_STROKE); + } + + @Override + protected synchronized void onDraw(Canvas canvas) { + getDrawingRect(rect); + rect.left += getPaddingLeft() + 2; + rect.top += getPaddingTop() + 2; + rect.right -= getPaddingRight() + 2; + rect.bottom -= getPaddingBottom() + 2; + + rectf.set(rect); + canvas.drawArc(rectf, -90, getProgress() * 360 / getMax(), true, paint); + } +} diff --git a/src/org/fedorahosted/freeotp/MainActivity.java b/src/org/fedorahosted/freeotp/MainActivity.java new file mode 100644 index 0000000..cdd9a58 --- /dev/null +++ b/src/org/fedorahosted/freeotp/MainActivity.java @@ -0,0 +1,78 @@ +/* + * FreeOTP + * + * Authors: Nathaniel McCallum + * + * Copyright (C) 2013 Nathaniel McCallum, Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.fedorahosted.freeotp; + +import java.security.NoSuchAlgorithmException; + +import org.fedorahosted.freeotp.Token.TokenUriInvalidException; + +import android.os.Bundle; +import android.app.ListActivity; +import android.content.Intent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.widget.Toast; + +public class MainActivity extends ListActivity { + private TokenAdapter ta; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + ta = new TokenAdapter(this); + setListAdapter(ta); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + + menu.findItem(R.id.action_add).setOnMenuItemClickListener(new OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + Intent i = new Intent("com.google.zxing.client.android.SCAN"); + i.putExtra("SCAN_MODE", "QR_CODE_MODE"); + i.putExtra("SAVE_HISTORY", false); + startActivityForResult(i, 0); + return false; + } + }); + + return true; + } + + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (resultCode == RESULT_OK) { + try { + ta.add(this, intent.getStringExtra("SCAN_RESULT")); + } catch (NoSuchAlgorithmException e) { + Toast.makeText(this, R.string.token_scan_invalid, Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } catch (TokenUriInvalidException e) { + Toast.makeText(this, R.string.token_scan_invalid, Toast.LENGTH_SHORT).show(); + e.printStackTrace(); + } + } + } +} diff --git a/src/org/fedorahosted/freeotp/Token.java b/src/org/fedorahosted/freeotp/Token.java new file mode 100644 index 0000000..49de118 --- /dev/null +++ b/src/org/fedorahosted/freeotp/Token.java @@ -0,0 +1,292 @@ +/* + * FreeOTP + * + * Authors: Nathaniel McCallum + * + * Copyright (C) 2013 Nathaniel McCallum, Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.fedorahosted.freeotp; + +import java.nio.ByteBuffer; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import com.google.android.apps.authenticator.Base32String; +import com.google.android.apps.authenticator.Base32String.DecodingException; + +import android.content.Context; +import android.content.SharedPreferences; +import android.net.Uri; + +public class Token { + public static class TokenUriInvalidException extends Exception { + private static final long serialVersionUID = -1108624734612362345L; + } + + public static enum TokenType { + HOTP, TOTP + } + + private String issuerInt; + private String issuerExt; + private String label; + private TokenType type; + private String algo; + private byte[] key; + private int digits; + private long counter; + private int period; + + public static List getTokens(Context ctx) { + SharedPreferences prefs = ctx.getSharedPreferences(Token.class.getName(), Context.MODE_PRIVATE); + + List tokens = new ArrayList(); + for (String key : prefs.getAll().keySet()) { + try { + tokens.add(new Token(prefs.getString(key, null))); + } catch (TokenUriInvalidException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + + return tokens; + } + + private Token(Uri uri) throws TokenUriInvalidException, NoSuchAlgorithmException { + if (!uri.getScheme().equals("otpauth")) + throw new TokenUriInvalidException(); + + if (uri.getAuthority().equals("totp")) + type = TokenType.TOTP; + else if (uri.getAuthority().equals("hotp")) + type = TokenType.HOTP; + else + throw new TokenUriInvalidException(); + + String path = uri.getPath(); + if (path == null) + throw new TokenUriInvalidException(); + + // Strip the path of its leading '/' + for (int i = 0; path.charAt(i) == '/'; i++) + path = path.substring(1); + if (path.length() == 0) + throw new TokenUriInvalidException(); + + int i = path.indexOf(':'); + issuerExt = i < 0 ? "" : path.substring(0, i); + issuerInt = uri.getQueryParameter("issuer"); + label = path.substring(i >= 0 ? i + 1 : 0); + + algo = uri.getQueryParameter("algorithm"); + if (algo == null) + algo = "sha1"; + algo = algo.toUpperCase(Locale.US); + if (!algo.equals("SHA1") && !algo.equals("SHA256") && + !algo.equals("SHA512") && !algo.equals("MD5")) + throw new TokenUriInvalidException(); + Mac.getInstance("Hmac" + algo); + + try { + String d = uri.getQueryParameter("digits"); + if (d == null) + d = "6"; + digits = Integer.parseInt(d); + if (digits != 6 && digits != 8) + throw new TokenUriInvalidException(); + } catch (NumberFormatException e) { + throw new TokenUriInvalidException(); + } + + switch (type) { + case HOTP: + try { + String c = uri.getQueryParameter("counter"); + if (c == null) + c = "0"; + counter = Long.parseLong(c); + } catch (NumberFormatException e) { + throw new TokenUriInvalidException(); + } + break; + case TOTP: + try { + String p = uri.getQueryParameter("period"); + if (p == null) + p = "30"; + period = Integer.parseInt(p); + } catch (NumberFormatException e) { + throw new TokenUriInvalidException(); + } + break; + } + + try { + String s = uri.getQueryParameter("secret"); + key = Base32String.decode(s); + } catch (DecodingException e) { + throw new TokenUriInvalidException(); + } + } + + private String getHOTP(long counter) { + // Encode counter in network byte order + ByteBuffer bb = ByteBuffer.allocate(8); + bb.putLong(counter); + + // Create digits divisor + int div = 1; + for (int i = digits; i > 0; i--) + div *= 10; + + // Create the HMAC + try { + Mac mac = Mac.getInstance("Hmac" + algo); + mac.init(new SecretKeySpec(key, "Hmac" + algo)); + + // Do the hashing + byte[] digest = mac.doFinal(bb.array()); + + // Truncate + int binary; + int off = digest[digest.length - 1] & 0xf; + binary = (digest[off + 0] & 0x7f) << 0x18; + binary |= (digest[off + 1] & 0xff) << 0x10; + binary |= (digest[off + 2] & 0xff) << 0x08; + binary |= (digest[off + 3] & 0xff) << 0x00; + binary = binary % div; + + // Zero pad + String hotp = Integer.toString(binary); + while (hotp.length() != digits) + hotp = "0" + hotp; + + return hotp; + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + + return ""; + } + + public Token(String uri) throws TokenUriInvalidException, NoSuchAlgorithmException { + this(Uri.parse(uri)); + } + + private String getId() { + String id; + if (issuerInt != null && !issuerInt.equals("")) + id = issuerInt + ":" + label; + else if (issuerExt != null && !issuerExt.equals("")) + id = issuerExt + ":" + label; + else + id = label; + + return id; + } + + public void remove(Context ctx) { + SharedPreferences prefs = ctx.getSharedPreferences(Token.class.getName(), Context.MODE_PRIVATE); + prefs.edit().remove(getId()).apply(); + } + + public void save(Context ctx) { + SharedPreferences prefs = ctx.getSharedPreferences(Token.class.getName(), Context.MODE_PRIVATE); + prefs.edit().putString(getId(), toString()).apply(); + } + + public String getTitle() { + String title = ""; + if (issuerExt != null && !issuerExt.equals("")) + title += issuerExt + ": "; + title += label; + return title; + } + + public String getCurrentTokenValue(Context ctx, boolean increment) { + if (type == TokenType.HOTP) { + if (increment) { + try { + return getHOTP(counter++); + } finally { + save(ctx); + } + } else { + String placeholder = ""; + for (int i = 0; i < digits; i++) + placeholder += "-"; + + return placeholder; + } + } + + return getHOTP(System.currentTimeMillis() / 1000 / period); + } + + public Uri toUri() { + String issuerLabel = !issuerExt.equals("") ? issuerExt + ":" + label : label; + + Uri.Builder builder = new Uri.Builder() + .scheme("otpauth") + .path(issuerLabel) + .appendQueryParameter("secret", Base32String.encode(key)) + .appendQueryParameter("issuer", issuerInt == null ? issuerExt : issuerInt) + .appendQueryParameter("algorithm", algo) + .appendQueryParameter("digits", Integer.toString(digits)); + + switch (type) { + case HOTP: + builder.authority("hotp"); + builder.appendQueryParameter("counter", Long.toString(counter)); + break; + case TOTP: + builder.authority("totp"); + builder.appendQueryParameter("period", Integer.toString(period)); + break; + } + + return builder.build(); + } + + public TokenType getType() { + return type; + } + + // Progress is on a scale from 0 - 1000. + public int getProgress() { + int p = period * 10; + + long time = System.currentTimeMillis() / 100; + return (int) ((time % p) * 1000 / p); + } + + @Override + public String toString() { + return toUri().toString(); + } +} diff --git a/src/org/fedorahosted/freeotp/TokenAdapter.java b/src/org/fedorahosted/freeotp/TokenAdapter.java new file mode 100644 index 0000000..06a3f3b --- /dev/null +++ b/src/org/fedorahosted/freeotp/TokenAdapter.java @@ -0,0 +1,204 @@ +/* + * FreeOTP + * + * Authors: Nathaniel McCallum + * + * Copyright (C) 2013 Nathaniel McCallum, Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.fedorahosted.freeotp; + +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.fedorahosted.freeotp.Token.TokenUriInvalidException; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Handler; +import android.os.Message; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageButton; +import android.widget.ProgressBar; +import android.widget.TextView; + +public class TokenAdapter extends BaseAdapter { + private static class Ticker extends Handler { + private static interface OnTickListener { + public void tick(ProgressBar pb); + } + + private Map map = new HashMap(); + + @Override + public void handleMessage(Message msg) { + for (ProgressBar pb : map.keySet()) + map.get(pb).tick(pb); + + sendEmptyMessageDelayed(0, 200); + } + + public void set(ProgressBar pb, OnTickListener otl) { + map.put(pb, otl); + } + } + + private List tokens = new ArrayList(); + private Ticker ticker = new Ticker(); + + private void sort() { + Collections.sort(tokens, new Comparator() { + public int compare(Token lhs, Token rhs) { + return lhs.getTitle().compareTo(rhs.getTitle()); + } + }); + } + + public TokenAdapter(Context ctx) { + tokens.addAll(Token.getTokens(ctx)); + ticker.sendEmptyMessageDelayed(0, 200); + sort(); + } + + @Override + public int getCount() { + return tokens.size(); + } + + @Override + public Token getItem(int position) { + return tokens.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final Context ctx = parent.getContext(); + + if (convertView == null) { + switch (getItem(position).getType()) { + case HOTP: + convertView = View.inflate(ctx, R.layout.hotp, null); + break; + + case TOTP: + convertView = View.inflate(ctx, R.layout.totp, null); + break; + } + } + + final Token item = getItem(position); + final TextView code = (TextView) convertView.findViewById(R.id.code); + final TextView title = (TextView) convertView.findViewById(R.id.title); + final ImageButton ib = (ImageButton) convertView.findViewById(R.id.button); + + code.setText(item.getCurrentTokenValue(ctx, false)); + title.setText(item.getTitle()); + + ib.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + String delmsg = ctx.getString(R.string.delete_message); + + AlertDialog ad = new AlertDialog.Builder(ctx) + .setTitle("Delete") + .setMessage(delmsg + item.getTitle()) + .setIcon(android.R.drawable.ic_delete) + .setPositiveButton(R.string.delete, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + tokens.remove(tokens.indexOf(item)); + item.remove(ctx); + notifyDataSetChanged(); + dialog.dismiss(); + } + + }) + .setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }).create(); + ad.show(); + } + }); + + switch (getItem(position).getType()) { + case HOTP: + ImageButton hotp = (ImageButton) convertView.findViewById(R.id.hotpButton); + hotp.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + code.setText(item.getCurrentTokenValue(ctx, true)); + } + }); + break; + + case TOTP: + ProgressBar pb = (ProgressBar) convertView.findViewById(R.id.totpProgressBar); + ticker.set(pb, new Ticker.OnTickListener() { + public void tick(ProgressBar pb) { + int max = pb.getMax(); + int pro = item.getProgress(); + pb.setProgress(max - pro); + if (pro < max / 20 || pro > max / 20 * 19) + code.setText(item.getCurrentTokenValue(ctx, false)); + } + }); + break; + } + + return convertView; + } + + @Override + public int getViewTypeCount() { + return 2; + } + + @Override + public int getItemViewType(int position) { + switch (getItem(position).getType()) { + case HOTP: + return 0; + case TOTP: + return 1; + default: + return -1; + } + } + + public void add(Context ctx, String uri) throws NoSuchAlgorithmException, TokenUriInvalidException { + Token t = new Token(uri); + t.save(ctx); + tokens.add(t); + sort(); + notifyDataSetChanged(); + } +} -- 2.43.2