in src/zadf/zcl_adf_service_oms_la.clas.abap [0:0]
METHOD generate_signature.
CONSTANTS : lc_key TYPE string VALUE 'SharedKey'.
DATA lo_conv TYPE REF TO cl_abap_conv_out_ce.
DATA :lv_sign_utf TYPE xstring,
lv_sign TYPE string,
lv_signature TYPE string,
lv_header TYPE string,
lv_key_enc TYPE string,
lv_key TYPE xstring.
** get time in RFC1123 format
CLEAR gv_timestamp.
CALL METHOD me->get_rfc1123_time
IMPORTING
ev_timestamp = gv_timestamp.
** Build signature string
CALL METHOD me->generate_sign_string
EXPORTING
iv_verb = 'POST'
iv_length = iv_json_len
iv_timestamp = gv_timestamp
IMPORTING
ev_sign_text = lv_sign.
** Convert string to UTF-8 format
lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
lo_conv->convert( EXPORTING data = lv_sign IMPORTING buffer = lv_sign_utf ).
DEFINE encrypt_signature.
decode_sign( receiving rv_secret = lv_key_enc ).
** Decode Key from base64
call function 'SSFC_BASE64_DECODE'
exporting
b64data = lv_key_enc
importing
bindata = lv_key
exceptions
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_input_data_error = 5
ssf_krn_invalid_par = 6
ssf_krn_invalid_parlen = 7
others = 8.
if sy-subrc <> 0.
raise exception type zcx_adf_service
exporting
textid = zcx_adf_service=>key_decoding_failed
interface_id = gv_interface_id.
endif.
** Encode the signature with the Key in SHA 56 format
call method cl_abap_hmac=>calculate_hmac_for_raw
exporting
if_algorithm = 'sha-256'
if_key = lv_key
if_data = lv_sign_utf
if_length = 0
importing
ef_hmacb64string = lv_signature.
clear lv_key.
END-OF-DEFINITION.
** call macro
encrypt_signature.
** make prefix to signature
CONCATENATE lc_key gv_workspace_id INTO lv_header SEPARATED BY space.
** Construct header
CONCATENATE lv_header ':' lv_signature INTO ev_auth_head.