
एज्नोस्टिक ऑन-द-फ्लाई प्रोटोकॉल निर्माण के लिए इन-मेमोरी न्यूनतम CPU
Harald एक इन-मेमोरी छोटा हाई-लेवल CPU है, जो निर्देशों के एक सेट को प्रोसेस करके किसी दिए गए नेटवर्क प्रोटोकॉल (TCP/UDP) पर उपयोग किए जाने वाले एप्लिकेशन-लेयर प्रोटोकॉल उत्पन्न करने में सक्षम है।
Harald OPCODES की एक स्ट्रीम को उपभोग करेगा और पेलोड पर विभिन्न रूपांतरण लागू करेगा ताकि यह परिभाषित एप्लिकेशन-लेयर प्रोटोकॉल के लिए उपयुक्त हो सके।
[!TIP] Harald क्यों? आप डेनमार्क के राजा Harald Gormsson को उनके उपनाम से जानते होंगे: Blátǫnn, या जैसा हम आज इसे उच्चारित करते हैं, Bluetooth। इस तकनीक का नाम Harald के उपनाम पर रखा गया था क्योंकि उन्होंने उस समय डेनिश और वाइकिंग साम्राज्यों को जोड़ा था। इसलिए मैं इसे उनके पहले नाम पर नाम दे रहा हूँ।
Harald एक CPU की तरह व्यवहार करता है। यह OPCODES के एक सेट का पालन करता है जो क्रियाओं को परिभाषित करते हैं। एक PROTOCOL। Harald आवश्यक प्रोटोकॉल को तुरंत बनाने के लिए आवश्यक ऑपरेशनों को प्रोसेस करेगा।
एक बार PROTOCOL प्रदान किए जाने के बाद, Harald भेजे जाने वाले PAYLOAD पर पुनरावृत्ति करेगा, प्रत्येक फ्रैगमेंट के लिए पूरे PROTOCOL को एक बार पार करते हुए। अर्थात्: यदि पेलोड को कई फ्रैगमेंट में विभाजित करना पड़ा, तो Harald प्रत्येक फ्रैगमेंट के लिए समान प्रोटोकॉल का उपयोग करेगा, वर्तमान पेलोड फ्रैगमेंट के विरुद्ध प्रोटोकॉल में परिभाषित प्रत्येक क्रिया को निष्पादित करते हुए।
Harald मानों को संग्रहीत करने के लिए प्रोटोकॉल द्वारा उपयोग किए जाने वाले कई रजिस्ट्रियाँ रखता है। इन रजिस्ट्रियों का उपयोग कई ऑपरेशन करने के लिए किया जा सकता है, जैसे जोड़, घटाव, एन्कोडिंग और डिकोडिंग... आदि।
Harald गतिशील रूप से परिणामों की एक सरणी आवंटित करता है जहाँ प्रोटोकॉल पेलोड फ्रैगमेंट भेजने पर की गई प्रत्येक अनुरोध की प्रतिक्रियाओं को संग्रहीत कर सकता है।

Harald एक प्रोटोकॉल के रूप में प्रदान किए जाने वाले विभिन्न प्रकार के Opcodes का समर्थन करता है। Harald किसी दिए गए Opcode को प्राप्त करने पर उच्च-स्तरीय ऑपरेशनों का एक सेट निष्पादित करेगा। प्रत्येक Opcode एक पूर्वनिर्धारित लंबाई के साथ तर्कों के एक पूर्वनिर्धारित सेट की अपेक्षा करता है।
| OPCODE::Nº | Description | ARGS::Size |
|---|---|---|
| H_F_APPEND::0x01 | Appends the following N Bytes to the end payload | Size::4, NBytes::N |
| H_F_PREPEND::0x02 | Prepends the following N Bytes to the end payload | Size::4, NBytes::N |
| H_F_SPLIT::0x03 | Splits the Payload in fragments of the given size | Size::4 |
| H_F_PAYLOAD_INJECT::0x04 | Injects the Payload fragment into the End Payload | - |
| H_F_SOCK_INIT::0x05 | Initializes the socket connection | IsIPAddress:1, SSL_Enabled::1, TCP/UDP::1, [(HostLen::4,HostName:N)/IPAddress::4], Port::2 |
| H_F_SEND::0x06 | Sends the constructed End Payload | - |
| H_F_RECV::0x07 | Receives up to N Bytes | Size::4 |
| H_F_CLOSE::0x08 | Closes the socket and cleans | - |
| H_F_INJECT::0x09 | Injects the requested registry into the End Payload | Reg::1 |
| H_F_ENCODE_STR::0x0A | Encodes a Payload field to its string representation | IsReg::1, [(Payload::1, Field::1)/Reg::1], Format::1 |
| H_F_DECODE_STR::0xA0 | Decodes the contents of a registry to its numeric representation | Reg::1 |
| H_F_ENCODE_STRB64::0x0B | Encodes a Payload field to its B64string representation | Payload::1, Field::1 |
| H_F_COMPUTE_FRAG_LENGTH::0x0D | Calculates the next fragment to be sent length | - |
| H_F_SEARCH::0x0E | Searches for a given byte pattern of a given N size in a given registry | Reg::1, Size::4, NBytes::N |
| H_F_SEEK::0x0F | Moves the cursor in a given payload by a given number of bytes | Payload::1, Offset::4 |
| H_F_PUSH::0x10 | Pushes a number of bytes or the contents of a registry into another registry | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_ADD::0x12 | Adds two registries or a number to a registry | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_SUBSTRACT::0x13 | Substracts two registries or a number to a registry | IsReg::1, [Size::4, NBytes::N]/SrcReg::1, DstReg::2 |
| H_F_READ::0x14 | Reads from a given registry up to the length stored in another registry | FromReg::1, SizeReg::1 |
| H_F_STORE::0x15 | Stores a registry value into Harald's Storage | Reg::1 |
निम्नलिखित Opcode स्ट्रीम संचार को HTTP के रूप में समझे जाने के लिए भेजे जाने वाले आवश्यक डेटा को उत्पन्न करेगी। यह आरंभ करेगी, पेलोड को HTTP ट्रैफ़िक जैसा दिखने के लिए संशोधित करेगी, इसे SSL/TLS कनेक्शन पर भेजेगी, और अंत में कनेक्शन बंद करेगी।
H_F_SPLIT, 0x00, 0x00, 0x00, 0xFF, // Splits the Payload
H_F_APPEND, 0x00, 0x00, 0x00, 0x46, // Appends...
'P', 'O', 'S', 'T', ' ', '/', ' ', // POST /
'H', 'T', 'T', 'P', '/', '1', '.', '1', '\r', '\n', // HTTP/1.1
'H', 'o', 's', 't', ':', ' ', // Host:
'd', 'o', 'm', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\r', '\n', // domain.com
'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', ':', ' ', // Connection:
'c', 'l', 'o', 's', 'e', '\r', '\n', // close
'C', 'o', 'n', 't', 'e', 'n', 't', '-', // Content-
'L', 'e', 'n', 'g', 't', 'h', ':', ' ', // Length:
H_F_COMPUTE_FRAG_LENGTH, // Next Fragment's size
H_F_ENCODE_STR, H_PAY_END_PAYLOAD, H_PAY_FRAGMENT_SIZE, 'u', // FragSize encode
H_F_INJECT, H_REG_RET, // Inject the Fragment Size encoded str
H_F_APPEND, 0x00, 0x00, 0x00, 0x04, '\r', '\n', '\r', '\n', // Append Body begin
H_F_PAYLOAD_INJECT, // Inject the Payload
H_F_SOCK_INIT, 0x01, 0x01, 0x7F, 0x00, 0x00, 0x01, 0x04, 0xD2, // Init Socket
H_F_SEND, // Send the Payload over the socket
H_F_CLOSE // Close the socket and cleanup