| 163 | } |
| 164 | |
| 165 | func (srv interopServer) AppSKeyRequest(ctx context.Context, in *interop.AppSKeyReq) (*interop.AppSKeyAns, error) { |
| 166 | ctx = log.NewContextWithField(ctx, "namespace", "joinserver/interop") |
| 167 | |
| 168 | req := &ttnpb.SessionKeyRequest{ |
| 169 | JoinEui: types.EUI64(in.ReceiverID).Bytes(), |
| 170 | DevEui: types.EUI64(in.DevEUI).Bytes(), |
| 171 | SessionKeyId: in.SessionKeyID, |
| 172 | } |
| 173 | if err := req.ValidateFields( |
| 174 | "join_eui", |
| 175 | "dev_eui", |
| 176 | "session_key_id", |
| 177 | ); err != nil { |
| 178 | return nil, interop.ErrMalformedMessage.WithCause(err) |
| 179 | } |
| 180 | |
| 181 | res, err := srv.JS.GetAppSKey(ctx, req, InteropAuthorizer) |
| 182 | if err != nil { |
| 183 | switch { |
| 184 | case errors.IsPermissionDenied(err): |
| 185 | return nil, interop.ErrActivation.WithCause(err) |
| 186 | case errors.IsNotFound(err): |
| 187 | return nil, interop.ErrUnknownDevEUI.WithCause(err) |
| 188 | } |
| 189 | return nil, err |
| 190 | } |
| 191 | |
| 192 | header, err := in.AnswerHeader() |
| 193 | if err != nil { |
| 194 | return nil, interop.ErrMalformedMessage.WithCause(err) |
| 195 | } |
| 196 | return &interop.AppSKeyAns{ |
| 197 | JsAsMessageHeader: interop.JsAsMessageHeader{ |
| 198 | MessageHeader: header, |
| 199 | SenderID: in.ReceiverID, |
| 200 | ReceiverID: in.SenderID, |
| 201 | }, |
| 202 | Result: interop.Result{ |
| 203 | ResultCode: interop.ResultSuccess, |
| 204 | }, |
| 205 | DevEUI: in.DevEUI, |
| 206 | AppSKey: (*interop.KeyEnvelope)(res.AppSKey), |
| 207 | SessionKeyID: in.SessionKeyID, |
| 208 | }, nil |
| 209 | } |