From a93b46602db299edcf37fdd1674965f8f535ff60 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 9 Mar 2012 16:10:54 +0100 Subject: [PATCH] added configuration utilty --- host/Makefile | 5 + host/at | 1 + host/eep1 | Bin 0 -> 512 bytes host/eep2 | Bin 0 -> 512 bytes host/hidekey | Bin 0 -> 14535 bytes host/hidekey.c | 248 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 254 insertions(+) create mode 100644 host/Makefile create mode 100644 host/at create mode 100644 host/eep1 create mode 100644 host/eep2 create mode 100755 host/hidekey create mode 100644 host/hidekey.c diff --git a/host/Makefile b/host/Makefile new file mode 100644 index 0000000..696857e --- /dev/null +++ b/host/Makefile @@ -0,0 +1,5 @@ +all: + gcc hidekey.c -o hidekey -lusb-1.0 + +clean: + rm hidekey diff --git a/host/at b/host/at new file mode 100644 index 0000000..1a69a67 --- /dev/null +++ b/host/at @@ -0,0 +1 @@ +echo test +0:01 diff --git a/host/eep1 b/host/eep1 new file mode 100644 index 0000000000000000000000000000000000000000..e31eeab0e1a75d886f1c1d8a86f8bbfba83f1d3c GIT binary patch literal 512 zcmaiv(T;*J5Jg+TRrV|T?9;CL;0O4y#>Dssq`)AJ*kRithOb`>A;c!lGEI}-J7=0Z zpV1fV4`VUo$rDyyZZN5PY(25CXG?otJ!LQ8!wtJ^Fvz!TXtwaO(a)Phjt zs7rNYtV9gpE>HjI9Xjz;REZ8-BXR?U&7=wOQBuGIzf&W1fsYX3d-1?;M?SrQ9{a`N ze7V!_b>qk41HVfx8Kqt9soWlxq#kykOvV-izfX~xH`hJ+B8rzEtF`aWD?X3>NBjlq E1v{Ni=>Px# literal 0 HcmV?d00001 diff --git a/host/eep2 b/host/eep2 new file mode 100644 index 0000000000000000000000000000000000000000..368d6f6d52a373a7749fc849264328b2c2c6818a GIT binary patch literal 512 zcmaivL2AP=5JjcfY3tBKXq{ElcF_Z5kq{`ofsyS=EFxfrv*4^#8mO ze>TY*8xCV@#>jGYl9xX&|udWBxx71g50&Wh4PPo!R5L_j{c0b>3I!9RI-Mz1~q)##C~!YZ+0aGu)gd-i+1Na#HeEvkK;B z7qc364meZsxOomifhjmBO)FR-<;nr45blr+hg%>L)(8q7L{bqFB!BtjmZ*SRFA}7J zjA@)fdK9Z90o#bm!3qipsZK&ANa2xQorV`uozzosKN&_+P?e9$Mo*0_UyZ{JifA_h z*2v#^$m;^U=6B5?;m2gbkJY%jq=GG+VoX7$_igC$^2z+K11ipC(MbEMmCK^RrO`+% z-L`42w-)OAz=INISY9gCV7I={!6X3pLw?crL)R5D%q!c;@0cpNOwXsvD8m zG(4(b&XjtU5)wEU55+}sJMpM;Q~_6s%Dey%m7fyHQar>b+r5XivRzZ$Gl)lW6#v0L z{`Fn!JpVotYV}tS-La)+^_jk!XZk;=I`!MrcGHl|r%D*4`Y28dOYoPK;8S_DVk43_ z8UG~mCi8o`1pkH-ey=Yf|78h&c?mmjmXKdrf`4fVJF80Y6D91pOUVDCg#0@t_=`%| zah2fTUc%1a68tFaRI?Ap>lU{`BA;%S{EEeGc_y$=@XSKbRD3nw+e*mK0iWcn7q>xE zj7frP@XTg2S)$TSWG=aZ&Bo{%nn#!|VLnNx+LtbO)zc(W&wRd)&Unn1GW|)@=VQJb zxBE639g&o2B-cg#sg#joLd6$}MNH-k0Vqx&9y62isLxFLW2umlRQwLZ^aYLWk$|B% z@q`hREZ>fZ8TM_D1bvA}Q00?G%1lOL9gs=|l97ZNPx}0+KqTiZZ`3A2`T;7)DhBmr zAe3y=uDv2$g!-oPCsn>jG*82BcnZ)5`3^?L3V?;Y3(}S3fBtP71Rn2 z{%6M&hoD$)6^CZCGH}I%4uC|QUOX@L^d0`q>aS*9H`bFqE$bmwVCEa zl~jKszFg9H)|j+IbG0-rR2H>yNPLP{r3xFL=3yJv!Hokq4*ka?;8l_U3jj!5>^1?PgtpzG2 zY<&BC-(};|8m!VT8=uy8m3nP_T9Z}UYvbG3=?83lTGLh1yGJTAkCZW%S%K!wT!=F3 z-M^|hGJeG^7iesJ$yU6b7rTKG9VWHx@HoUWCuCDmT2l4+5Mbe zLo{{K>^@GfAey>ib}y$dBbvHQb{D4?5lvkso8a^UqN$5y+c-U&XzCi-W=>ZUOI&I34{xrp}Ij1;&y$iKZsb4s-f- zqN!=K$2t9LqNz!TZ8%inLZUb|hl-qE}NbF{go>F6NC z46YwNT+PAJ_G&lFyb6W0d-qaX>3vh5oU1XtXV7$vALmWA*PdE+>)p*Hxa*o@aLCf% zdUl@H#-K*==(|r<6Lt9Wa=rUhnSSL^sy5`jxRIgJ2g`J8>Q5jvKIcU))Hn6Vq;lm@ z@|~Baeh+9Fxx4k{BcV{p<-B+gkH1y#zNX_mID%hu_5krHwu;uDpR+fqDDhhbI65tH1qhE7MTQ8+t9LBrjA zgn)>CNY!h-p!fAqh}K~s6teXSg=vtC<;h6qA?k0$?-cw|z5DJ_W=@0W(U*`TN~0VM ze8CHmdHD#hk?s*qx9-m9R(cq2XDGLxVe;w82#04$$MTF4C+BTkFvs9+On4h3Z*W>* zddwOPS)Q|c|N3g@)2(NbKX$aSw&E-X?a?W*WUP_%l=i2WjXYa^uCz0}nY{ z%?NV{WkHypA)5snJm|d*yw!yfnhy>QN+Wfmyu%bf705H@Jm4AWMf3KpAJqp?seBwz zWiM_W)2(B|BX!@^+$G#mFlora#-Ls0HT@FQQtL6DJEsw=UvgZZPVIgSVGaTgqZ^>9 z;PYR4JtF`o_Y9iX5Of|mCcvQnfZjLf#lb~w?AcB8-KfH;edx@(^%nec%bCR}gcLqC zm9sDkR$~-U8(L$i;1R*4;yvvdSwcTy4v$rwab7lf##w#tA28*dao&6w`1-Lk&MiP@ z3CYmm%uMIg5E6n1OA2-mJEc&Og(ah?>BD1Fl!+fqYJ%FGssj;tFdoGWv3q0-=4R`c zU+}K<)F{C7Fvc>!_>2bPiSD~ku$`3y)SlTE%)$pxV5&Yecs^r7>^X?RC}yC$kF&H3 z6}M?NRon{$+o&F`*ACKG$05?ECj3{33uDt@3=v^q9?d+=M@`Q##bE0WqHXWba5fAu zd-L{icArqPJp1}M!}2`pJkT=&jb6{=%6u2a*x!no;&4cRL_5fj@i~&1F*!zT4EClvP z!rX-Yp0F@suM*Zv*o(ljL#S%u(c$cgqY5$GPy=C(#{AC?{WBz~Ksp@t3_5$fB+`FB z!*q$B`n>bN5Y@mlw8rp`ocRF+2c97ZC$#0-V295~(yuC7u zkxy#KfbqeJ#ut(C*QIgZpj6w!_-w`SG?)j8^|MMv-Fp9q$>77qHiNd7$FZ4%dj^REHO)H$E-r_X^9@OtNg{v_~T zZ|w>(^#4S|YByFmRqyvUfymbzA6B=?QhxA}DCM6Oh^SINf?S&P^U4T`w~B?FUe9Ug zf!j{gfI$FXR|UO4A*q*o%J81{QjY^*x`=Sf_rIBUfO7JYi)_9B#`1&nc%8naTd!se z_&jylfM0~p{blYrOL9GA8Z$=up$oY9(ac|l&tb7<;TlS^HJpM?j7 zBKPwpY-S&U+CbRu>YM^s3v;e2(G><#cF7YTQc#{l9h(Ou~4_* z^^Hsi%;RH{ChM~^G*t2n1NU&Fukkv_P1bS9iPhyFU=SS(t;0JOuLIGsDyTZpIjCb* zOPo5^Jc(1s(j-nDt4`w7vFd@VjL3!{Y=J3KNNEDy^0d@_)g8_ zfnf-rhsMx%|B4o2d`slN;6J3VYuop=ZbfT{yjHMwSnpr@AJa7E?O!rP0Q`*CGHXY@ z)?Kw&-?!FcEgo6zz4YA%>&qtVWBu@##Qg11BS!^4VyQAXXB>E+h7noZiW^!c4+C8kzAI*-rtURGN=XOo$ZmB z@PTGXnUTP@N`^QBQNy3)7AvO*ji_N7T23jHjCYDGSzyQ~4Mb2mJ&{bu49y>n=A=c* zc{a>rA2OYQ*K`b9kcIIlBmSs{xSJZh)2TEREMg^Yozayrk|vstDg&)4lWK^1*K%#C zrZ+Vj-$JuM89vfxBpNYya>@3c+Gf)Th0yRf#XF3sc6G|!Ufu*j07 zO@T^R@-9z3Lgt}2%ZyHc7jF~|8{oK1Y_SYHT1ba_>xN2Dn=W1l1_BrO7^`uPu%eKoqMi(=s`-) zTql~L)?K!+{HhiZv_Ug-bbLGkc+m&r<9h*j0`3QV5%4(RpJR#|1$+mv8sD-HVVbB1 zT>bg@cr$(50`i?E$jre*sqD^8tgNfLY~jpl6?-8=dztjycY1t$HfYvRRlV*W$GP++W}s#@Du(IYA)R;-RyGA@D6?eEUaJ?>Wa;<-Wdq+K(Og zmiN>5=l`ewGc|y(3!YTK#kAs67pGJVX*^NFP5@8poJj3)tMeh%E!rGzF89$_<8eaj z$^}guvy__8adW7~QCQ}y3HNRpfZB7XZ&OP4J!zu(AOIY`q>aejS;CmqSL2$xJ|+70 zq|{a6=1}qLC9Td1be=2b8A6qR{1)crsh0AnM@~z348xeyuS|1G3;#Pn-BT#`_R~rc z#}g7BlJFG?-;(gZB>YOksu@D>A_-j*UMt}S32&D$CgJxbyjQ}XO8A6?ha`MO!nY(W zj=Pv1#kMu2PbHj-T@p&Q5-yjJGx54o(lF2iSGhmI0#)u zF;@VeUMV;f;JX22!lu775`aT|)6&buZ3{a%VuTWwTq9) zQ6s3_Ta6pVSPX>5q|&c(xItl^lMIbh`Ink+6lXaQyZ+Seq5A|0>qkkwtTq z^55oggJP^rGLCUdoQo1#A!%i&5j1|g#g)FA_tbqOx0F}&p3;|WwgCvuc}ic+i~Ph3 z{EWWqxRiah&L!l+r0N+WJgIh9v<1Yj-&^VCS-n!ft*FA4ezi1kUy;7LpEoKO!i-vg zrM%LUBzvexU#-hSGH^PGv?t|X@%90s5LNwWTCk{T2HkgcynB!qnP8A!+=byYC>VeETc zp-Z@0PF_%X|EeC}F49-uRl`z$P$^2N^b|Z=}@ABcjcQiSDO!hnLS{K4R_m-ivmBAA z^|O#a1?!>P&f<7ER!+6v*)z-0qt!ZA$e)(`9Z<-xU~1hd}^PD}ioNmo( zZFZKFpM&{mGX7l5Gn4Vp&)sLX8!N}JAvHe~^5^A#PZjd#Gc}$I`T6^Yg?#!NEKFj2 zRI!?w?t%;&cT;fhv49DJ#%tLm^>7*IPppU4oIkN1Jm5Q66>}H)y_L%^VDlEY0n3l) z?{a(r(-yY@%a7A8;ACfik)2ZU?}0qUUs2R9f5rK;*_Mmk!1C#5K+Etex40c21E2iv zlk2h4I1FU6dixF8aZGH-w@J}4v0t4j!Jmo-D|1ZjKULssxanQoALfHUn`{*&+IO3b z-&lgbh4ZWM!`sa*sW~+)`Rcn!xuN6i*{Gj?lkLLy>X5kud`$`2;5{Yy4{p{++!{`#3J^ftTp=)ZC z=zE&d0nQh={e6t=pj?B}ex1yGy@Y%ge7aw)zAKcik4nhTEuXypFXj9y_K!|CH!&a$ zttuhE8T`rab<;uJWbNAt{$%&GcbAaAU)nD&*TW^`pXB^1)-T&DDdT@u^2a5g<{e5$ zCI7v1-JGU*lhUgt?7uDL>7F4azV{6H9_LS7e@9B#VF8@**shkd0FFz{G)^)DxFfx; zW#cBFw`p?=-8lC(7Em{?vtSw%@LnJ-Nmr+fzue%2)b5XzH&LE3|}PJ zMbza??5_mVot-{;SpG^99@{8UD41Tb~e2q76XjtF0j?uP_ycC|hcJ6lDuZD}u=Y>3R z`Mi)PFP;ZdX>k)@TE(FxozWnwuf5Gr_u`9e@?9!z_?~-Vw*1e43I7K`hqrW+ zwHcS@@ec(2-hH8_uW2Jf$EAE9P8<1&F3zfoM0~bt{kYcm}Q z`+UJv+!x0ARMY^$yPIlyevO}MlkeKmrT;>E{4jcbsw0*EAAmvu`-Ok$yyQPSAY%OU zK%sun2*iU%YpQ*1py0nD#L=_;UmbWag9-ZYhC&;t9K>136aU6g$dmu0ApfhOFb_S5 nS}UDmfv^$SCUJ1-fYAPL8uA}I#6LaoT9d_wEShxk|Ka#=^>!dU literal 0 HcmV?d00001 diff --git a/host/hidekey.c b/host/hidekey.c new file mode 100644 index 0000000..e9e52fc --- /dev/null +++ b/host/hidekey.c @@ -0,0 +1,248 @@ +#include +#include +#include +#include + +#include + +#include "../config.h" + +const char *errorMsgs[] = { + "no error", + "write protection is enabled", + "string to long", + "invalid slot", + "unknown" +}; + +const char *writableStates[] = { + "no protection", + "true", + "false" +}; + +char * getPass(char *buffer, size_t size) { + char *r, *n; + struct termios oldt, newt; + int fd = fileno(stdin); + + tcgetattr(fd, &oldt); + + newt = oldt; + newt.c_lflag &= ~(ICANON | ECHO); + + tcsetattr(fd, TCSANOW, &newt); + + r = fgets(buffer, size, stdin); + if (n = strrchr(buffer, '\n')) { + *n = '\0'; + } + + tcsetattr(fd, TCSANOW, &oldt); + + return r; +} + +char * getUser(char *buffer, size_t size) { + char *r, *n; + + r = fgets(buffer, size, stdin); + if (n = strrchr(buffer, '\n')) { + *n = '\0'; + } + + return r; +} + +int setSlot(struct libusb_device_handle *handle, uint16_t slotIndex, struct slot slot) { + return libusb_control_transfer( + handle, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, /* bmRequestType */ + USBRQ_VENDOR_SET_SLOT, /* bRequest */ + 0, /* wValue */ + slotIndex, /* wIndex */ + (uint8_t *) &slot, /* data */ + sizeof(struct slot), /* wLength */ + 500 /* timeout */ + ); +} + +struct status getStatus(struct libusb_device_handle *handle) { + struct status stat; + libusb_control_transfer( + handle, + LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + USBRQ_VENDOR_GET_STATUS, + 0, + 0, + (uint8_t *) &stat, + sizeof(stat), + 500 + ); + + return stat; +} + +int checkStatus(struct libusb_device_handle *handle) { + struct status stat = getStatus(handle); + + if (stat.error != ERROR_SUCCESS) { + fprintf(stderr, "Error orccured: %s (%u)\n", errorMsgs[stat.error], stat.error); + return stat.error; + } + + return EXIT_SUCCESS; +} + +double decodeUsbBcd(uint16_t bcd) { + double result = 0; + + result += ((bcd & 0x0f00) >> 8) * 1e-2; + result += ((bcd & 0xf000) >> 12) * 1e-1; + result += ((bcd & 0x000f) >> 0) * 1e0; + result += ((bcd & 0x00f0) >> 4) * 1e1; + + return result; +} + +int main(int argc, char *argv[]) { + struct libusb_device_handle *handle; + struct libusb_device_descriptor desc; + + int r; + + r = libusb_init(NULL); + if (r < 0) { + return EXIT_FAILURE; + } + + /* search device */ + handle = libusb_open_device_with_vid_pid(NULL, DEVICE_VID, DEVICE_PID); + if (handle == NULL) { + fprintf(stderr, "failed to open the device\n"); + return EXIT_FAILURE; + } + + /* get status */ + struct status stat = getStatus(handle); + + r = libusb_get_device_descriptor(libusb_get_device(handle), &desc); + if (r < 0) { + fprintf(stderr, "failed to get device descriptor\n"); + return EXIT_FAILURE; + } + + if (argc == 1) { + printf("usage: hidekey COMMAND [OPTIONS]\n"); + printf(" available COMMANDs and their specific OPTIONS:\n\n"); + printf(" info\n\tshow information about plugged in keys\n\n"); + printf(" set SLOT TYPE USER [PASSWORD]\n\tstore new user/password combination on stick\n\n"); + printf(" clear SLOT\n\tdelete password from SLOT\n\n"); + printf(" reset\n\tprune all passwords and reset startup counter\n\n"); + printf(" serial SERIAL\tset new serial (expert option)\n\n"); + printf("hidekey 0.1 - HIDeKey setup utility\n"); + printf("by Steffen Vogel \n"); + printf("please send bugreports to http://bugs.0l.de\n"); + } + else if (argc == 2 && strcmp(argv[1], "info") == 0) { + /* get product string */ + char productString[255]; + libusb_get_string_descriptor_ascii(handle, desc.iProduct, productString, 255); + printf("name: %s\n", productString); + + /* get product version */ + printf("version: %.2f\n", decodeUsbBcd(desc.bcdDevice)); /* decode bcd */ + + /* get serial no */ + char serialNumber[255]; + libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, serialNumber, 255); + printf("serial: %s\n", serialNumber); + + /* get status struct */ + printf("startups: %u\n", stat.counter); + printf("writable: %s\n", writableStates[stat.writable]);// ? "true" : "false"); + printf("slots: %u\n", stat.maxSlots); + printf("max user length: %u\n", stat.maxUserLen); + printf("max password length: %u\n", stat.maxPassLen); + printf("max serial length: %u\n", stat.maxSerialLen); + } + else if (argc == 2 && strcmp(argv[1], "reset") == 0) { + libusb_control_transfer( + handle, + LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, + USBRQ_VENDOR_RESET, + 0, + 0, + NULL, + 0, + 500 + ); + } + else if (argc == 3 && strcmp(argv[1], "serial") == 0) { + size_t len = strlen(argv[2]); + + libusb_control_transfer( + handle, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE, /* bmRequestType */ + USBRQ_VENDOR_SET_SERIAL,/* bRequest */ + 0, /* wValue */ + 0, /* wIndex */ + (uint8_t *) argv[2], /* data */ + len, /* wLength (string is not \0-terminated!) */ + 500 /* timeout */ + ); + } + else if (argc == 3 && strcmp(argv[1], "clear") == 0) { + uint16_t slotIndex = atoi(argv[2]); + + struct slot slot = { SLOT_EMPTY }; + setSlot(handle, slotIndex, slot); + } + else if (argc >= 4 && strcmp(argv[1], "set") == 0) { + uint16_t slotIndex = atoi(argv[2]); + uint8_t type = atoi(argv[3]); + + struct slot slot = { + .type = type, + .options = SKIP_USER | SKIP_DELIMITER | SKIP_RETURN, + .delimiter = '\t' + }; // TODO make configurable + + if (argc >= 5) { + strncpy(slot.user, argv[4], MAX_USER_LEN); + } + else { + printf("User: "); + getUser(slot.user, MAX_PASS_LEN); + } + + if (type == SLOT_STRING) { + if (argc == 6) { + strncpy(slot.pass.string, argv[5], MAX_PASS_LEN); + } + else { + char tmpPass[MAX_PASS_LEN]; + + printf("Password: "); + getPass(slot.pass.string, MAX_PASS_LEN); + + printf("\nRepeat password: "); + getPass(tmpPass, MAX_PASS_LEN); + printf("\n"); + + if (strcmp(slot.pass.string, tmpPass) != 0) { + fprintf(stderr, "Passwords didn't match!\n"); + return EXIT_FAILURE; + } + } + } + + setSlot(handle, slotIndex, slot); + } + else { + fprintf(stderr, "Unknown command\n"); + return EXIT_FAILURE; + } + + return checkStatus(handle); +}