generate_signature

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.