(msg *ttnpb.Message, config lorawanConfig)
| 164 | } |
| 165 | |
| 166 | func decodeDownlink(msg *ttnpb.Message, config lorawanConfig) (*lorawanDecodedFrame, error) { |
| 167 | pld := msg.GetMacPayload() |
| 168 | devAddr := types.MustDevAddr(pld.FHdr.DevAddr).OrZero() |
| 169 | macBuf := getMacBuffer(pld) |
| 170 | cmdsInFOpts := len(pld.FHdr.FOpts) > 0 |
| 171 | if len(macBuf) > 0 && (!cmdsInFOpts || macspec.EncryptFOpts(config.MACVersion)) && !config.NwkSKey.IsZero() { |
| 172 | logger.Debug("Decrypting MAC buffer") |
| 173 | encOpts := macspec.EncryptionOptions(config.MACVersion, macspec.DownlinkFrame, pld.FPort, cmdsInFOpts) |
| 174 | for msb := range uint32(0xffff) { |
| 175 | fCnt := msb<<16 | pld.FHdr.FCnt |
| 176 | macBuf, err := crypto.DecryptDownlink(config.NwkSKey, devAddr, fCnt, macBuf, encOpts...) |
| 177 | if err == nil { |
| 178 | setMacBuffer(pld, macBuf) |
| 179 | break |
| 180 | } |
| 181 | logger.WithField("f_cnt", fCnt).Debug("Failed attempt to decrypt MAC buffer") |
| 182 | } |
| 183 | } |
| 184 | var macCommands []*ttnpb.MACCommand |
| 185 | for r := bytes.NewReader(macBuf); r.Len() > 0; { |
| 186 | cmd := &ttnpb.MACCommand{} |
| 187 | if err := lorawan.DefaultMACCommands.ReadDownlink(config.Band, r, cmd); err != nil { |
| 188 | logger.WithError(err).Warn("Failed to read MAC command") |
| 189 | } else { |
| 190 | macCommands = append(macCommands, cmd) |
| 191 | } |
| 192 | } |
| 193 | if pld.FPort > 0 { |
| 194 | if config.AppSKey.IsZero() { |
| 195 | logger.Warn("No AppSKey provided, skipping application payload decryption") |
| 196 | } else { |
| 197 | logger.Debug("Decrypting application payload") |
| 198 | buf, err := crypto.DecryptDownlink(config.AppSKey, devAddr, pld.FHdr.FCnt, pld.FrmPayload) |
| 199 | if err != nil { |
| 200 | logger.WithField("f_cnt", pld.FHdr.FCnt).Debug("Failed attempt to decrypt FrmPayload") |
| 201 | } else { |
| 202 | pld.FrmPayload = buf |
| 203 | } |
| 204 | } |
| 205 | } |
| 206 | |
| 207 | msg.Payload = &ttnpb.Message_MacPayload{ |
| 208 | MacPayload: pld, |
| 209 | } |
| 210 | |
| 211 | if !config.FNwkSIntKey.IsZero() { |
| 212 | logger.Debug("Verification of the uplink message MIC is not implemented yet") |
| 213 | } |
| 214 | return &lorawanDecodedFrame{ |
| 215 | Message: msg, |
| 216 | MACCommands: macCommands, |
| 217 | }, nil |
| 218 | } |
| 219 | |
| 220 | func decodeFrame(msg *ttnpb.Message, config lorawanConfig) (*lorawanDecodedFrame, error) { |
| 221 | switch msg.MHdr.MType { |
no test coverage detected