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