← MLS/
RFC 9420 · Bölüm 03 Ana Metin

2. Terminoloji

Bu belgedeki "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" ve "OPTIONAL" anahtar sözcükleri, yalnızca burada gösterildiği gibi tamamı büyük harflerle yazıldıklarında, BCP 14 [RFC2119] [RFC8174]'te açıklandığı şekilde yorumlanmalıdır.

İstemci (Client): Bu protokolü, diğer istemcilerle paylaşılan kriptografik durum kurmak için kullanan bir etkendir. Bir istemci, elinde bulundurduğu kriptografik anahtarlarla tanımlanır.

Grup (Group): Grup, belirli bir anda ortak bir gizli değeri paylaşan istemcilerden oluşan mantıksal bir topluluğu temsil eder. Durumu, her epoch'un bir öncekine bağlı olduğu doğrusal bir epoch dizisi olarak gösterilir.

Epoch: Belirli bir doğrulanmış istemci kümesinin paylaşılan kriptografik durumu elinde tuttuğu grup durumu.

Üye (Member): Bir grubun paylaşılan durumuna dahil edilen ve bu nedenle grubun sırlarına erişimi olan istemci.

Anahtar Paketi (Key Package): Bir istemcinin kimliğini ve yeteneklerini tanımlayan imzalı nesnedir. Bu nesne, o istemciye şifreleme yapmak için kullanılabilecek bir hibrit açık anahtarlı şifreleme (HPKE) [RFC9180] açık anahtarını da içerir. Diğer istemciler, bir istemcinin KeyPackage'ını o istemciyi yeni bir gruba dahil etmek için kullanabilir.

Grup Bağlamı (Group Context): Grubun paylaşılan, açık durumunu özetleyen nesnedir. Grup bağlamı tipik olarak imzalı bir GroupInfo mesajı içinde dağıtılır; bu mesaj, yeni üyelere gruba katılmalarına yardımcı olmak için verilir.

İmza Anahtarı (Signature Key): Bir mesajın göndericisinin kimliğini doğrulamak için kullanılan imza anahtar çifti.

Teklif (Proposal): Gruba yapılacak bir değişikliği, örneğin bir üyenin eklenmesini veya çıkarılmasını öneren mesaj.

Commit: Bir Proposal kümesinde önerilen grup değişikliklerini uygulayan mesaj.

PublicMessage: Göndericisi tarafından imzalanan ve belirli bir epoch'ta gruptaki bir üyeden geldiği doğrulanan, ancak şifrelenmeyen MLS protokol mesajı.

PrivateMessage: Göndericisi tarafından imzalanan, belirli bir epoch'ta gruptaki bir üyeden geldiği doğrulanan ve o epoch'taki grup üyelerine gizli kalacak şekilde şifrelenen MLS protokol mesajı.

El Sıkışma Mesajı (Handshake Message): Uygulama verisinin aksine, bir MLS Proposal veya Commit nesnesi taşıyan PublicMessage ya da PrivateMessage.

Uygulama Mesajı (Application Message): Uygulama verisi taşıyan bir PrivateMessage.

Ağaç hesaplamalarına özgü terminoloji Bölüm 4.1'de açıklanmıştır.

Genel olarak, simetrik değerlerden birbirinin yerine kullanılacak şekilde "key" veya "secret" diye söz edilir. Bu terimlerden her biri, istemci açısından gizli tutulması MUST olan bir değeri ifade eder. Tek tek değerleri adlandırırken, genellikle daha fazla gizli değer türetmek için kullanılan bir değer için "secret", Hashed Message Authentication Code (HMAC) ya da Authenticated Encryption with Associated Data (AEAD) gibi bir algoritmayla kullanılan bir değer için ise "key" terimini kullanırız.

PublicMessage ve PrivateMessage biçimleri Bölüm 6'da tanımlanmıştır. İleriye dönük gizlilik ve ele geçirilme sonrası güvenlik gibi güvenlik kavramları ise Bölüm 16'da tanımlanmıştır.

Bölüm 13.5'te ayrıntılı olarak açıklandığı üzere MLS, genişletilebilirliği korumak için "Generate Random Extensions And Sustain Extensibility" (GREASE) yaklaşımını kullanır; bu yaklaşımda göndericiler, alıcıların bilinmeyen değerleri yok saymasının zorunlu olduğu alanlara rastgele değerler ekler. Bu amaçla kullanılacak belirli "GREASE değerleri" uygun IANA kayıtlarında tescil edilir.

2.1 Gösterim Dili

Protokol mesajlarının yapısını açıklamak için TLS gösterim dilini [RFC8446] kullanıyoruz. Temel söz dizimine ek olarak iki özellik daha ekliyoruz: alanların isteğe bağlı olabilmesi ve vektörlerin değişken boyutlu uzunluk başlıklarına sahip olabilmesi.

2.1.1 İsteğe Bağlı Değer

İsteğe bağlı bir değer, önce varlığını bildiren bir sekizlik, ardından da mevcutsa değerin kendisi olacak şekilde kodlanır. Çözme sırasında, değeri 0 veya 1 dışında olan bir varlık sekizlisi bozuk biçimli sayılmalı ve MUST reddedilmelidir.

struct {
       uint8 present;
       select (present) {
           case 0: struct{};
           case 1: T value;
       };
} optional<T>;

2.1.2 Değişken Boyutlu Vektör Uzunluk Başlıkları

TLS gösterim dilinde vektörler, uzunluk bilgisi öne eklenmiş kodlanmış öğeler dizisi olarak kodlanır. Uzunluk alanı, kodlanmış öğe dizisinin asgari ve azami uzunlukları belirtilerek belirlenen sabit bir boyuta sahiptir.

MLS içinde boyutları geniş aralıklarda değişebilen birkaç vektör bulunur. Bu nedenle sabit boyutlu bir uzunluk alanı kullanmak yerine, [RFC9000]'in 16. bölümünde açıklanana dayanan değişken uzunluklu bir tamsayı kodlamasıyla değişken boyutlu bir uzunluk kullanıyoruz. Burada kullanılan yöntem, yalnızca asgari boyutlu kodlamayı zorunlu kılmasıyla ondan ayrılır. Vektör tanımı, asgari ve azami değerler sunmak yerine yalnızca bir V içerir. Örneğin:

struct {
       uint32 fixed<0..255>;
       opaque variable<V>;
} StructWithVectors;

Böyle bir vektör, uzunluğu 0 bayttan 2^30 bayta kadar olan değerleri temsil edebilir. Değişken uzunluklu tamsayı kodlamasında, ilk baytın en anlamlı iki biti, tamsayı kodlama uzunluğunun bayt cinsinden 2 tabanına göre logaritmasını kodlamak için ayrılmıştır. Tamsayı değeri geri kalan bitlerde kodlanır; böylece toplam değer ağ bayt sırasındadır. Kodlanan değer, değeri göstermek için gereken en az sayıda biti MUST kullanmalıdır. Çözme sırasında, gerekenden fazla bit kullanan değerler bozuk biçimli sayılmalı ve MUST reddedilmelidir.

Bu, tamsayıların 1, 2 veya 4 baytla kodlandığı ve sırasıyla 6, 14 veya 30 bitlik değerleri temsil edebildiği anlamına gelir.

Önek Uzunluk Kullanılabilir Bitler Asgari Azami
00 1 6 0 63
01 2 14 64 16383
10 4 30 16384 1073741823
11 geçersiz - - -

Tablo 1: Tamsayı Kodlamalarının Özeti

"11" önekiyle başlayan vektörler geçersizdir ve MUST reddedilmelidir.

Örneğin:

Aşağıdaki şekil, [RFC9000]'de verilen sözde kodu asgari uzunlukta kodlama denetimini ekleyecek şekilde uyarlamaktadır:

ReadVarint(data):
     // Değişken uzunluklu tamsayıların uzunluğu, ilk baytın
     // ilk iki bitinde kodlanır.
     v = data.next_byte()
     prefix = v >> 6
     if prefix == 3:
       raise Exception('geçersiz değişken uzunluklu tamsayı öneki')

     length = 1 << prefix

     // Uzunluk bir kez bilindiğinde, bu bitleri kaldır ve
     // kalan baytları oku.
     v = v & 0x3f
     repeat length-1 times:
       v = (v << 8) + data.next_byte()

     // Değerin, sağlanan uzunluğun yarısına sığıp sığmadığını denetle.
     if prefix >= 1 && v < (1 << (8*(length/2) - 2)):
       raise Exception('asgari kodlama kullanılmadı')

     return v

Vektör uzunlukları için değişken boyutlu tamsayıların kullanılması, vektörlerin 2^30 bayta kadar çok büyük boyutlara ulaşmasına olanak tanır. Uygulamalar, vektörlerin mevcut depolama kapasitesini aşmasına izin vermemek için dikkatli olmalıdır. Olası birlikte çalışabilirlik sorunlarının hata ayıklamasını kolaylaştırmak amacıyla, böyle bir taşma durumu ortaya çıktığında uygulamaların açık bir hata vermesi SHOULD düzeyinde tavsiye edilir.