From f7cbf5ac5034cacea9ea47c004f3d27e949a01b3 Mon Sep 17 00:00:00 2001 From: Jeroen Nijhof Date: Tue, 21 Jun 2016 17:03:49 +0200 Subject: [PATCH] Ignore precompiled python files and add ability to create lorawan packets --- .gitignore | 1 + AES_CMAC.pyc | Bin 2378 -> 0 bytes DataPayload.pyc | Bin 3380 -> 0 bytes Direction.pyc | Bin 854 -> 0 bytes FHDR.pyc | Bin 2464 -> 0 bytes JoinAcceptPayload.py | 4 ++-- JoinAcceptPayload.pyc | Bin 3612 -> 0 bytes JoinRequestPayload.py | 5 ++++- JoinRequestPayload.pyc | Bin 1934 -> 0 bytes MType.pyc | Bin 1020 -> 0 bytes MacPayload.py | 4 +--- MacPayload.pyc | Bin 2911 -> 0 bytes MajorVersion.pyc | Bin 852 -> 0 bytes MalformedPacketException.pyc | Bin 608 -> 0 bytes PhyPayload.py | 29 ++++++++++++++--------------- PhyPayload.pyc | Bin 3827 -> 0 bytes __init__.py | 7 +++++-- __init__.pyc | Bin 335 -> 0 bytes 18 files changed, 27 insertions(+), 23 deletions(-) create mode 100644 .gitignore delete mode 100644 AES_CMAC.pyc delete mode 100644 DataPayload.pyc delete mode 100644 Direction.pyc delete mode 100644 FHDR.pyc delete mode 100644 JoinAcceptPayload.pyc delete mode 100644 JoinRequestPayload.pyc delete mode 100644 MType.pyc delete mode 100644 MacPayload.pyc delete mode 100644 MajorVersion.pyc delete mode 100644 MalformedPacketException.pyc delete mode 100644 PhyPayload.pyc delete mode 100644 __init__.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/AES_CMAC.pyc b/AES_CMAC.pyc deleted file mode 100644 index 536f3f8f59daef6a3d5c540938f4df7bfd3e8366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 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 diff --git a/FHDR.pyc b/FHDR.pyc deleted file mode 100644 index aae30b0c0bad625ea5a98ac5b5294637ea130ceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2464 zcmb_d%Wl&^6usl5kMu!Hd6X`YS|L!75Ruq)gHU-2B#4l^sOZMBY$tW=*pWRgR4Nw9L#Gv}UrXHxsMy0rB$J&0uRso}YYR_(&X_!-GWdLoA+hS-zL zNY9f)54a}ryu@|+DRL?Dh#iR>a?LE@QvQgJGLPdyQ5d!&s3EBbOjz1gy#(vG6_i z{4kR1D2Qxdhy)&|0&Ee~6o93X9pbuTT?g=3<=flTAw(dMlFGDG3R-O96=nD}%v&GvJiwFLd)hy@iQ*zaSUFeKai^yk$&g0HX zSj}{-DL4e|+M^A46?YTIlrEbxeF>*4^4&0lj_>Xm80i|Bz}_UN4Z*&$Z8w=mUkyX> z$-vjJxSP*lT+Wd5>qKRX0ExPTqfAg?jgR}gu!bx-q%5zmF$=7l*kDkb z_W_4O4@Djcy-Fe~ae$KGksy(_BSF!$cvU6G4qdZUD>+qTPTPbeF-Sf)y-J+_Q-C}w z6h{y11Arlo>7-FIe8owl5NH-@^zaTDJ(^%N6y+*mSkc$78Xg2EOl}`fu$WF4GJo5%NT)qU?% zCB|Oeg_-vnjYh4ph&J(UyAAY)#w4*Un#z`^k@cBtUE?|=RFmgUg%{kWqFFcV-XBq< Bs|)}D diff --git a/JoinAcceptPayload.py b/JoinAcceptPayload.py index 8fdd2a4..3e182ac 100644 --- a/JoinAcceptPayload.py +++ b/JoinAcceptPayload.py @@ -49,7 +49,7 @@ def get_rxdelay(self): def get_cflist(self): return self.cflist - def compute_mic(self, key, mhdr): + def compute_mic(self, key, direction, mhdr): mic = [] mic += self.to_clear_raw() mic += [mhdr] @@ -57,7 +57,7 @@ def compute_mic(self, key, mhdr): cmac = AES_CMAC() return cmac.encode(str(bytearray(key)), str(bytearray(mic)))[:4] - def decrypt_payload(self, key): + def decrypt_payload(self, key, direction): a = [] a += self.encrypted_payload a += self.mic diff --git a/JoinAcceptPayload.pyc b/JoinAcceptPayload.pyc deleted file mode 100644 index 6b9aa0e62b5cb9855835ffd11130772da214d757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3612 zcmcInO>f&q5FJtb9&g2Vd< zhn0n^z~bJ*{f9is4x-3T-GgwJ=3%_R!iT>@E1#pYfZ!1k*23DrMF9)?Dl`RPXld1W zjsdKtmNkOpP)Fi56}l34R9Kg|tHOrF>ndzYyrDu*;!PE6L!eWk}uxkc03+=P9$ zDpO}}YROGb>CW|brDJbc90Qy4fi>AFetSWw1_2QhM+2VHFxle1ZlL=o^gD^U`?&vAcH_0={XC`43Oslh2 z53pHO%%;x93+r{vimh4~HagY(DPj$$(=5*->snAU>yp@UN^GBmaa=eejMLIOmt?1< z4i!&hn}##j#LzIuBiu@Kk|w1a5WEhQHa#(XrQsq2w5lubLfSjaCw6aai`-^=WfASA zc@bWO+1`)1Kg9hNXWpI8)c=DZ$r2afl)&!?e5<$ZUH7`Uw*4*d2Cgk!U9aaw^m{fR zP5q4CM?Zt#cyzUqenrCpCm13(+=&_u4{#-@`AQt;sXMy~spML6g^l>sc`@ z?v$|fQ@yhUCWej`W8y1`sSXnLZ_c zU`j=1FAT%K`FL)bgi{^Ki>d&qtBEU4%_p47H-uHjPo`(KP(!&2HVsqYJ+zXsfE4yX z;fLPs{~+-K6J8<_p7t*uYyJOIiGs8b2gYsZ#7B1Ki4K#$Se7fh>Yq#w%C7m0(t=uZ zo9Z2ObycOs*h{3E&pC-4nlI3;f=tH%Q6J&F^gDuS!7ZvJ<#xb{b!nA_6B`6t@&&;p zj~}N{4ga|?+w54+8r|+Yl-_0c9y^w*hUJZ6NoJG`o~B{Iz1ogS%NKx#%=5Kc__h7+ vR=4rW)#-MJ)ryQDRoq|*KV)f~?;fhtRwu>Rtqhz}c&{Su8!lb4Bg_8)h4H>l diff --git a/JoinRequestPayload.py b/JoinRequestPayload.py index 0505953..f77dd48 100644 --- a/JoinRequestPayload.py +++ b/JoinRequestPayload.py @@ -29,9 +29,12 @@ def get_deveui(self): def get_devnonce(self): return self.devnonce - def compute_mic(self, key, mhdr): + def compute_mic(self, key, direction, mhdr): mic = [mhdr] mic += self.to_raw() cmac = AES_CMAC() return cmac.encode(str(bytearray(key)), str(bytearray(mic)))[:4] + + def decrypt_payload(self, key, direction): + return self.to_raw() diff --git a/JoinRequestPayload.pyc b/JoinRequestPayload.pyc deleted file mode 100644 index 5b746af4b3f123359c904e786afe9e0d2b843884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1934 zcmcIl!EVz)5S_Ktv?&y-3IRewN>AiO#D!iEqC^z}(Wr6`h+HgVZ&SCi9qdgZQhK5M zF+ae2H$Q8&zHo=cackxk3-m= z3_1<$xgCgiMVbfp^VC-ED4LCnDEZ~cVEZ*j^#;O<3=Q4E(a>9X9KyAyD-DL>)|w;@ zRhp8lsj@CfQ2w1d={AI(c7!yxxqFED zFd82hWoDD3C_c09;A?CrE-iA`#AY;^*lDV2V$Z446V$xOW7}bRt^rZm@v&pplbYTR zR8dhqht@qQGTS}1WnuGfRmR?3lY| z%WRvNwObBlm{7pZK!Meq)JS+Lpo`T2qbKk;awl8RD$*b|oMq7!&ND2JL@o>qhYFsG z>|Gh=y5TL2L5EoT9hN9i!K4BfS+mkC0#d!YR9q3F9K0S2hMVA*|2G+C;5w5fP^FeY z75EBCX0b=sh4mfeJHJl!Z*~6zDl+%KP}R@j(O;m_Qm*(y-d=FEe3_50;bLtVlcUG= zKE&LUk&z3u6nuI!FL^nAwj*d44VgFO)DyG{Jn*_@p+_xDpZ$uT_Q>|~y(!-e6R>vr zeD@CqVefFir!BYx15PjaH`D$AA01`(I2$l=EaYE3Lrcx`|1Se6{y;!TYOWp2Av}-;pg$v~$ zb4D=Zv{dB=?Cv~|?eV-f<86H3>HTE zPGSMw#4K!4to=z(D9CdU2;L^yX<6k)Pm}b*xbf%Iteh}$!A`Z)yD*e zm?$eDaS6l?5NX_G(wL~5h+C{7ZbP>acc9ydyU-n$6!)OJ-r0tng*{4V$zYkm1`J%D zZ8ES9>xH+;OL>O^O=00IJ9AuK@)VeK_BRD}k?G_$=hq z(T0F?+Yaa3Avh{NCYjX_b4T@uOy%3*r;=s}S%PDIwaHGslb`8Ia%f1lf%++VgR?R> zgL6}rrWn*!I>^c@`IHocH#9D3^i6)Yx^zshlr5}NYM1<)7a(>;U-W~NdvjyHaF$H9 zor5lxHzJQ42|Smq@t?);;rGVfr=jMmAi_T3wa6mLjZ%(pPN}@qA2ObD!13fLQgZxm zF`muc_RYd@G#XFmj;mTkqe*nA4u<5W#kjxiQw(I!9l#{Uxj#D8)6-oDs$^Ck29 I#_t8c0EP{|tpET3 diff --git a/MacPayload.py b/MacPayload.py index 1d1b4e5..b713b22 100644 --- a/MacPayload.py +++ b/MacPayload.py @@ -31,9 +31,7 @@ def __init__(self, mtype, mac_payload): self.frm_payload = DataPayload(self, mac_payload[self.fhdr.length() + 1:]) def length(self): - if self.frm_payload == None: - return self.fhdr.length() - return self.fhdr.length() + 1 + self.frm_payload.length() + return len(self.to_raw()) def to_raw(self): mac_payload = [] diff --git a/MacPayload.pyc b/MacPayload.pyc deleted file mode 100644 index e6278138146222abeff3dd6418c532229edc67f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2911 zcmb_eUvC>l5TCs}J8?>I+R}zXD_W2$Kh;74RYIjAIH@QCC#(}i^~>pWcTViwA9J^* zjT9arNIdXy_%wV2-uVD9zuCK72&ih3+TOjH+u7Nf-~4vh?qADGe|$RK4XOIL{QQDj z`GUKMe~J>KlxR$(pgWW(N)?Tj)m=&)N*x+IR`)1zDRpV=TD?VyN2y0+&+2VTT9meE z++ux!q9uwJ=@+77qG#haMI9RTuJGE^zxmTsESYz?`!+}>d6CA^RuCSR=hIBb-#?E_vlSdBc@WvLtJT^B5=Yj5g3WK2#dt1z_?QZ zGhQM+>UG$Ah~l6j!2!4OH(uQk9XWK&%PKk`D(;bCS>F7tC}RVsGB_ggUC1oVT$*_R z{TAMGJnV&q1v*k>7HQU@1BZ&Ah|@kZftOkRfS0r8?7y0EMP~d?=B?MAu`DzGB=a_$ z{qHgoD@WBV)0Ihg)VU_D$RvHfNmpgkudg|Y0UY&EoZ%FdD6ez(H2Wb)rqSIr2=C4- z+JTJ*c1fIRevlT9dn`@%qr$Z9(4N^hDDz~V7sg<8m}jv8DJMnhSKhS4Is?uG-+Vgs z^~QHQ8>4Lv_hKq<*9L=)t!)h-3>wkSaIiUi;;*l5ulYM$8mpLBbyQbzAvo$Z$vP)Ab};90!hLutFS(1Z*^G6zizLB zNUA1aU7Df>bQg$lM1689nDb$DhDf5avkMbR;u4Gy*TYkB)d1o7Dv&_HH^rka`x20v zLmP)sUAOZ=C4n_`5|y1@94bU7P&Ltg-b5$=!>YqK3)0y4zm1 z_iFr6)3?yQhwgoJx6$3MVBL`a85s;B;tiR=FbO fMwA;+t~+sb`FI4HM;467xDe#%TH!;h`a1sr$AlAN diff --git a/MajorVersion.pyc b/MajorVersion.pyc deleted file mode 100644 index 9d50334216fbd580424d49fe6e346465ea0d5516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 852 zcmb_aO>fjN5PkM;x3DaQ3lhh@ROCe9zztO`hyzl)Ag{!Vy;xD=(roil#cpY(a-sdl z{Q>aC32+CZ%$u=2nfGR#(cQ!8bhljP7@iURKFvQP6nqsbpa#}}Dm02M6eHXMH^Aq$ zLNUfNnJ~Bf!6#9S!c)RgRvoup?TU|Ce(J)z%iNuXvTedF9&Xz1lj}S;elyFbZ)ko_ za3o}LA}N*dtw$ie1Y?+GB05VNa!rtx__s9wig3-3752YrT=NAsz^O*JJ1nh2Gecl) zjT?pUk*Y7cD5aQxLU`X?WK~(r>x^>e7roxd93Jra@Pj#69W1P|FT*{q>mkE1MxQoj zpy_ea)KmkbXsfB>cm;o}XPsGHc7G z4AyS5fERYCsd}VlI+r>AvN#V(=|`}P_p^xDE0IJa;{H{W^!3Gs9Xc;J0hMeK2dzz3 zJ8Q#~JJ!~1ab9t0B+tmdV?^Q~1u^=o(HQ9`-k+46=!w3+z32-^GHxQ~{139&+v~oY LJt2;bKh{41u0pE8 diff --git a/MalformedPacketException.pyc b/MalformedPacketException.pyc deleted file mode 100644 index 59580f0fa77d29968770d1af75c5378bb2bdb221..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 608 zcmcIhJx{|h5PeP&AC=e`5DRM-@E<@3ffzw38Bn`eQR2{)*p6Z&sMM|eWBvelHk64C zEWNYOclYl3Joz}B?wvM|HNMt__A7!vA=3aFXayR9cVGj|=Hz53bIuFLWbUfIb)(VE zLsdWPaQjy4A#~1e88b?{Cio*VM8^z7O^gEb3`Lo9Mj)W(6NA}r2(gAjOMx}87T9DE zR9)tRqW7utfR5X?VV^vuI@<-MQhbMrbl(PMHU2554bgb+As5bQxzwZ6R{F7)y&J37 z%F1CC7S5i1yT3j3d{`CC%=iKpn6B<7xPVAYz_j)`&=iECV@&4{?ZcK+SLz(}1cz%Oc9HWcy zb|e+aLl$y^z@)^AAaN#@DGvwl<3hGY#HG~lmE)RJgj{t!76 z`FYTkXhWX&Ht}1@zxeApu*&z)JqyyKNuI^gVGy3g<ctu^rLEi0_g-4(m{p zU;1%2jqM0d`78(zgIPKWA{%RKY&6M#it_?FXk?Q*@S`n>Hq~fLw53KzqP7~_5_Qzr zk!V|uU5R$oxFzO!Zx`S~7abefe~VW9g{~Aib>s}F9XS!n_oamGGV;44V+?Tl9(jzM ziuetV2ah{+no_PYI%-xQuS>acG13xf$1yD#Z84SnKBQ>M{+X*&wl&n0yPUE!ce-@I zOOW$506j>UlHwh7-;ZAhX%cnQNgn(XjJs1!dxB3SVLp<7SROmDN)KHcj}0DTv|y;f zi^Gyt5mi-DHsEE$C^s}f0N!hxcf;`|CCf?_jNybj>v3F`TMP%GKed&k@hl0UiHHT& z)30;ZB2JGCG4;@FS3H8%A5OBkKZ^57Jnk2H*q^iN{{VI`gK@tux<}KQV)OlEoRq$= zg6wfRXV2Mj_nZ!%d(J&PLvpQ}CcA?Gvw%19O;!2vfdVunVmO@!4a;RUn3NX^`6?RM zXh9+5s<^o5ZWI?eDz15YKY+g!+B!b8l2u|+GDB`Rr4vg{@u2uVf?Z*uT2-slXIG%^ zwQnNgaLt?r2yeA2E0{jO+Q&o{tg52;tYIyyDw4a=?6HQa)?(q_KZmW7i%-RN8^&UL z<8Fd|=YMst`6Nuc3|RL@T^QF_k1(m;0_Fn-i0iTiu%ya3$xT%mw;iprdartjPzC7? z<#exDR%{B4U$MoeF1+i@MRZzhHM&n3x}sp)#GnaXefwfgRInuc>>QM<38jE)q144> z*B6SYRH!8U{2VHBu8?Wr6SCd6jve_8dDK*5+aKXv7x}Udd6iRbCp@Wi|1iv}9%SXj z$1!UzveBb&I-FHUUk{_NP0W0VFMoknaP5iHc5d?st2hyp^7;gZ0ddEshe;|&^T z-r{KEscm`id^^gs3az3KC)xB>8T&Y}4R00ZEp+uhpojTMJX?*~UCj9ytt#eljv0n*WAJY!%>Dupw_i{o0gXOyR>*EGk4g%&yLq1U4@1@ zHO#!BY=*yGqgU%1w^qZI$h%z8MYra*+AZ&r*P4wT*dOF2+MwBcyWYd~_N{kxopE(w TD&u1-+*d5pf+%;L`OEze@zcaz diff --git a/__init__.py b/__init__.py index 19c46eb..dab818a 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,7 @@ from PhyPayload import PhyPayload -def new(packet): - return PhyPayload(packet) +def new(packet = None): + phy_payload = PhyPayload() + if packet: + phy_payload.packet(packet) + return phy_payload diff --git a/__init__.pyc b/__init__.pyc deleted file mode 100644 index d5922696445d6adc64d11547703350d30d2941ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmb79L2AP=5FFVhgg~Gl$lZrfJs_nNaxEdGhd?hzSOPn>tzanxLvQUn`pG_^omB!o zM`&k;UF{6Yf9A9ARlTopJsJ6#6&3``tIz@+@CGQG;fqSa=6Egc_@epcDHK(l5w`WX zHDl|It)wR9ZmJ_Vv(8xVM)-n@0>ok!Mk3Eq0+4% z%-Qt%g}f)1Wz#pYEFX?z%(>9Jvrv$Ds7)c9f_9?*-IKaKVoH<8&f8P#p5!Mf=RW%b Db@M`D