कुंजी और पैरामीटर ऑब्जेक्ट

असल में, Tink में Parameters को दिखाने के लिए Key ऑब्जेक्ट की और Parameters ऑब्जेक्ट दिखाए जाते हैं. उदाहरण के लिए, Java में हमारे पास AES GCM कुंजियों को दिखाने के लिए, AesGcmKey ऑब्जेक्ट हैं.

इस सेक्शन में, हमने बताया है कि ये ऑब्जेक्ट Java में कैसे डिज़ाइन किए जाते हैं और ये कैसे इंटरैक्ट करते हैं.

Parameters ऑब्जेक्ट

बड़े पैमाने पर इस्तेमाल की जाने वाली AEAD एन्क्रिप्शन स्कीम, AES GCM पर ध्यान दें. Tink AesGcmKey बनाने के लिए ज़रूरी जानकारी के साथ AesGcmParameters ऑब्जेक्ट देता है. इस बारे में हम बाद में जानकारी देंगे. Java में पैरामीटर की हैरारकी इस तरह दिखती है:

public abstract class Parameters {
  public abstract boolean hasIdRequirement();
}

public abstract class AeadParameters extends Parameters {}

public final class AesGcmParameters extends AeadParameters {
  /**
   * The Variant specified how ciphertexts are [tagged](/tink/design/keysets#tagging_ciphertexts).
   */
  public static final class Variant {...}
  /** A helper object to create new AesGcmParameters. */
  public static final class Builder {...}

  public int getKeySizeBytes() {...}
  public int getIvSizeBytes() {...}
  public int getTagSizeBytes() {...}

  public Variant getVariant() {...}

  public OutputPrefixType getOutputPrefixType() {...}
  public boolean equals(Object object) {...}
  public int hashCode() {...}
}

जैसा कि कीसेट, टैग साइफ़रटेक्स्ट सेक्शन में बताया गया है, कुछ कुंजियों के आईडी के लिए तब ज़रूरी होता है, जब वे कीसेट में होती हैं. हर Parameters ऑब्जेक्ट का एक तरीका hasIdRequirement होता है, जो बताता है कि इस Parameters ऑब्जेक्ट से बनाई गई कुंजी में इस तरह का ज़रूरी आईडी होगा या नहीं.

इसके बाद, AesGcmParameters ऑब्जेक्ट getKeySizeBytes(), getIvSizeBytes(), और getTagSizeBytes() तरीके उपलब्ध कराता है. ये इस्तेमाल की गई कुंजी, इस्तेमाल किए गए IV की लंबाई, और बनाए गए टैग की लंबाई बाइट में दिखाते हैं. हालांकि, Tink में कुछ फ़ंक्शन पूरे हैं, लेकिन यह हमेशा हर विकल्प के लिए Aead बनाने की अनुमति नहीं देता. उदाहरण के लिए, फ़िलहाल सिर्फ़ 12 बाइट वाले IV, AES GCM के लिए काम करते हैं.

AesGcmParameters ऑब्जेक्ट, पहले से तय किए गए तरीकों (और Java स्टैंडर्ड के तरीकों equals और hashCode, जिन्हें अच्छा तरीका माना जाता है) के लिए बदलाव भी देता है.

आखिर में, यह नए AeadParameters ऑब्जेक्ट बनाने के लिए स्टैटिक तरीके देता है. ये इनपुट की पुष्टि करते हैं. उदाहरण के लिए, वे जांच करते हैं कि साइज़ 16, 24 या 32 में से कोई एक है या नहीं.

मुख्य ऑब्जेक्ट

Tink में एक खास हैरारकी भी है. हमारे AES GCM के उदाहरण के अलावा, यह ऐसा दिखता है:

public abstract class Key {
  public abstract Parameters getParameters();
  public abstract @Nullable Integer getIdRequirementOrNull();
  public abstract boolean equalsKey(Key other);
}

public abstract class AeadKey extends Key {
  public abstract AeadParameters getParameters();
  public abstract Bytes getOutputPrefix();
}

public final class AesGcmKey implements AeadKey {
  public SecretBytes getKeyBytes();
  public abstract Bytes getOutputPrefix();
  public AesGcmParameters getParameters();
  public @Nullable Integer getIdRequirementOrNull();
  public boolean equalsKey(Key object);
}

getIdRequirementOrNull तरीका वह आईडी दिखाता है जो इस कुंजी के लिए ज़रूरी है या ज़रूरी न होने पर null दिखाता है. (कुंजी पर ऐसी शर्त इसलिए लगाई जाती है, क्योंकि कुछ मामलों में Tink स्ट्रिंग के साथ सादे टेक्स्ट या सिग्नेचर के आगे 0x01<id> मौजूद होता है. सादे टेक्स्ट को टैगिंग करने वाला सेक्शन देखें).

यह हमेशा getParameters().hasIdRequirement() के नतीजे के मुताबिक होगा. साथ ही, इसे पक्का करने के लिए नई मुख्य क्लास को लागू करने वाले लोगों को ऐसा करना ज़रूरी होगा.

अलग-अलग कुंजियों की तुलना करने के लिए, Key को लागू करने का एक तरीका equalsKey भी देना होगा. इस तरह का तरीका अक्सर उपयोगी होता है: उदाहरण के लिए, 'की डेरिवेशन' को टेस्ट करते समय, आपकी दिलचस्पी यह पक्का करने में होती है कि व्युत्पन्नों का बार-बार इस्तेमाल करने से, एक ही मुख्य ऑब्जेक्ट मिले. साथ ही, हो सकता है कि केएमएस की कोशिश यह हो कि उसके ज़रिए अलग-अलग उपयोगकर्ताओं को दी गई कोई भी कुंजी एक जैसी है या नहीं (ऐसा कभी-कभी तब होता है, जब उपयोगकर्ता एक ही केएमएस को एक ही केएमएस पर कई बार अपलोड करते हैं). यह ध्यान देने वाली बात है कि हम Java के तरीके equals को नहीं बदलते. ऐसा इसलिए, क्योंकि इसके लिए हमें hashCode को बदलना पड़ेगा. साथ ही, बिना किसी अनुमान के equals के साथ सुरक्षित तरीके से hashCode को लागू करने का कोई तरीका नहीं है.

इसके बाद, हमें getParameters() तरीके का इस्तेमाल करना होगा. इससे उपयोगकर्ताओं को कुंजी बनाने के लिए इस्तेमाल किए गए पैरामीटर के बारे में, मूल जानकारी मिलती है.

आखिर में, AesGcmKey में एक तरीका getKeyBytes है जो रॉ ज़रूरी मटीरियल दिखाता है. मुख्य क्लास के लिए, इस तरह के तरीके काफ़ी आम हैं: ये टाइप के हिसाब से होते हैं और इनसे जुड़े मुख्य कॉन्टेंट का ऐक्सेस मिलता है. इनका इस्तेमाल करके, उपयोगकर्ता सिद्धांत के तौर पर, कुंजी से दिखाए गए प्रिमिटिव को लागू कर सकते हैं या कुंजी को डिस्क पर सेव करने या नेटवर्क पर भेजने के लिए उसे क्रम से लगा सकते हैं. मुख्य कॉन्टेंट को बिना अनुमति वाले ऐक्सेस से सुरक्षित रखने की ज़िम्मेदारी खुद कुंजी की होती है. उदाहरण के लिए, SecretBytes को असल में कॉन्टेंट उपलब्ध कराने के लिए ऐक्सेस टोकन की ज़रूरत होती है (ऐक्सेस कंट्रोल देखें).

एसिमेट्रिक कुंजियां

एसिमेट्रिक प्रिमिटिव के लिए, Tink दो Key क्लास का इस्तेमाल करता है, एक निजी के लिए और एक सार्वजनिक कुंजियों के लिए. पैरामीटर के लिए, एक ही क्लास का इस्तेमाल करना ज़्यादा आसान होता है, क्योंकि कुंजियों को जनरेट करने के लिए सिर्फ़ एक क्लास इस्तेमाल की जा सकती है.

Tink में अतिरिक्त फ़ंक्शन getPublicKey() वाला PrivateKey इंटरफ़ेस भी है.