यह ज़रूरी है कि Tink सभी प्रोग्रामिंग भाषाओं में "एक जैसा" काम करे. यह सिद्धांत आसान नहीं है, लेकिन सबसे ज़रूरी है कि:
एक जैसा बनाए रखने के लिए, Tink क्रॉस-भाषा टेस्ट का इस्तेमाल करता है. इन्हें क्रॉस-भाषा GitHub डेटा स्टोर करने की जगह में देखा जा सकता है. ये टेस्ट, अलग-अलग भाषाओं के एक जैसे होने और एक-दूसरे के साथ काम करने की क्षमता की पुष्टि करते हैं.
हालांकि, एक जैसा कॉन्टेंट तय करना उतना आसान नहीं है जितना किसी को उम्मीद है. इसलिए, इस पेज पर हमारे काम करने की परिभाषा के बारे में बताया गया है. इसका मतलब है कि Tink दो तरह से एक जैसा अनुभव देता है:
- एक जैसे आकलन के लिए: दिए गए कीसेट के लिए1, अगर दो भाषाओं में शुरुआती सेट को बनाया जाता है, तो वे एक जैसा व्यवहार करते हैं.
- एक जैसा कॉन्टेंट बनाना: किसी भाषा में प्रिमिटिव बनने पर, वह तब ही सफल होती है, जब वह भाषा किसी कीसेट में सभी मुख्य टाइप के साथ काम करती हो, जैसा कि इस्तेमाल की जा सकने वाली कुंजी के टाइप की हमारी सूची में बताया गया है.
संदर्भ
हाई लेवल पर, Tink नीचे दिए गए एपीआई उपलब्ध कराता है:
कीसेट में बदलाव: Tink की मदद से, किसी कीसेट में नई कुंजियां जोड़ी जा सकती हैं, कीसेट से कुंजियां हटाई जा सकती हैं, और कीसेट में प्राथमिक कुंजी को बदला जा सकता है.
कीसेट को क्रम से लगाना: Tink में, कीसेट को बाइट के क्रम में रखने के लिए एपीआई उपलब्ध होते हैं. साथ ही, यह बाइट के क्रम से कीसेट को पार्स भी करता है.
शुरुआती क्रिएशन: Tink की मदद से, प्रिमिटिव के लिए इंटरफ़ेस बनाने के लिए एक एपीआई उपलब्ध होता है. उदाहरण के लिए, Java के किसी कीसेट से
Aead
ऑब्जेक्ट बनाने के लिए, उपयोगकर्ताkeysetHandle.getPrimitive(Aead.class, config)
को कॉल करता है.शुरुआती इस्तेमाल: प्रिमिटिव क्रिएशन चरण में बनाए गए इंटरफ़ेस, क्रिप्टोग्राफ़िक ऑपरेशन के लिए एक एपीआई उपलब्ध कराता है.
इन एपीआई के बारे में पूछने के लिए दो ज़रूरी सवाल हैं:
क्रिएशन: किसी सीरीज़ वाले कीसेट, भाषा, और प्रिमिटिव के लिए, क्या इस कीसेट से भाषा में प्रिमिटिव बनाया जा सकता है?
मूल्यांकन: अगर किसी दिए गए कीसेट से किसी भाषा में प्रिमिटिव बनाया जा सकता है, तो वह कैसे काम करती है?
यह ध्यान रखना ज़रूरी है कि Tink कीसेट को पार्स करते समय एक जैसा अनुभव नहीं देता. उदाहरण के लिए, ऐसा हो सकता है कि Tink C++
- CHACHA20-POLY1305 कुंजियों वाली कुंजियों को सफलतापूर्वक पार्स करता है, भले ही CHACHA20-POLY1305 AEAD ऑपरेशन Tink में लागू न किया गया हो;
- 1-बाइट की लंबाई वाली कुंजियों के साथ कीसेट को सफलतापूर्वक पार्स करता है, जो सभी क्रिप्टोग्राफ़िक ऑपरेशन में काम नहीं करेगा.
ये व्यवहार माइनर वर्शन में बदल सकते हैं.
आकलन का एक जैसा अनुभव देना
आकलन की एकरूपता, बनाने की प्रक्रिया में किसी भी समानता से ज़्यादा ज़रूरी है: अगर Java में कोई AEAD, C++ में AEAD के एन्क्रिप्शन को डिक्रिप्ट नहीं कर सकता है, तो उपयोगकर्ताओं के लिए एक गंभीर समस्या है.
आम तौर पर, Tink का लक्ष्य प्रिमिटिव के लिए साफ़ तौर पर एक जैसा रहना है. उदाहरण
के लिए, अगर कोई C++ बाइनरी 'public_key_sign->Sign(data)
' के साथ
हस्ताक्षर की गिनती करती है, तो उससे जुड़े Java पुष्टि कॉल
publicKeyVerify.verify(signature, data)
के सफल होने की उम्मीद होती है.
हालांकि, यहां कुछ चेतावनियां भी हैं. उदाहरण के लिए,
Java में aead.Encrypt
का रिटर्न टाइप byte[]
है.
Java लैंग्वेज स्पेसिफ़िकेशन (JLS) §10.7 के हिसाब से, ऐरे की लंबाई int
टाइप की है. हर §JLS 4.2.1 के हिसाब से, इसकी लंबाई ज़्यादा से ज़्यादा 2147483647 हो सकती है. इसलिए,
Java में 2147483647 लंबाई वाली किसी अरे को एन्क्रिप्ट (सुरक्षित) नहीं किया जा सकता: एन्क्रिप्शन में
कुछ ओवरहेड होता है, जिसका मतलब है
आउटपुट बहुत लंबा होगा. फिर भी, अन्य भाषाओं में इस तरह के इनपुट
के लिए एन्क्रिप्शन कामयाब होता है.
इसलिए, Tink इवैलुएशन को एक जैसा बनाए रखता है: किसी दिए गए कीसेट के लिए, अगर प्रिमिटिव को दो भाषाओं में बनाया जाता है, तो वे एक जैसा व्यवहार करते हैं.
इसका अपवाद यह है कि कुछ असाधारण परिस्थितियों में कुछ कार्रवाईयां विफल हो सकती हैं.
एक जैसा कॉन्टेंट बनाएं
सभी कीसेट के लिए, प्रिमिटिव बनाना हमेशा कामयाब नहीं होता. उदाहरण के लिए, अगर मुख्य कॉन्टेंट की लंबाई 128 बिट है, तो Tink उपयोगकर्ताओं को AesSivKey बनाने की अनुमति नहीं देता है.
फिर भी, Tink में इस तरह से एक जैसा अनुभव मिलता है: अगर दो भाषाओं में एक कुंजी टाइप के साथ काम करता है, तो कुंजियों का ऐसा सेट जिसके लिए प्रिमिटिव बनाया जा सकता है, एक साथ मेल खाता है. बिलकुल, अगर किसी भाषा के लिए किसी कुंजी टाइप का इस्तेमाल नहीं किया जा सकता, तो कोई भी शुरुआती ऑब्जेक्ट नहीं बनाया जा सकता.
आकलन के एक जैसे होने से ज़्यादा ज़रूरी, एक जैसा कॉन्टेंट बनाते रहना कम ज़रूरी है. साथ ही, मूल्यांकन के एक जैसे होने की तुलना में इस नियम के ज़्यादा अपवाद हैं. इन सीमाओं के बारे में, काम करने वाली मुख्य टाइप की हमारी सूची में बताया गया है. उदाहरण के लिए, कुंजी टाइप ECIES Tink में यह चुनने का विकल्प होता है कि कुंजी के समझौते के लिए किस एलिप्टिक कर्व का इस्तेमाल करना है, लेकिन Java X25519 के साथ काम नहीं करता. इसलिए, Java में X25519 का इस्तेमाल करके कुंजी बनाने में समस्या आती है.
-
इस दस्तावेज़ में, हम ज़्यादातर भाषाओं में
KeysetHandle
नाम के ऑब्जेक्ट को दिखाने के लिए,Keyset
शब्द का इस्तेमाल करते हैं.↩