(msg *ttnpb.Message, config lorawanConfig)
| 134 | } |
| 135 | |
| 136 | func decodeJoinAccept(msg *ttnpb.Message, config lorawanConfig) (*lorawanDecodedFrame, error) { |
| 137 | pld := msg.GetJoinAcceptPayload() |
| 138 | key, keyName := config.getJoinAcceptDecodeKey() |
| 139 | if key.IsZero() { |
| 140 | logger.Warnf("No %s provided, skipping join accept decryption", keyName) |
| 141 | } else { |
| 142 | buf, err := crypto.DecryptJoinAccept(key, pld.Encrypted) |
| 143 | if err != nil { |
| 144 | return nil, err |
| 145 | } |
| 146 | n := len(buf) |
| 147 | if n < 4 { |
| 148 | logger.WithFields(log.Fields("length", n, "minimum", 4)).Warn("Invalid Join Accept message length") |
| 149 | return &lorawanDecodedFrame{Message: msg}, nil |
| 150 | } |
| 151 | buf, mic := buf[:n-4], buf[n-4:] |
| 152 | decBuf := ttnpb.Clone(pld) |
| 153 | if err := lorawan.UnmarshalJoinAcceptPayload(buf, decBuf); err != nil { |
| 154 | logger.WithError(err).Warn("Failed to unmarshal join accept payload") |
| 155 | return &lorawanDecodedFrame{Message: msg}, nil |
| 156 | } |
| 157 | |
| 158 | msg.Mic = mic |
| 159 | msg.Payload = &ttnpb.Message_JoinAcceptPayload{ |
| 160 | JoinAcceptPayload: decBuf, |
| 161 | } |
| 162 | } |
| 163 | return &lorawanDecodedFrame{Message: msg}, nil |
| 164 | } |
| 165 | |
| 166 | func decodeDownlink(msg *ttnpb.Message, config lorawanConfig) (*lorawanDecodedFrame, error) { |
| 167 | pld := msg.GetMacPayload() |
no test coverage detected