mirror of
https://github.com/nonoo/kappanhang.git
synced 2025-12-06 08:02:00 +01:00
Add username/password encoding
This commit is contained in:
parent
47a882b6d7
commit
83e6fa3259
|
|
@ -28,9 +28,6 @@ go install https://github.com/nonoo/kappanhang
|
||||||
- Make sure network settings (on the Icom IC-705 in: `Menu -> Set ->
|
- Make sure network settings (on the Icom IC-705 in: `Menu -> Set ->
|
||||||
WLAN set -> Remote settings`) are the following:
|
WLAN set -> Remote settings`) are the following:
|
||||||
- **Network control** is turned on.
|
- **Network control** is turned on.
|
||||||
- **Network user 1** username is `beer` and the password is `beerbeer`.
|
|
||||||
These are fixed as the password encoding of the RS-BA1 protocol has not
|
|
||||||
been decrypted yet. See [passcode.txt](passcode.txt) for more information.
|
|
||||||
- **UDP ports** are on their default values:
|
- **UDP ports** are on their default values:
|
||||||
- Control port: `50001`
|
- Control port: `50001`
|
||||||
- Serial port: `50002`
|
- Serial port: `50002`
|
||||||
|
|
@ -48,7 +45,9 @@ You can get the available command line parameters with the `-h` command line
|
||||||
argument.
|
argument.
|
||||||
|
|
||||||
If no command line arguments are set, then the app will try to connect to the
|
If no command line arguments are set, then the app will try to connect to the
|
||||||
host **ic-705** (ic-705.local or ic-705.localdomain).
|
host **ic-705** (ic-705.local or ic-705.localdomain) with the username `beer`
|
||||||
|
and password `beerbeer`. You can set the username with the `-u` and the
|
||||||
|
password with the `-p` command line arguments.
|
||||||
|
|
||||||
After it is connected and logged in:
|
After it is connected and logged in:
|
||||||
|
|
||||||
|
|
|
||||||
6
args.go
6
args.go
|
|
@ -10,6 +10,8 @@ import (
|
||||||
|
|
||||||
var verboseLog bool
|
var verboseLog bool
|
||||||
var connectAddress string
|
var connectAddress string
|
||||||
|
var username string
|
||||||
|
var password string
|
||||||
var serialTCPPort uint16
|
var serialTCPPort uint16
|
||||||
var enableSerialDevice bool
|
var enableSerialDevice bool
|
||||||
var rigctldModel uint
|
var rigctldModel uint
|
||||||
|
|
@ -22,6 +24,8 @@ func parseArgs() {
|
||||||
h := getopt.BoolLong("help", 'h', "display help")
|
h := getopt.BoolLong("help", 'h', "display help")
|
||||||
v := getopt.BoolLong("verbose", 'v', "Enable verbose (debug) logging")
|
v := getopt.BoolLong("verbose", 'v', "Enable verbose (debug) logging")
|
||||||
a := getopt.StringLong("address", 'a', "IC-705", "Connect to address")
|
a := getopt.StringLong("address", 'a', "IC-705", "Connect to address")
|
||||||
|
u := getopt.StringLong("username", 'u', "beer", "Username")
|
||||||
|
p := getopt.StringLong("password", 'p', "beerbeer", "Password")
|
||||||
t := getopt.Uint16Long("serial-tcp-port", 't', 4533, "Expose radio's serial port on this TCP port")
|
t := getopt.Uint16Long("serial-tcp-port", 't', 4533, "Expose radio's serial port on this TCP port")
|
||||||
s := getopt.BoolLong("enable-serial-device", 's', "Expose radio's serial port as a virtual serial port")
|
s := getopt.BoolLong("enable-serial-device", 's', "Expose radio's serial port as a virtual serial port")
|
||||||
m := getopt.UintLong("rigctld-model", 'm', 3085, "rigctld model number")
|
m := getopt.UintLong("rigctld-model", 'm', 3085, "rigctld model number")
|
||||||
|
|
@ -40,6 +44,8 @@ func parseArgs() {
|
||||||
|
|
||||||
verboseLog = *v
|
verboseLog = *v
|
||||||
connectAddress = *a
|
connectAddress = *a
|
||||||
|
username = *u
|
||||||
|
password = *p
|
||||||
serialTCPPort = *t
|
serialTCPPort = *t
|
||||||
enableSerialDevice = *s
|
enableSerialDevice = *s
|
||||||
rigctldModel = *m
|
rigctldModel = *m
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,8 @@ func (s *controlStream) sendPktLogin() error {
|
||||||
if _, err := rand.Read(authStartID[:]); err != nil {
|
if _, err := rand.Read(authStartID[:]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
usernameEncoded := passcode(username)
|
||||||
|
passwordEncoded := passcode(password)
|
||||||
p := []byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
p := []byte{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
byte(s.common.localSID >> 24), byte(s.common.localSID >> 16), byte(s.common.localSID >> 8), byte(s.common.localSID),
|
byte(s.common.localSID >> 24), byte(s.common.localSID >> 16), byte(s.common.localSID >> 8), byte(s.common.localSID),
|
||||||
byte(s.common.remoteSID >> 24), byte(s.common.remoteSID >> 16), byte(s.common.remoteSID >> 8), byte(s.common.remoteSID),
|
byte(s.common.remoteSID >> 24), byte(s.common.remoteSID >> 16), byte(s.common.remoteSID >> 8), byte(s.common.remoteSID),
|
||||||
|
|
@ -52,10 +54,14 @@ func (s *controlStream) sendPktLogin() error {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x2b, 0x3f, 0x55, 0x5c, 0x00, 0x00, 0x00, 0x00, // username: beer
|
usernameEncoded[0], usernameEncoded[1], usernameEncoded[2], usernameEncoded[3],
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
usernameEncoded[4], usernameEncoded[5], usernameEncoded[6], usernameEncoded[7],
|
||||||
0x2b, 0x3f, 0x55, 0x5c, 0x3f, 0x25, 0x77, 0x58, // pass: beerbeer
|
usernameEncoded[8], usernameEncoded[9], usernameEncoded[10], usernameEncoded[11],
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
usernameEncoded[12], usernameEncoded[13], usernameEncoded[14], usernameEncoded[15],
|
||||||
|
passwordEncoded[0], passwordEncoded[1], passwordEncoded[2], passwordEncoded[3],
|
||||||
|
passwordEncoded[4], passwordEncoded[5], passwordEncoded[6], passwordEncoded[7],
|
||||||
|
passwordEncoded[8], passwordEncoded[9], passwordEncoded[10], passwordEncoded[11],
|
||||||
|
passwordEncoded[12], passwordEncoded[13], passwordEncoded[14], passwordEncoded[15],
|
||||||
0x69, 0x63, 0x6f, 0x6d, 0x2d, 0x70, 0x63, 0x00, // icom-pc in plain text
|
0x69, 0x63, 0x6f, 0x6d, 0x2d, 0x70, 0x63, 0x00, // icom-pc in plain text
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
|
@ -107,6 +113,7 @@ func (s *controlStream) sendRequestSerialAndAudio() error {
|
||||||
|
|
||||||
txSeqBufLengthMs := uint16(txSeqBufLength.Milliseconds())
|
txSeqBufLengthMs := uint16(txSeqBufLength.Milliseconds())
|
||||||
|
|
||||||
|
usernameEncoded := passcode(username)
|
||||||
p := []byte{0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
p := []byte{0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
byte(s.common.localSID >> 24), byte(s.common.localSID >> 16), byte(s.common.localSID >> 8), byte(s.common.localSID),
|
byte(s.common.localSID >> 24), byte(s.common.localSID >> 16), byte(s.common.localSID >> 8), byte(s.common.localSID),
|
||||||
byte(s.common.remoteSID >> 24), byte(s.common.remoteSID >> 16), byte(s.common.remoteSID >> 8), byte(s.common.remoteSID),
|
byte(s.common.remoteSID >> 24), byte(s.common.remoteSID >> 16), byte(s.common.remoteSID >> 8), byte(s.common.remoteSID),
|
||||||
|
|
@ -120,8 +127,10 @@ func (s *controlStream) sendRequestSerialAndAudio() error {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x2b, 0x3f, 0x55, 0x5c, 0x00, 0x00, 0x00, 0x00, // username: beer
|
usernameEncoded[0], usernameEncoded[1], usernameEncoded[2], usernameEncoded[3],
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
usernameEncoded[4], usernameEncoded[5], usernameEncoded[6], usernameEncoded[7],
|
||||||
|
usernameEncoded[8], usernameEncoded[9], usernameEncoded[10], usernameEncoded[11],
|
||||||
|
usernameEncoded[12], usernameEncoded[13], usernameEncoded[14], usernameEncoded[15],
|
||||||
0x01, 0x01, 0x04, 0x04, 0x00, 0x00, byte(audioSampleRate >> 8), byte(audioSampleRate & 0xff),
|
0x01, 0x01, 0x04, 0x04, 0x00, 0x00, byte(audioSampleRate >> 8), byte(audioSampleRate & 0xff),
|
||||||
0x00, 0x00, byte(audioSampleRate >> 8), byte(audioSampleRate & 0xff),
|
0x00, 0x00, byte(audioSampleRate >> 8), byte(audioSampleRate & 0xff),
|
||||||
0x00, 0x00, byte(serialStreamPort >> 8), byte(serialStreamPort & 0xff),
|
0x00, 0x00, byte(serialStreamPort >> 8), byte(serialStreamPort & 0xff),
|
||||||
|
|
@ -341,7 +350,7 @@ func (s *controlStream) init() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if bytes.Equal(r[48:52], []byte{0xff, 0xff, 0xff, 0xfe}) {
|
if bytes.Equal(r[48:52], []byte{0xff, 0xff, 0xff, 0xfe}) {
|
||||||
return errors.New("invalid user/password")
|
return errors.New("invalid username/password")
|
||||||
}
|
}
|
||||||
|
|
||||||
s.common.pkt7.startPeriodicSend(&s.common, 2, false)
|
s.common.pkt7.startPeriodicSend(&s.common, 2, false)
|
||||||
|
|
|
||||||
3
main.go
3
main.go
|
|
@ -58,6 +58,9 @@ func runControlStream(osSignal chan os.Signal) (requireWait, shouldExit bool, ex
|
||||||
if err := ctrl.init(); err != nil {
|
if err := ctrl.init(); err != nil {
|
||||||
log.Error(err)
|
log.Error(err)
|
||||||
ctrl.deinit()
|
ctrl.deinit()
|
||||||
|
if strings.Contains(err.Error(), "invalid username/password") {
|
||||||
|
return false, true, 1
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
107
passcode.go
Normal file
107
passcode.go
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
var sequence = map[int]byte{
|
||||||
|
32: 0x47,
|
||||||
|
33: 0x5d,
|
||||||
|
34: 0x4c,
|
||||||
|
35: 0x42,
|
||||||
|
36: 0x66,
|
||||||
|
37: 0x20,
|
||||||
|
38: 0x23,
|
||||||
|
39: 0x46,
|
||||||
|
40: 0x4e,
|
||||||
|
41: 0x57,
|
||||||
|
42: 0x45,
|
||||||
|
43: 0x3d,
|
||||||
|
44: 0x67,
|
||||||
|
45: 0x76,
|
||||||
|
46: 0x60,
|
||||||
|
47: 0x41,
|
||||||
|
48: 0x62,
|
||||||
|
49: 0x39,
|
||||||
|
50: 0x59,
|
||||||
|
51: 0x2d,
|
||||||
|
52: 0x68,
|
||||||
|
53: 0x7e,
|
||||||
|
54: 0x7c,
|
||||||
|
55: 0x65,
|
||||||
|
56: 0x7d,
|
||||||
|
57: 0x49,
|
||||||
|
58: 0x29,
|
||||||
|
59: 0x72,
|
||||||
|
60: 0x73,
|
||||||
|
61: 0x78,
|
||||||
|
62: 0x21,
|
||||||
|
63: 0x6e,
|
||||||
|
64: 0x5a,
|
||||||
|
65: 0x5e,
|
||||||
|
66: 0x4a,
|
||||||
|
67: 0x3e,
|
||||||
|
68: 0x71,
|
||||||
|
69: 0x2c,
|
||||||
|
70: 0x2a,
|
||||||
|
71: 0x54,
|
||||||
|
72: 0x3c,
|
||||||
|
73: 0x3a,
|
||||||
|
74: 0x63,
|
||||||
|
75: 0x4f,
|
||||||
|
76: 0x43,
|
||||||
|
77: 0x75,
|
||||||
|
78: 0x27,
|
||||||
|
79: 0x79,
|
||||||
|
80: 0x5b,
|
||||||
|
81: 0x35,
|
||||||
|
82: 0x70,
|
||||||
|
83: 0x48,
|
||||||
|
84: 0x6b,
|
||||||
|
85: 0x56,
|
||||||
|
86: 0x6f,
|
||||||
|
87: 0x34,
|
||||||
|
88: 0x32,
|
||||||
|
89: 0x6c,
|
||||||
|
90: 0x30,
|
||||||
|
91: 0x61,
|
||||||
|
92: 0x6d,
|
||||||
|
93: 0x7b,
|
||||||
|
94: 0x2f,
|
||||||
|
95: 0x4b,
|
||||||
|
96: 0x64,
|
||||||
|
97: 0x38,
|
||||||
|
98: 0x2b,
|
||||||
|
99: 0x2e,
|
||||||
|
100: 0x50,
|
||||||
|
101: 0x40,
|
||||||
|
102: 0x3f,
|
||||||
|
103: 0x55,
|
||||||
|
104: 0x33,
|
||||||
|
105: 0x37,
|
||||||
|
106: 0x25,
|
||||||
|
107: 0x77,
|
||||||
|
108: 0x24,
|
||||||
|
109: 0x26,
|
||||||
|
110: 0x74,
|
||||||
|
111: 0x6a,
|
||||||
|
112: 0x28,
|
||||||
|
113: 0x53,
|
||||||
|
114: 0x4d,
|
||||||
|
115: 0x69,
|
||||||
|
116: 0x22,
|
||||||
|
117: 0x5c,
|
||||||
|
118: 0x44,
|
||||||
|
119: 0x31,
|
||||||
|
120: 0x36,
|
||||||
|
121: 0x58,
|
||||||
|
122: 0x3b,
|
||||||
|
123: 0x7a,
|
||||||
|
124: 0x51,
|
||||||
|
125: 0x5f,
|
||||||
|
126: 0x52,
|
||||||
|
}
|
||||||
|
|
||||||
|
func passcode(s string) (res []byte) {
|
||||||
|
res = make([]byte, 16)
|
||||||
|
for i := 0; i < len(s) && i < len(res); i++ {
|
||||||
|
res[i] = sequence[int(s[i])+i]
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
101
passcode.txt
101
passcode.txt
|
|
@ -1,101 +0,0 @@
|
||||||
The following coding is used by the Icom software for encoding usernames and
|
|
||||||
passwords in login packets. Columns are: ASCII decimal, character, encoded
|
|
||||||
character. This listing is only valid for the first character. Subsequent
|
|
||||||
characters are encoded to different values, and the algorithm is currently
|
|
||||||
unknown.
|
|
||||||
|
|
||||||
32 space 0x47
|
|
||||||
33 ! 0x5d
|
|
||||||
34 " 0x4c
|
|
||||||
35 # 0x42
|
|
||||||
36 $ 0x66
|
|
||||||
37 % 0x20
|
|
||||||
38 & 0x23
|
|
||||||
39 ' 0x46
|
|
||||||
40 ( 0x4e
|
|
||||||
41 ) 0x57
|
|
||||||
42 * 0x45
|
|
||||||
43 + 0x3d
|
|
||||||
44 , 0x67
|
|
||||||
45 - 0x76
|
|
||||||
46 . 0x60
|
|
||||||
47 / 0x41
|
|
||||||
48 0 0x62
|
|
||||||
49 1 0x39
|
|
||||||
50 2 0x59
|
|
||||||
51 3 0x2d
|
|
||||||
52 4 0x68
|
|
||||||
53 5 0x7e
|
|
||||||
54 6 0x7c
|
|
||||||
55 7 0x65
|
|
||||||
56 8 0x7d
|
|
||||||
57 9 0x49
|
|
||||||
58 : 0x29
|
|
||||||
59 ; 0x72
|
|
||||||
60 < 0x73
|
|
||||||
61 = 0x78
|
|
||||||
62 > 0x21
|
|
||||||
63 ? 0x6e
|
|
||||||
64 @ 0x5a
|
|
||||||
65 A 0x5e
|
|
||||||
66 B 0x4a
|
|
||||||
67 C 0x3e
|
|
||||||
68 D 0x71
|
|
||||||
69 E 0x2c
|
|
||||||
70 F 0x2a
|
|
||||||
71 G 0x54
|
|
||||||
72 H 0x3c
|
|
||||||
73 I 0x3a
|
|
||||||
74 J 0x63
|
|
||||||
75 K 0x4f
|
|
||||||
76 L 0x43
|
|
||||||
77 M 0x75
|
|
||||||
78 N 0x27
|
|
||||||
79 O 0x79
|
|
||||||
80 P 0x5b
|
|
||||||
81 Q 0x35
|
|
||||||
82 R 0x70
|
|
||||||
83 S 0x48
|
|
||||||
84 T 0x6b
|
|
||||||
85 U 0x56
|
|
||||||
86 V 0x6f
|
|
||||||
87 W 0x34
|
|
||||||
88 X 0x32
|
|
||||||
89 Y 0x6c
|
|
||||||
90 Z 0x30
|
|
||||||
91 [ 0x61
|
|
||||||
92 \ 0x6d
|
|
||||||
93 ] 0x7b
|
|
||||||
94 ^ 0x2f
|
|
||||||
95 _ 0x4b
|
|
||||||
96 ` 0x64
|
|
||||||
97 a 0x38
|
|
||||||
98 b 0x2b
|
|
||||||
99 c 0x2e
|
|
||||||
100 d 0x50
|
|
||||||
101 e 0x40
|
|
||||||
102 f 0x3f
|
|
||||||
103 g 0x55
|
|
||||||
104 h 0x33
|
|
||||||
105 i 0x37
|
|
||||||
106 j 0x25
|
|
||||||
107 k 0x77
|
|
||||||
108 l 0x24
|
|
||||||
109 m 0x26
|
|
||||||
110 n 0x74
|
|
||||||
111 o 0x6a
|
|
||||||
112 p 0x28
|
|
||||||
113 q 0x53
|
|
||||||
114 r 0x4d
|
|
||||||
115 s 0x69
|
|
||||||
116 t 0x22
|
|
||||||
117 u 0x5c
|
|
||||||
118 v 0x44
|
|
||||||
119 w 0x31
|
|
||||||
120 x 0x36
|
|
||||||
121 y 0x58
|
|
||||||
122 z 0x3b
|
|
||||||
123 { 0x7a
|
|
||||||
124 | 0x51
|
|
||||||
125 } 0x5f
|
|
||||||
126 ~ 0x52
|
|
||||||
Loading…
Reference in a new issue