Lwm2m base64 back fix bug "bas64" on review
This commit is contained in:
parent
e8444f8bdc
commit
9186377b97
@ -1,45 +0,0 @@
|
||||
/**
|
||||
* Copyright © 2016-2021 The Thingsboard Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.common.data.device.credentials.lwm2m;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.SneakyThrows;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.codec.binary.Hex;
|
||||
|
||||
public abstract class AbstractLwM2MClientCredentialsWithKey extends AbstractLwM2MClientCredentials {
|
||||
@Getter
|
||||
@Setter
|
||||
private String key;
|
||||
|
||||
private byte[] keyInBytes;
|
||||
|
||||
@SneakyThrows
|
||||
@JsonIgnore
|
||||
public byte[] getDecodedKey() throws IllegalArgumentException {
|
||||
if (keyInBytes == null) {
|
||||
if (this.getSecurityConfigClientMode() == LwM2MSecurityMode.PSK) {
|
||||
keyInBytes = Hex.decodeHex(key.toLowerCase().toCharArray());
|
||||
}
|
||||
else {
|
||||
keyInBytes = Base64.decodeBase64(key.getBytes());
|
||||
}
|
||||
}
|
||||
return keyInBytes;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Copyright © 2016-2021 The Thingsboard Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.common.data.device.credentials.lwm2m;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.codec.DecoderException;
|
||||
|
||||
public abstract class AbstractLwM2MClientSecurityCredentials extends AbstractLwM2MClientCredentials {
|
||||
@Getter
|
||||
@Setter
|
||||
protected String key;
|
||||
|
||||
protected byte[] securityInBytes;
|
||||
|
||||
public abstract byte[] getDecoded() throws IllegalArgumentException, DecoderException;
|
||||
}
|
||||
@ -17,14 +17,24 @@ package org.thingsboard.server.common.data.device.credentials.lwm2m;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.apache.commons.codec.DecoderException;
|
||||
import org.apache.commons.codec.binary.Hex;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class PSKClientCredentials extends AbstractLwM2MClientCredentialsWithKey {
|
||||
public class PSKClientCredentials extends AbstractLwM2MClientSecurityCredentials {
|
||||
private String identity;
|
||||
|
||||
@Override
|
||||
public LwM2MSecurityMode getSecurityConfigClientMode() {
|
||||
return LwM2MSecurityMode.PSK;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getDecoded() throws IllegalArgumentException, DecoderException {
|
||||
if (securityInBytes == null) {
|
||||
securityInBytes = Hex.decodeHex(key.toLowerCase().toCharArray());
|
||||
}
|
||||
return securityInBytes;
|
||||
}
|
||||
}
|
||||
@ -15,10 +15,21 @@
|
||||
*/
|
||||
package org.thingsboard.server.common.data.device.credentials.lwm2m;
|
||||
|
||||
public class RPKClientCredentials extends AbstractLwM2MClientCredentialsWithKey {
|
||||
import org.apache.commons.codec.DecoderException;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
|
||||
public class RPKClientCredentials extends AbstractLwM2MClientSecurityCredentials {
|
||||
|
||||
@Override
|
||||
public LwM2MSecurityMode getSecurityConfigClientMode() {
|
||||
return LwM2MSecurityMode.RPK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getDecoded() throws IllegalArgumentException, DecoderException {
|
||||
if (securityInBytes == null) {
|
||||
securityInBytes = Base64.decodeBase64(key.getBytes());
|
||||
}
|
||||
return securityInBytes;
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,30 +15,27 @@
|
||||
*/
|
||||
package org.thingsboard.server.common.data.device.credentials.lwm2m;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.SneakyThrows;
|
||||
import org.apache.commons.codec.DecoderException;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class X509ClientCredentials extends AbstractLwM2MClientCredentials {
|
||||
private String cert;
|
||||
public class X509ClientCredentials extends AbstractLwM2MClientSecurityCredentials {
|
||||
|
||||
private byte[] certInBytes;
|
||||
private String cert;
|
||||
|
||||
@Override
|
||||
public LwM2MSecurityMode getSecurityConfigClientMode() {
|
||||
return LwM2MSecurityMode.X509;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@JsonIgnore
|
||||
public byte[] getDecodedCert() throws IllegalArgumentException {
|
||||
if (certInBytes == null) {
|
||||
certInBytes = Base64.decodeBase64(cert.getBytes());
|
||||
@Override
|
||||
public byte[] getDecoded() throws IllegalArgumentException, DecoderException {
|
||||
if (securityInBytes == null && cert != null) {
|
||||
securityInBytes = Base64.decodeBase64(cert.getBytes());
|
||||
}
|
||||
return certInBytes;
|
||||
return securityInBytes;
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,6 +17,7 @@ package org.thingsboard.server.transport.lwm2m.secure;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.codec.DecoderException;
|
||||
import org.eclipse.leshan.core.util.SecurityUtil;
|
||||
import org.eclipse.leshan.server.security.SecurityInfo;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -146,14 +147,14 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
||||
PSKClientCredentials pskConfig = (PSKClientCredentials) clientCredentialsConfig;
|
||||
if (StringUtils.isNotEmpty(pskConfig.getIdentity())) {
|
||||
try {
|
||||
if (pskConfig.getDecodedKey() != null && pskConfig.getDecodedKey().length > 0) {
|
||||
if (pskConfig.getDecoded() != null && pskConfig.getDecoded().length > 0) {
|
||||
endpoint = StringUtils.isNotEmpty(pskConfig.getEndpoint()) ? pskConfig.getEndpoint() : endpoint;
|
||||
if (endpoint != null && !endpoint.isEmpty()) {
|
||||
result.setSecurityInfo(SecurityInfo.newPreSharedKeyInfo(endpoint, pskConfig.getIdentity(), pskConfig.getDecodedKey()));
|
||||
result.setSecurityInfo(SecurityInfo.newPreSharedKeyInfo(endpoint, pskConfig.getIdentity(), pskConfig.getDecoded()));
|
||||
result.setSecurityMode(PSK);
|
||||
}
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
} catch (IllegalArgumentException | DecoderException e) {
|
||||
log.error("Missing PSK key: " + e.getMessage());
|
||||
}
|
||||
} else {
|
||||
@ -164,14 +165,14 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
||||
private void createClientSecurityInfoRPK(TbLwM2MSecurityInfo result, String endpoint, LwM2MClientCredentials clientCredentialsConfig) {
|
||||
RPKClientCredentials rpkConfig = (RPKClientCredentials) clientCredentialsConfig;
|
||||
try {
|
||||
if (rpkConfig.getDecodedKey() != null) {
|
||||
PublicKey key = SecurityUtil.publicKey.decode(rpkConfig.getDecodedKey());
|
||||
if (rpkConfig.getDecoded() != null) {
|
||||
PublicKey key = SecurityUtil.publicKey.decode(rpkConfig.getDecoded());
|
||||
result.setSecurityInfo(SecurityInfo.newRawPublicKeyInfo(endpoint, key));
|
||||
result.setSecurityMode(RPK);
|
||||
} else {
|
||||
log.error("Missing RPK key");
|
||||
}
|
||||
} catch (IllegalArgumentException | IOException | GeneralSecurityException e) {
|
||||
} catch (IllegalArgumentException | IOException | GeneralSecurityException | DecoderException e) {
|
||||
log.error("RPK: Invalid security info content: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -117,7 +117,7 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
|
||||
formatSimpleMqttCredentials(deviceCredentials);
|
||||
break;
|
||||
case LWM2M_CREDENTIALS:
|
||||
formatSimpleLwm2mCredentials(deviceCredentials);
|
||||
formatAndValidateSimpleLwm2mCredentials(deviceCredentials);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -160,7 +160,7 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
|
||||
deviceCredentials.setCredentialsValue(cert);
|
||||
}
|
||||
|
||||
private void formatSimpleLwm2mCredentials(DeviceCredentials deviceCredentials) {
|
||||
private void formatAndValidateSimpleLwm2mCredentials(DeviceCredentials deviceCredentials) {
|
||||
LwM2MDeviceCredentials lwM2MCredentials;
|
||||
try {
|
||||
lwM2MCredentials = JacksonUtil.fromString(deviceCredentials.getCredentialsValue(), LwM2MDeviceCredentials.class);
|
||||
@ -171,8 +171,6 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
|
||||
|
||||
String credentialsId = null;
|
||||
LwM2MClientCredentials clientCredentials = lwM2MCredentials.getClient();
|
||||
LwM2MServerCredentials bootstrapServer = lwM2MCredentials.getBootstrap().getBootstrapServer();
|
||||
LwM2MServerCredentials lwm2mServer = lwM2MCredentials.getBootstrap().getLwm2mServer();
|
||||
switch (clientCredentials.getSecurityConfigClientMode()) {
|
||||
case NO_SEC:
|
||||
case RPK:
|
||||
@ -264,7 +262,7 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
|
||||
try {
|
||||
String pubkClient = EncryptionUtil.pubkTrimNewLines(rpkCredentials.getKey());
|
||||
rpkCredentials.setKey(pubkClient);
|
||||
SecurityUtil.publicKey.decode(rpkCredentials.getDecodedKey());
|
||||
SecurityUtil.publicKey.decode(rpkCredentials.getDecoded());
|
||||
} catch (Exception e) {
|
||||
throw new DeviceCredentialsValidationException("LwM2M client RPK key should be in RFC7250 standard and support only EC algorithm and encoded to Base64 format!");
|
||||
}
|
||||
@ -275,7 +273,7 @@ public class DeviceCredentialsServiceImpl extends AbstractEntityService implemen
|
||||
try {
|
||||
String certClient = EncryptionUtil.certTrimNewLines(x509CCredentials.getCert());
|
||||
x509CCredentials.setCert(certClient);
|
||||
SecurityUtil.certificate.decode(x509CCredentials.getDecodedCert());
|
||||
SecurityUtil.certificate.decode(x509CCredentials.getDecoded());
|
||||
} catch (Exception e) {
|
||||
throw new DeviceCredentialsValidationException("LwM2M client X509 certificate should be in DER-encoded X509v3 format and support only EC algorithm and encoded to Base64 format!");
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user