Skip to content

Commit 791a488

Browse files
authored
wip (#3)
1 parent 754a393 commit 791a488

12 files changed

+234
-119
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
1-
# abapGit-ssh
2-
testing test
1+
# open-abap-ssh
2+
SSH client implemented in ABAP, over TCP/IP with 1 byte frame sizes = slow.
3+
4+
https://datatracker.ietf.org/doc/html/rfc4251 - The Secure Shell (SSH) Protocol Architecture
5+
https://datatracker.ietf.org/doc/html/rfc4252 - The Secure Shell (SSH) Authentication Protocol
6+
https://datatracker.ietf.org/doc/html/rfc4253 - The Secure Shell (SSH) Transport Layer Protocol
7+
https://datatracker.ietf.org/doc/html/rfc4254 - The Secure Shell (SSH) Connection Protocol

package-lock.json

Lines changed: 21 additions & 87 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
},
1919
"homepage": "https://github.com/open-abap/open-abap-ssh#readme",
2020
"dependencies": {
21-
"@abaplint/cli": "^2.85.32",
22-
"@abaplint/runtime": "^1.8.11",
23-
"@abaplint/transpiler-cli": "^1.8.11"
21+
"@abaplint/cli": "^2.89.0",
22+
"@abaplint/runtime": "^2.0.9",
23+
"@abaplint/transpiler-cli": "^2.0.9"
2424
}
2525
}

src/zcl_oassh.clas.abap

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ CLASS zcl_oassh DEFINITION
2121
key_exchange TYPE i VALUE 2,
2222
END OF gc_state .
2323
DATA mi_client TYPE REF TO if_apc_wsp_client .
24-
DATA mv_buffer TYPE xstring .
24+
DATA mo_stream TYPE REF TO zcl_oassh_stream .
2525
DATA mv_state TYPE i .
2626

27-
METHODS handle .
27+
METHODS handle
28+
RAISING
29+
cx_apc_error .
2830
METHODS send
2931
IMPORTING
3032
!iv_message TYPE xstring
@@ -34,7 +36,7 @@ ENDCLASS.
3436

3537

3638

37-
CLASS zcl_oassh IMPLEMENTATION.
39+
CLASS ZCL_OASSH IMPLEMENTATION.
3840

3941

4042
METHOD connect.
@@ -44,6 +46,8 @@ CLASS zcl_oassh IMPLEMENTATION.
4446

4547
CREATE OBJECT lo_ssh.
4648

49+
CREATE OBJECT lo_ssh->mo_stream.
50+
4751
ls_frame-frame_type = if_apc_tcp_frame_types=>co_frame_type_fixed_length.
4852
ls_frame-fixed_length = 1.
4953

@@ -61,30 +65,31 @@ CLASS zcl_oassh IMPLEMENTATION.
6165
METHOD handle.
6266

6367
DATA lv_remote_version TYPE string.
64-
DATA lo_stream TYPE REF TO zcl_oassh_stream.
6568
DATA lv_padding_length TYPE i.
6669
DATA lv_length TYPE i.
6770
DATA ls_kexinit TYPE zcl_oassh_message_20=>ty_data.
6871

6972
CASE mv_state.
7073
WHEN gc_state-protocol_version_exchange.
71-
IF mv_buffer CP |*{ cl_abap_codepage=>convert_to( |{ cl_abap_char_utilities=>cr_lf }| ) }|.
72-
lv_remote_version = cl_abap_codepage=>convert_from( mv_buffer ).
73-
CLEAR mv_buffer.
74+
IF mo_stream->get( ) CP |*{ cl_abap_codepage=>convert_to( |{ cl_abap_char_utilities=>cr_lf }| ) }|.
75+
lv_remote_version = cl_abap_codepage=>convert_from( mo_stream->get( ) ).
76+
mo_stream->clear( ).
7477
mv_state = gc_state-key_exchange.
7578
ENDIF.
7679
WHEN gc_state-key_exchange.
77-
* todo, check buffer contains a full packet, and return the packet payload
7880
* https://datatracker.ietf.org/doc/html/rfc4253#section-7
7981

80-
IF xstrlen( mv_buffer ) > 4.
81-
CREATE OBJECT lo_stream EXPORTING iv_hex = mv_buffer.
82-
lv_length = lo_stream->uint32_decode( ).
83-
IF lo_stream->get_length( ) = lv_length.
82+
IF mo_stream->get_length( ) > 4.
83+
lv_length = mo_stream->uint32_decode_peek( ).
84+
IF mo_stream->get_length( ) = lv_length.
85+
mo_stream->uint32_decode( ).
8486
* there is no MAC negotiated at this point in time
85-
lv_padding_length = lo_stream->take( 1 ).
86-
ls_kexinit = zcl_oassh_message_20=>parse( lo_stream ).
87-
lo_stream->take( lv_padding_length ).
87+
lv_padding_length = mo_stream->take( 1 ).
88+
ls_kexinit = zcl_oassh_message_20=>parse( mo_stream ).
89+
mo_stream->take( lv_padding_length / 2 ).
90+
91+
ls_kexinit-cookie = '11223344556677881122334455667788'. " todo, this should value should be random
92+
send( zcl_oassh_message_20=>serialize( ls_kexinit )->get( ) ).
8893
ENDIF.
8994
ENDIF.
9095

@@ -94,11 +99,13 @@ CLASS zcl_oassh IMPLEMENTATION.
9499

95100

96101
METHOD if_apc_wsp_event_handler~on_close.
102+
BREAK-POINT.
97103
WRITE / 'on_close'.
98104
ENDMETHOD.
99105

100106

101107
METHOD if_apc_wsp_event_handler~on_error.
108+
BREAK-POINT.
102109
WRITE / 'on_error'.
103110
ENDMETHOD.
104111

@@ -108,17 +115,17 @@ CLASS zcl_oassh IMPLEMENTATION.
108115

109116
TRY.
110117
lv_message = i_message->get_binary( ).
111-
CATCH cx_root.
118+
mo_stream->append( lv_message ).
119+
handle( ).
120+
CATCH cx_root INTO DATA(lx_error).
121+
BREAK-POINT.
112122
ENDTRY.
113-
mv_buffer = mv_buffer && lv_message.
114-
115-
handle( ).
116-
117123
ENDMETHOD.
118124

119125

120126
METHOD if_apc_wsp_event_handler~on_open.
121127
DATA lv_xstr TYPE xstring.
128+
BREAK-POINT.
122129

123130
WRITE / 'on_open'.
124131

@@ -141,8 +148,8 @@ CLASS zcl_oassh IMPLEMENTATION.
141148

142149
DATA li_message_manager TYPE REF TO if_apc_wsp_message_manager.
143150
DATA li_message TYPE REF TO if_apc_wsp_message.
144-
DATA lv_index TYPE i.
145-
DATA lv_hex TYPE xstring.
151+
DATA lv_index TYPE i.
152+
DATA lv_hex TYPE xstring.
146153

147154
li_message_manager ?= mi_client->get_message_manager( ).
148155

@@ -158,4 +165,4 @@ CLASS zcl_oassh IMPLEMENTATION.
158165
ENDDO.
159166

160167
ENDMETHOD.
161-
ENDCLASS.
168+
ENDCLASS.

src/zcl_oassh.clas.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<VSEOCLASS>
66
<CLSNAME>ZCL_OASSH</CLSNAME>
77
<LANGU>E</LANGU>
8-
<DESCRIPT>ssh test</DESCRIPT>
8+
<DESCRIPT>open-abap-ssh</DESCRIPT>
99
<STATE>1</STATE>
1010
<CLSCCINCL>X</CLSCCINCL>
1111
<FIXPT>X</FIXPT>

src/zcl_oassh_message_20.clas.abap

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ ENDCLASS.
4343

4444

4545

46-
CLASS ZCL_OASSH_MESSAGE_20 IMPLEMENTATION.
46+
CLASS zcl_oassh_message_20 IMPLEMENTATION.
4747

4848

4949
METHOD parse.
50+
* https://datatracker.ietf.org/doc/html/rfc4253#section-7.1
51+
* SSH_MSG_KEXINIT
5052

5153
rs_data-message_id = io_stream->take( 1 ).
5254
ASSERT rs_data-message_id = gc_message_id.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
CLASS zcl_oassh_message_ecdh_30 DEFINITION
2+
PUBLIC
3+
FINAL
4+
CREATE PUBLIC .
5+
6+
PUBLIC SECTION.
7+
8+
TYPES:
9+
BEGIN OF ty_data,
10+
message_id TYPE x LENGTH 1,
11+
q_c TYPE xstring,
12+
END OF ty_data .
13+
14+
CONSTANTS gc_message_id TYPE x LENGTH 1 VALUE '1E'. " is 30 in decimal
15+
16+
CLASS-METHODS parse
17+
IMPORTING
18+
!io_stream TYPE REF TO zcl_oassh_stream
19+
RETURNING
20+
VALUE(rs_data) TYPE ty_data .
21+
22+
CLASS-METHODS serialize
23+
IMPORTING
24+
is_data TYPE ty_data
25+
RETURNING
26+
VALUE(ro_stream) TYPE REF TO zcl_oassh_stream .
27+
28+
PROTECTED SECTION.
29+
PRIVATE SECTION.
30+
ENDCLASS.
31+
32+
33+
34+
CLASS ZCL_OASSH_MESSAGE_ECDH_30 IMPLEMENTATION.
35+
36+
37+
METHOD parse.
38+
BREAK-POINT.
39+
ENDMETHOD.
40+
41+
42+
METHOD serialize.
43+
BREAK-POINT.
44+
ENDMETHOD.
45+
ENDCLASS.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_OASSH_MESSAGE_ECDH_30</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>SSH_MSG_KEX_ECDH_INIT</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
</VSEOCLASS>
14+
</asx:values>
15+
</asx:abap>
16+
</abapGit>

0 commit comments

Comments
 (0)