Teknik Makale

PDF için Saf Pascal'da Ed448 ve Brainpool ECDSA

PDFlibPas, saf Object Pascal ile Ed448 ile ve üç Brainpool ECDSA eğrisiyle imzalar ve doğrular. Harici bir kriptografik kitaplık yok, platform sağlayıcısı yok, DLL yok: PDFlibEd448, edwards448 üzerinde RFC 8032 PureEdDSA'yı uygular; PDFlibBrainpool ise RFC 5639 brainpoolP256r1, brainpoolP384r1 ve brainpoolP512r1'i uygular. Her ikisi de aynı yolla, herhangi bir Pascal yazılmadan önce bağımsız olarak üretilmiş known-answer vektörlerine karşı inşa edildi ve ikisini yazmaya değer kılan şey de esas olarak hatalarıdır

Cisim aritmetiği alışılmadık ölçüde dürüst bir koddur. Yayınlanmış vektörlerle ya bayt bayt eşleşir ya da eşleşmez; dolayısıyla "büyük ölçüde çalışan" için yer yoktur. İşleri zorlaştıran şey, yanlış bir uygulamanın yine de imza üretmesi, yine de kendi imzalarını doğrulaması ve yine de tamamen inandırıcı görünmesidir

Neden bu eğriler ve neden Pascal'da

Brainpool eğrileri, Avrupa nitelikli imza profillerinde yer alır; dolayısıyla o pazar için belge imzalayan bir kitaplık bunları egzotik olarak göremez. Ed448, ISO/TS 32002'nin PDF'e getirdiği algoritma kümesindedir ve burada iç özeti SHA-2 yerine SHAKE256'dır. İki ailenin hiçbiri, yaygın kullanımdaki Pascal kriptografi kitaplıklarında bulunmaz; dolayısıyla bunları isteyen bir PDF kitaplığının bunları kendisinin sağlaması gerekir

Dağıtım argümanı, bu kitaplığın tüm kriptografisi için geçerli olanla aynıdır: kriptografik bağımlılığı olmayan tek bir ikili dosya gönderen uygulamanın algılanacak bir sağlayıcısı, eşleştirilecek bir sürümü ve ana bilgisayar yamalandığında değişen bir davranışı yoktur. İmzalama, hareketli bir bağımlılığı en az isteyeceğiniz alanın ta kendisidir

Sabitler belirtim metninden gelir, asla bellekten değil

edwards448 taban noktasına yapılan ilk deneme bellekten yazılmıştı ve yanlıştı. Bu dikkat çekici bir hata değildir ve aynı zamanda çok pahalıya patlayan bir hatadır; çünkü yanlış bir taban noktası kendi içinde tutarlı bir sistem üretir: anahtar üretiminiz, imzalamanız ve doğrulamanız birbirleriyle hemfikir olurken dünyanın geri kalanıyla ters düşer

Çalışan yöntem, her alan parametresini belirtim metninden almak ve sonra çapraz doğrulamaktır. edwards448 için bu, asal sayının, eğri sabitinin, grup mertebesinin ve taban noktasının ondalık iki koordinatının RFC 8032'den alınıp iç limb gösterimine dönüştürülmesi ve ardından aynı belgeden gelen yayınlanmış test vektörleriyle denetlenmesi anlamına gelir. Brainpool eğrileri için ise RFC 5639'dan gelen parametreler, vektör üretmek için yazılmış bağımsız bir uygulama ve herhangi bir Pascal çalıştırılmadan önce bir sistem kitaplığına karşı iki yönlü çapraz denetim anlamına gelir

Ed448 ve Brainpool alan parametreleri RFC 8032 ve RFC 5639 belirtim metninden limb biçimine akar ve herhangi bir Pascal çalışmadan önce çapraz doğrulanır
edwards448 ve Brainpool eğrilerinin alan parametreleri RFC metninden alınır, limb biçimine dönüştürülür ve bağımsız vektörlere karşı çapraz doğrulanır

Bir türetme kısayolu uyarıyı hak eder, çünkü evrensel görünür ve değildir: sabit bir y değerinden taban noktasını kurtarmak 25519 eğrisi için çalışır, ancak o değerin karekökü bulunmayan edwards448 için çalışmaz. Bir betik bunu saniyeler içinde çürüttü; bu, bir hata ayıklayıcıyla keşfetmekten çok daha ucuza gelir

Yöntem: herhangi bir Pascal'dan önce limb düzeyinde bir ayna

Her iki birimi de yönetilebilir kılan teknik, sınırsız tamsayılı bir dilde aşağıdan yukarıya inşa edilen bir ayna uygulamasıdır. Önce yalnızca aritmetik katmanı: cisim çarpımı, çıkarma ve elde yayılımı, birkaç yüz rastgele durumda cebirsel değişmezlerine karşı stres testine tabi tutuldu. Sonra aynanın içinde tam anahtar üretimi; anlamsal hataların yaşadığı ve ucuzca bulunabildiği yer orasıdır. Ancak ondan sonra Pascal aktarımı

Sınırsız tamsayılı bir ayna uygulamasının Ed448 ve Brainpool için Pascal cisim aritmetiğini ve anahtar üretimini doğrulama akışı
Aşağıdan yukarıya ayna akışı: önce aritmetik, sonra aynanın içinde anahtar üretimi, ardından Pascal aktarımı ve ara değer karşılaştırması

Kazanç, geliştirme değil tanılama yönündedir. Ayna doğru olduktan sonra ayna ile Pascal arasındaki her uyumsuzluk bir aktarım hatasıdır ve her iki uygulamada da aynı ara değeri yoklamak onu anında bulur. Bu, başka türlü neredeyse ayıklanamayan bir hata sınıfını, bir skaler çarpımın derinliklerindeki tek bir yanlış limb'i, beş dakikalık bir karşılaştırmaya dönüştürür

Ed448'de dört kök neden

Dördü de ara değerleri yoklayarak bulundu ve dördü de geçerli görünen çıktı üreten türden şeylerdir

İlki bir gösterim tuzağıdır. Yayınlanmış birleşik Edwards toplama formüllerinin çoğu eksi bir eğri sabiti varsayar; oysa edwards448 artı bire sahiptir. Olduğu gibi taşındığında, y koordinatının payı, fark olması gereken yerde toplam olarak yazılır. Çözüm, işareti yamalamak değil, ters alınmasız çarpım biçimini doğru eğri için afin toplama yasasından yeniden türetmektir; bu, dört koordinat ifadesini üretir ve işaretin yanlış kaynaktan devralınmasına hiçbir alan bırakmaz

İkincisi nokta açılımındadır. Afin x'i projective koordinatlardan kurtarmak, Z'nin tersiyle bir çarpma gerektirir. Tersin karesiyle çarpmak, hâlâ geçerli bir projective gösterim olan ama yanlış afin koordinat olan bir değer verir; dolayısıyla belirti, yanlış bir x ile birlikte doğru bir y'dir. Bir koordinatın doğru, diğerinin yanlış olduğu her durumda hata aritmetikte değil normalleştirmededir

Üçüncüsü, daha kısa eğriden devralınan bir alışkanlıktır. Hem imza başına skaler hem de challenge skaleri, Ed448 için 114 bayt olan tam özeten indirgenmelidir; ilk 57 bayttan değil. 32 baytlık eğri de tam 64 baytlık özetini kullanır; dolayısıyla kural tutarlıdır, yanlış olan yalnızca "özetin yarısı skaler genişliğidir" varsayımıdır

Dördüncüsü sıralamadır. Alan ayrımı öneki ilk sırada gelir; bağlam önekinden ve iletiden önce. Bu, belirtimdeki R ve A'nın sezgisel okunuşunun ima ettiği sıra değildir. Bunu yanlış yapmak, yalnızca kendi uygulamanıza karşı doğrulanan imzalar üretir; bu da mümkün olan en yanıltıcı hatadır

// Cisim elde (carry) tasarımı: saf floor-anlamlı yayılım, böylece
// hem pozitif hem negatif limb değeri çalışır ve çıkarma bir bias
// gerektirmez. Üstteki elde 2^448 = 2^224 + 1 (mod p) üzerinden geri
// katlanır; bu, limb 0'a ve limb 8'e dokunur. Dört turda sınırlıdır;
// pratikte iki tur gözlendi
procedure FeCarry(var A: TFe448);
var
  I, Round: Integer;
  Carry: Int64;
begin
  for Round := 1 to 4 do
  begin
    Carry := 0;
    for I := 0 to 15 do
    begin
      A[I] := A[I] + Carry;
      Carry := Floor28(A[I]);          // floor, kesme değil
      A[I] := A[I] - (Carry shl 28);
    end;
    if Carry = 0 then
      Break;
    A[0] := A[0] + Carry;              // 2^448 == 1
    A[8] := A[8] + Carry;              // 2^448 == 2^224
  end;
end;

O yordamın önceki bir sürümü yayılımdan önce bir bias uyguluyordu ve büyük girdilerde yanlış büyüklükte sahte bir eldeyi düşük limblerin içine katlıyordu. Bias tabanlı elde şemaları bu hata sınıfının ısrarlı bir kaynağıdır; sınırlı bir tekrar döngüsüyle floor anlamı, hakkında akıl yürütmesi daha kolay ve ölçülebilir biçimde yeterince hızlıdır

Brainpool'da iki kök neden

İlki hiç kriptografi değildir. Çalışan gösterim 33 limblidir; dolayısıyla iki değerin çarpımı 66 gerektirir ve çarpım dizisi 64 ile bildirilmişti. Sonun ötesine yazmak bitişik belleği bozdu; bu önce yanlış sonuçlar olarak ortaya çıktı ve ancak daha geniş bir tarama eklendiğinde bir çökmeye dönüştü. Buradan çıkan kural her sabit boyutlu sayısal tampon için uygulanmaya değer: en kötü durum çarpım genişliğinden boyutlandırın, pay ekleyin ve sonra bir daha asla üzerine düşünmeyin. Gönderilen koddaki dizi 68 limb uzunluğundadır

İkincisi karışmış bir üs alma biçimidir. Doğru iki kare al-çarp (square-and-multiply) biçimi vardır ve ikisi üssü zıt yönlerde tüketir: sağdan sola biçimi önce çarpar sonra tabanı kareler ve bitleri en anlamsız uçtan okumalıdır; soldan sağa biçimi ise önce kareler sonra çarpar ve en anlamlı uçtan okur. Modüler ters alma döngüsü, en anlamlı bit önde bir bit gezinmesiyle sağdan sola bir gövdeye sahipti. Her iki yarısı da ders kitabı malzemesidir, birleşim değildir; sonuç da hâlâ inandırıcı bir cisim elemanı gibi görünen yanlış bir terstir

Zıt bit yönlerine sahip iki kare al-çarp üs alma biçimi ve yanlış Brainpool modüler tersleri hesaplayan karışık biçim
Her iki kare al-çarp biçimi de tek başına doğrudur; sağdan sola bir gövdeyi en anlamlı bit önde bir gezinmeyle eşlemek inandırıcı ama yanlış bir ters üretir
// Hedef kaydın bir kaynakla aynı değişken olabildiği Jacobian
// katlama ve toplama. Girişte kaydın tamamının kopyalanması tek
// güvenilir savunmadır: R'nin limblerini yazmak, P'nin sonraki
// okumalarını kirletir
procedure BPPointDouble(var R: TBPPoint; const P: TBPPoint;
  const Curve: TBPCurve);
var
  Pin: TBPPoint;
begin
  Pin := P;        // önce kopyala, sonra yalnızca Pin üzerinden hesapla
  // ... M = 3X^2 + A*Z^4, S = 4*X*Y^2, X3 = M^2 - 2S, ...
end;

Hatalardan daha pahalıya patlayan iki süreç dersi

Artımlı sıcak düzeltme bir kriptografi biriminde yakınsamaz. Bir taslak, 32 çoğaltılmış yordam ve bozulmuş bir yapı taşıyana dek defalarca yamalandı ve tek çözüm yeniden yazılması oldu. Benimsenecek desen ya doğrulanmış bir aynadan bir kez yazmak ya da yeniden yazmaktır; henüz anlamadığınız aritmetiğe yapılan yerel düzeltmeler dizisi, düzelttiğinden hızlı biriktirir

Ve bir test sonucuna inanmadan önce çalıştırılabilir dosyanın zaman damgasını denetleyin. Derlenen ama yeniden bağlanmayan artımlı bir derleme önceki ikili dosyayı çalıştırır; bu da eksik yoklamalar ve çoğaltılmış çıktı hakkında tam bir tur yanıltıcı ipucu üretti. Kriptografi ayıklarken açıklanamayan bir sonuç, "algoritma yanlış mı" sorusundan önce "bu benim az önce derlediğim ikili dosya mı" sorusunu tetiklemeli

Performans, kapsam ve nasıl çağrılır

Brainpool birimindeki modüler indirgeme, ürünün en yüksek anlamlı bitinden başlayan bit-seri kaydır-çıkar biçimindedir; dolayısıyla bir çarpma kabaca bit genişliği mertebesinde maliyete yol açar. Bir P-256 doğrulaması düşük yüzlerce milisaniyeye oturur; bu, belge imzalamak ya da doğrulamak için sıradandır ve bir TLS sonlandırıcısı için yetersiz olurdu. Barrett indirgeme bariz yükseltmedir ve mevcut gösterimin taşıdığından daha geniş bir çalışma değeri gerektirir; dolayısıyla önlem olarak değil, bir iş yükü istediğinde yapılacak bir değişikliktir

uses
  PDFlibEd448, PDFlibBrainpool;

var
  PublicKey, Signature: AnsiString;
  Curve: TBPCurve;
  R, S, PubX, PubY: TBPValue;
begin
  // Ed448: PureEdDSA, dahili SHAKE256, 57 baytlık anahtarlar
  if Ed448PublicKeyFromSeed(Seed, PublicKey) and
     Ed448Sign(DocumentDigest, Seed, Signature) then
    Assert(Ed448Verify(DocumentDigest, PublicKey, Signature));

  // Brainpool: imza başına nonce'u çağıran taraf sağlar; böylece
  // nonce politikası uygulamada kalır
  Curve := BPLoadCurve(bpP256r1);
  if BPKeyGen(PubX, PubY, PrivateD, Curve) and
     BPSignFixedK(R, S, Hash, PrivateD, Nonce, Curve) then
    Assert(BPVerify(R, S, Hash, PubX, PubY, Curve));
end;

Brainpool imzalama giriş noktasının nonce üretmediğini, bunu aldığını unutmayın. Bu kasıtlıdır: nonce üretimi, ECDSA'da yanlış yapılması hâlinde en yıkıcı olan tek şeydir; çünkü tekrarlanan ya da öngörülebilir bir değer özel anahtarı açığa çıkarır ve rastgeleliğin nereden geleceğine dair karar bir PDF kitaplığına değil, uygulamaya ve onun uyumluluk rejimine aittir

Bu eğriler, FIPS 204 ML-DSA makalesinde anlatılan post-quantum çalışmalarının yanında yer alır ve PAdES imzalama ve doğrulamada ele alınan imzalama ile doğrulama hattının aynılarına bağlanır. Bu eğrilerdeki test sertifikaları için yerel üretim yolu CryptoAPI ile kendinden imzalı sertifikalar konusunda anlatılır. Algoritma matrisinin tamamı losLab PDF Developer Library ürün sayfasında listelenir