on
NB-IOT MEF인증 예제
NB-IOT MEF인증 예제
센서의 데이터 <-> NB_IOT <-> ServerProgram으로의 흐름
MEF인증
서버SEQ+ 서버넘 + 서비스코드 조합 요청
ReqHeader header = new ReqHeader();
header.Url = mefUrl + "/mef/server";
header.Method = "POST";
header.ContentType = "application/xml";
header.X_M2M_RI = string.Empty;
header.X_M2M_Origin = string.Empty;
header.X_MEF_TK = string.Empty;
header.X_MEF_EKI = string.Empty;
header.X_M2M_NM = string.Empty;
string packetStr = "";
packetStr += "";
packetStr += "" + 서버SEQ+ "";
packetStr += "" + 서비스코드 + "";
packetStr += "" + 서버넘 + "";
packetStr += "";
string retStr = SendHttpRequest(header, packetStr);
if (retStr != string.Empty)
{
ParsingXml(retStr); //xml 형식 parsing method
string nameCSR = svr.entityId.Replace("-", "");
lbremoteCSEName.Text = "csr-" + nameCSR;
svr.remoteCSEName = lbremoteCSEName.Text;
//LogWrite("svr.remoteCSEName = " + svr.remoteCSEName);
}
private void ParsingXml(string xml)
{
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xml);
//LogWrite(xDoc.OuterXml.ToString());
XmlNodeList xnList = xDoc.SelectNodes("/authdata/http"); //접근할 노드
foreach (XmlNode xn in xnList)
{
svr.enrmtKey = xn["enrmtKey"].InnerText; // oneM2M 인증 KeyID를 생성하기 위한 Key
svr.entityId = xn["entityId"].InnerText; // oneM2M에서 사용하는 단말 ID
svr.token = xn["token"].InnerText; // 인증구간 통신을 위해 발급하는 Token
}
//LogWrite("enrmtKey = " + svr.enrmtKey);
//LogWrite("entityId = " + svr.entityId);
//LogWrite("token = " + svr.token);
lbEnrmtKey.Text = svr.enrmtKey;
lbEntityId.Text = svr.entityId;
lbToken.Text = svr.token;
// EKI값 계산하기
// short uuid구하기
string suuid = svr.entityId.Substring(10, 10);
//LogWrite("suuid = " + suuid);
// KeyData Base64URL Decoding
string output = svr.enrmtKey;
output = output.Replace('-', '+'); // 62nd char of encoding
output = output.Replace('_', '/'); // 63rd char of encoding
switch (output.Length % 4) // Pad with trailing '='s
{
case 0:
break; // No pad chars in this case
case 2:
output += "==";
break; // Two pad chars
case 3:
output += "=";
break; // One pad char
default:
throw new ArgumentOutOfRangeException(
nameof(svr.enrmtKey), "Illegal base64url string!");
}
var converted = Convert.FromBase64String(output); // Standard base64 decoder
// keyData로 AES 128비트 비밀키 생성
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
AesManaged tdes = new AesManaged();
tdes.Key = converted;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform crypt = tdes.CreateEncryptor();
byte[] plain = Encoding.UTF8.GetBytes(suuid);
byte[] cipher = crypt.TransformFinalBlock(plain, 0, plain.Length);
String enrmtKeyId = Convert.ToBase64String(cipher);
enrmtKeyId = enrmtKeyId.Split('=')[0]; // Remove any trailing '='s
enrmtKeyId = enrmtKeyId.Replace('+', '-'); // 62nd char of encoding
enrmtKeyId = enrmtKeyId.Replace('/', '_'); // 63rd char of encoding
lbEnrmtKeyId.Text = enrmtKeyId;
svr.enrmtKeyId = enrmtKeyId;
//LogWrite("svr.enrmtKeyId = " + svr.enrmtKeyId);
}
from http://onecall.tistory.com/4 by ccl(A) rewrite - 2021-11-03 18:01:18