Test av kryptobiblioteket

Relevanta dokument
256bit Security AB Offentligt dokument

Protokollbeskrivning av OKI

Krypteringteknologier. Sidorna ( ) i boken

Kryptografi - När är det säkert? Föreläsningens innehåll. Kryptografi - Kryptoanalys. Kryptering - Huvudsyfte. Kryptografi - Viktiga roller

Grundfrågor för kryptosystem

Kryptering HEMLIG SKRIFT SUBSTITUTION STEGANOGRAFI KRYPTOGRAFI

Metoder för sekretess, integritet och autenticering

Security Target (ST) för The Secure Channel (server)

Primtal, faktorisering och RSA

Försöksnomineringssystem 2013

RIV Tekniska Anvisningar Kryptografi. Version ARK_

Kryptering. Krypteringsmetoder

Att använda kryptering. Nyckelhantering och protokoll som bygger på kryptering

Kryptering och primtalsfaktorisering

Anpassning av GNU Nettle för inbyggda system

Grundläggande krypto och kryptering

Kryptografi: en blandning av datavetenskap, matematik och tillämpningar

PGP håller posten hemlig

Föreläsning 9: Talteori

Kryptoteknik. Marcus Bendtsen Institutionen för Datavetenskap (IDA) Avdelningen för Databas- och Informationsteknik (ADIT)

Kryptering. Av: Johan Westerlund Kurs: Utveckling av webbapplicationer Termin: VT2015 Lärare: Per Sahlin

MA2047 Algebra och diskret matematik

Många företag och myndigheter sköter sina betalningar till Plusoch

Skydd för känsliga data

E-Betalning Teknisk handbok Version 0702 Innehåll

Säker e-kommunikation

Kryptering. Wearable Computers D 10p. Namn: Josef Israelsson Datum: Lärare: Björne Lindberg Ulf Brydsten Lars Karlsson

Vad man vill kunna göra. Lagra och skicka krypterad information Säkerställa att information inte manipuleras Signera sådant som man står för

Funktionella tester av Secure Backup

Kryptografi: en blandning av datavetenskap, matematik och tillämpningar

TDDI16: Datastrukturer och algoritmer

Föreläsning 9: Talteori

Kravspecifikation Fredrik Berntsson Version 1.1

Objektorienterad Programkonstruktion. Föreläsning 16 8 feb 2016

NÅGOT OM KRYPTERING. Kapitel 1

Datasäkerhet och integritet

S =(s e )modn. s =(S d )modn. s =(s e ) d mod n.

Hot mot nyckelhantering i DNSSEC och lite om hur man undviker dem. Anne-Marie Eklund Löwinder Kvalitets- och säkerhetschef

Övning 6. Komprimering, kryptering, dokumentering & testning

Hemligheternas Matematik

Mjukvarurealiserad bildtelefoni

Användarhandledning för The Secure Channel

Datasäkerhet. Petter Ericson

Testning av Sambi. Testplan. Version PA12. Fil namn: SAMBI_TP.docx Senast sparad: Copyright (c) 2014 IIS

DOP-matematik Copyright Tord Persson Övning Bråkräkning. Matematik 1. Uppgift nr 14 Addera 9. Uppgift nr 15 Addera 3. Uppgift nr 16 Subtrahera

Cipher Suites. Rekommendationer om transportkryptering i e-tjänster

Undersökning och design av en säkerhetslösning för en molnlagringstjänst

Europeisk samsyn på kryptomekanismer SOGIS nya kryptolista en översikt

Datastrukturer. föreläsning 6. Maps 1

Kryptering & Chiffer Del 2

Undersökning och design av en säkerhetslösning för en molnlagringstjänst

Föreläsning 7. DD2390 Internetprogrammering 6 hp

Tekn.dr. Göran Pulkkis Överlärare i Datateknik. Nätverksprotokoll

Datorsystemteknik DVG A03 Föreläsning 3

E-legitimationer. Jonas Wiman. LKDATA Linköpings Kommun.

Testning av Sambi. Testplan. Version PA5. Fil namn: SAMBI_TP.docx Senast sparad: Copyright (c) 2014 IIS

Dagens föreläsning. Datasäkerhet. Tidig historik. Kryptografi

Att bygga VPN. Agenda. Kenneth Löfstrand, IP-Solutions AB. Olika VPN scenarios. IPsec LAN - LAN. IPsec host - host SSH

RSA-kryptering och primalitetstest

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Offentlig kryptering

Keywords: anonymous p2p, networking, p2p implementations, peer-to-peer.

Moderna krypteringssystem

Elektroniska signaturer - säker identifiering?

Regression med Genetiska Algoritmer

Grundläggande kryptering & chiffer

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

Introduktion till protokoll för nätverkssäkerhet

Modul 3 Föreläsningsinnehåll

Säker lagring av krypteringsnycklar

Kryptografiska mekanismer och valutor

Användarhandledning för The Secure Channel

BILAGA 1 Tekniska krav Version 1.0

Extramaterial till Matematik Y

Föreläsning 10. Grundbegrepp (1/5) Grundbegrepp (2/5) Datasäkerhet. olika former av säkerhet. Hot (threat) Svaghet (vulnerability)

Policy Underskriftstjänst Svensk e-legitimation

Säkerhetsbrister & intrång

Planering av ett större program, del 2 - for och listor. Linda Mannila

Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner

15 september, Föreläsning 5. Tillämpad linjär algebra

Modularitet och tillstånd. Stora system kräver en uppdelning. En lösning: modularitet. Basera programmets struktur på den fysiska systemets struktur:

Förändringsskydd med sigill

Några satser ur talteorin

Kryptografiska mekanismer och valutor

BILAGA 1 Tekniska krav

Bråk. Introduktion. Omvandlingar

Avancerad SSL-programmering III

Räkna med C# Inledande programmering med C# (1DV402)

Säkerhet. Säker kommunikation - Nivå. Secure . Alice wants to send secret message, m, to Bob.

SSL/TLS-protokollet och

Lathund för kryptering med GnuPG

KRYPTERING - MÖJLIGHET ELLER OMÖJLIGHET. Carl Önne carl.onne@certezza.net

Krypteringstjänster. LADOK + SUNET Inkubator dagarna GU, Göteborg, 6-7 oktober Joakim Nyberg ITS Umeå universitet

Riksgäldskontorets författningssamling

RSA-kryptografi för gymnasiet. Jonas Gustafsson & Isac Olofsson

KW ht-17. Övningsuppgifter

Utvärdering av säkerhetsspecifikationer för XML

Classes och Interfaces, Objects och References, Initialization

Transkript:

Test av kryptobiblioteket 1 Syfte Det här dokumentet är en testplan som beskriver hur kryptobibliotekets olika implementationer ska testas. Dokumentet beskriver inte de tester som redan ingår i utvecklingsprocessen utan de tester som ska utföras efter att programvaran har färdigställts. 2 Sammanfattning Tre olika typer av tester ska utföras av kryptobiblioteket: funktionella tester, iterativa tester och utvärdering mot standard (conformance tests). Samtliga av dessa tester ska automatiseras i programmet krypto_test. 3 Klassificering Dokumentet har klassificerats som offentligt dokument. Det finns därför inga restriktioner för spridning eller hantering. Dokument: Test av kryptobiblioteket 1

4 Innehåll 1 Syfte...1 2 Sammanfattning...1 3 Klassificering...1 4 Innehåll...2 5 Grundläggande funktionella tester...3 5.1 AES...3 5.2 Serpent...4 5.3 RandLib...4 5.4 NumberLib...5 5.5 RSA...6 5.6 SHA-256...6 5.7 HMAC-SHA256...6 6 Iterativa tester...7 6.1 AES...7 6.2 Serpent...8 6.3 RandLib...8 6.4 NumberLib...9 6.5 RSA...10 6.6 SHA-256...11 6.7 HMAC-SHA256...11 7 Test av conformance...12 7.1 Serpent och AES...12 7.1.1 AES...13 7.1.2 Serpent...13 7.2 SHA-256...14 7.3 HMAC-SHA256...14 7.4 RSA...14 8 Automatiserade tester...14 Dokument: Test av kryptobiblioteket 2

5 Grundläggande funktionella tester De funktionella testerna kontrollerar de grundläggande funktionerna av implementationerna i kryptobiblioteket. Dessa test ska utföras efter det att koden är utvecklad och de funktionstester som ingår som krav i utvecklingsprocessen redan har utförts, se dokumentet utvecklingsprocess och underhåll av kod, som inkluderar krav på både dynamiska tester och kodgranskning. Dessa tester fokuserar därför på de grundläggande säkerhetsfunktionerna i varje implementation för att testa koden mer formellt. Testerna inkluderar enbart funktioner som är säkerhetskritiska och inte detaljfunktioner eftersom dessa redan skall vara testade. De funktionella testerna på kryptobiblioteket ska automatiserats i programmet krypto_test som skal utföra alla funktionella tester automatiskt. Notera också att funktionella tester inte är fullständiga tester och i vissa fall är långt från vad som är tillräckligt för att testa implementationerna. Ytterligare tester måste följa beroende på vilken typ av kod det rör sig om. 5.1 AES Dessa funktionella tester skall utföras på implementationen: Metod ID Genomförande EncryptData() KRY_FUN_AES1 Kontrollera att datan förändras vid kryptering. KRY_FUN_AES2 KRY_FUN_AES3 KRY_FUN_AES4 Kontrollera att olika krypteringsnycklar ger olika resultat vid kryptering. Kontrollera att data kan dekrypteras till samma data igen. Testa att metoden SetNewIV() påverkar krypteringen så att det blir ett annat resultat. Dokument: Test av kryptobiblioteket 3

5.2 Serpent Dessa funktionella tester skall utföras på implementationen: Metod ID Genomförande EncryptData() KRY_FUN_SER1 Kontrollera att datan förändras vid kryptering. KRY_FUN_SER2 KRY_FUN_SER3 KRY_FUN_SER4 Kontrollera att olika krypteringsnycklar ger olika resultat vid kryptering. Kontrollera att datan kan dekrypteras till samma data igen. Testa att metoden SetNewIV() påverkar krypteringen så att det blir ett annat resultat. KeyEncrypt() KRY_FUN_SER5 Kontrollera att datan förändras vid kryptering. KRY_FUN_SER6 KRY_FUN_SER7 Kontrollera att olika krypteringsnycklar ger olika resultat vid kryptering. Kontrollera att datan kan dekrypteras till samma data igen. RawEncrypt() KRY_FUN_SER8 Kontrollera att datan förändras vid kryptering. KRY_FUN_SER9 Kontrollera att olika krypteringsnycklar ger olika resultat vid kryptering. GenCtrSeq() KRY_FUN_SER10 Kontrollera att olika krypteringsnycklar ger olika talsekvenser. 5.3 RandLib Dessa funktionella tester skall utföras på implementationen: Metod ID Genomförande MakeRandData() KRY_FUN_RLB1 Kontrollera att ingen data kan genereras innan initiering. KRY_FUN_RLB2 Kontrollera att det genereras olika slumptal. MakeRandInt() KRY_FUN_RLB3 Kontrollera att ingen data kan genereras innan initiering. KRY_FUN_RLB4 Kontrollera att det genereras olika slumptal. Dokument: Test av kryptobiblioteket 4

5.4 NumberLib Dessa funktionella tester skall utföras på implementationen: Metod ID Genomförande Aritmetiska operatorer KRY_FUN_NUM1 Beräkna följande formel med några stora tal (>=1024 bit) och små tal (<=32 bit): a + b b = a. KRY_FUN_NUM2 Utför följande beräkningar med några små tal: a += b, och a -= b och jämför resultatet med operatorerna + och -. KRY_FUN_NUM3 Testa operatorn ++ och --. KRY_FUN_NUM4 Beräkna följande formel med några stora och små tal: a * b / b = a och a / b * b + a % b = a, där a % b!= 0. KRY_FUN_NUM5 Utför följande beräkningar med några små tal: a *= b, a \= b och a %= b, jämför resultatet med operatorerna *, / och %. KRY_FUN_NUM6 KRY_FUN_NUM7 Testa jämförelserna: <, >, <= samt >= med några små tal och kontrollera mot det korrekta resultatet. Testa att a b, samt a + b ger rätt resultat med ett negativt b eller a. Kontrollera sedan att a b ger rätt resultat om b>a. Testet kan genomföras med enbart små tal. GCD() KRY_FUN_NUM8 Testa metoden med två primtal. Multiplicera båda talen med ett tal n, kontrollera att gcd (a,b) är lika med n. IsPrime() KRY_FUN_NUM9 Testa metoden med några små tal (<1000) som som är både primtal och komposita. ModularInv() KRY_FUN_NUM10 Testa metoden med några tal. Välj ett slumptal mindre än ett primtal p och invertera talet över Zp, testa att produkten med inversen och talet ger siffran 1. Dokument: Test av kryptobiblioteket 5

5.5 RSA Dessa funktionella tester skall utföras på implementationen: Funktionalitet ID Genomförande SignData() KRY_FUN_RSA1 Generera ett nyckelpar för signering. Exportera privat och publik nyckel från nyckelparet. Skapa en nytt objekt av både privat och publik nyckel. Signera och verifiera en digest (SHA-256) samt kontrollera att resultatet är positivt. KRY_FUN_RSA2 KRY_FUN_RSA3 Testa att verifieringen blir fel om digesten ändras i föregående test. Testa att verifieringen blir fel om signaturen ändras i föregående test. MakeSessionKey() KRY_FUN_RSA4 Generera ett nyckelpar för kryptering. Exportera privat och publik nyckel från nyckelparet. Skapa en nytt objekt av både privat och publik nyckel. Skapa en sessionsnyckel för kryptering. Testa att dekryptera nyckeln och jämför med sessionsnyckeln. KRY_FUN_RSA5 Skapa en ny sessionsnyckel och kontrollera att denna är olika samt att den krypterade nyckeln inte är densamma. 5.6 SHA-256 Dessa funktionella tester skall utföras på implementationen: Metod ID Genomförande EvaluateDigest() KRY_FUN_SHA1 Kontrollera att olika data ger olika digest-värden. 5.7 HMAC-SHA256 Dessa funktionella tester skall utföras på implementationen: Metod ID Genomförande GetMAC() KRY_FUN_MAC1 Kontrollera att olika nycklar ger olika mac-koder med samma data. KRY_FUN_MAC2 Kontrollera att olika data ger olika mac-koder med samma nyckel. Dokument: Test av kryptobiblioteket 6

6 Iterativa tester Genom att utföra funktionella tester av implementationerna kan man kontrollera att de är sunda och kan producera, eller till och med brukar producera, ett korrekt resultat. Detta är långt ifrån ett komplett funktionellt test som kontrollerar att implementationen är fullständig och alltid skapar ett korrekt resultat. Koden kan fortfarande innehålla fel som inträffar vid ovanliga händelser, eller kanske producera enbart en liten mängd utvärden fast något annat förväntats. Det önskvärda är att fullständigt testa implementationerna med samtliga invärden för att kontrollera att de ger ett korrekt resultat, fast det är inte möjligt med tanke på den stora mängden med kombinationer på invärden, exempelvis kombinationer av krypteringsnycklar. Iterativa tester är ett sätta att hantera ovanliga fel. Det går aldrig att garantera att fel av den här typen inte förekommer, men man kan kan kontrollera att om de förekommer i vart fall är mycket osannolika fel som förekommer väldigt sällan. Ett iterativt test består av ett teststeg som upprepas många gånger. Testet går ut på att visa att algoritmen gör vad den ska oavsett invärde. Notera att en implementation trotts att den genomgått iterativa tester mycket väl kan skilja från den implementerade standarden, därför måste ytterligare tester följa då en specifik standard har implementerats. 6.1 AES AES testas på samma vis som Serpent. Dessa iterativa tester skall utföras: KRY_ITT_AES1: Kontrollera om kryptering/dekryptering fungerar utan fel. 1. Skapa en slumpmässig krypteringsnyckel (256 bit). 2. Skapa slumpmässig data med slumpmässig längd (32-8092 bytes). 3. Kryptera och dekryptera datan för att se om resultatet blir detsamma. Upprepa dessa steg med 100 000 iterationer. KRY_ITT_AES2: Kontrollera att samtliga värden av nyckeln påverkar krypteringen. 1. Generera en slumpvis nyckel (256 bit). 2. Skapa ett slumpmässigt datablock och kryptera detta. 3. Ändra (genom invertering) byte för byte hela nyckeln igenom och för varje ändring kontrollera att kryptering med den förändrade nyckeln inte ger samma resultat. Upprepa dessa steg med 100 000 iterationer. Dokument: Test av kryptobiblioteket 7

6.2 Serpent De iterativa testen för Serpent ska visa att (1) krypteringen fungerar vilket är en indikation på att algoritmen är korrekt implementerad och (2) att varje byte av krypteringsnyckeln påverkar resultatet vid kryptering vilket visar att hela krypteringsnyckeln används. Dessa iterativa tester skall utföras: KRY_ITT_SER1: Kontrollera om kryptering/dekryptering fungerar utan fel. 1. Skapa en slumpmässig krypteringsnyckel (256 bit). 2. Skapa slumpmässig data med slumpmässig längd (32-8092 bytes). 3. Kryptera och dekryptera datan för att se om resultatet blir densamma. Upprepa dessa steg med 100 000 iterationer. KRY_ITT_SER2: Kontrollera att samtliga värden av nyckel påverkar krypteringen. 1. Generera en slumpvis nyckel (256 bit). 2. Skapa ett slumpmässigt datablock och kryptera detta. 3. Ändra (genom invertering) byte för byte hela nyckeln igenom och för varje ändring kontrollera att kryptering med den förändrade nyckeln inte ger samma resultat. Upprepa dessa steg med 100 000 iterationer. 6.3 RandLib Det är svårt att visa att slumptal verkligen är slumptal, men om algoritmen kan generera 100 000 unika krypteringsnycklar är detta en indikation på att implementationen fungerar. Dessa iterativa tester skall utföras: KRY_ITT_RLB1: Kontrollera att slumptalen är unika. 1. Generera en slumpvis nyckel (256 bit). 2. Kontrollera att nyckeln inte har genererats tidigare. Upprepa dessa steg med 100 000 iterationer. Dokument: Test av kryptobiblioteket 8

6.4 NumberLib I NumberLib ska de grundläggande aritmetiska operationerna testas samt test av primtal. De grundläggande aritmetiska operationerna testas genom att skapa en serie med slumptal och sedan addera och subtrahera dessa talen till varandra, eller multiplicera och dividera. Kedjor av multiplikationer resulterar i mycket stora tal, därför har mindre kedjor av multiplikation/division upprepats flera gånger. Det är också svårt att testa att tal verkligen är primtal utan att utvärdera mot en separat algoritm, däremot kan man med fördel kontrollera att algoritmen inte godkänner tal som inte är primtal, dvs att algoritmen inte gör fel istället för att kontrollera att den gör rätt. Funktionerna för modulär exponering och modulär invertering är säkerhetskritiska men testas inte eftersom dessa anses testas senare i samband med tester av RSA-implementationen. Dessa iterativa tester skall utföras: KRY_ITT_NUM1: Addition och subtraktion. Skapa en serie med slumptal av olika storlek. Addera talen till varandra, subtrahera sedan alla talen i samma ordning utan det sista. Kontrollera att det kvarvarande värdet stämmer överens med det sista talet. A + B + C +... + M + N - A - B - C... - M = N Testet ska utföras med 100 000 slumpvis tal av olika slumpvis storlek mellan 512-4096 bit. KRY_ITT_NUM2: Multiplikation och division. Samma test som för addition/subtraktion fast med operationerna multiplikation och sedan division skall utföras. Testet utförs med 20st tal med en storlek slumpvis vald mellan 32-128bit, vilket ger en maximal produkt på 2560 bit innan division. Detta testet utförs sedan 1 000 000 gånger. KRY_ITT_NUM3: Test av primtalstest. 1. Skapa två slumpvisa tal. 2. Multiplicera samman dessa tal. Kontrollera att produkten inte klassas som primtal. Upprepa testet med följande värden: 256bit tal 5 milj iterationer 512bit tal 1 milj iterationer 1024bit tal 100 000 iterationer Dokument: Test av kryptobiblioteket 9

KRY_ITT_NUM4: Test av modulär invertering. 1. Välj ett slumpvis tal n med längden 64-4096bit. 2. Välj ett slumpvis tal a med slumpvis längd som är mindre än n. 3. Beräkna inversen till a över (mod n), om den inte finns fortsätt med nästa iteration. 4. Kontrollera att (invers * a) mod n = 1, annars skriv ut fel. Detta testet utförs sedan 500 000 gånger. 6.5 RSA RSA implementationen testas genom att testa att nyckelgenerering och kryptering/dekryptering, alt signering/verifiering fungerar. Eftersom kryptering/verifiering samt dekryptering/signering sker med två olika beräkningar (=asymmetrisk kryptering) kan detta anses vara ett bra test på att algoritmen fungerar för de testade invärdena. Dessa iterativa tester skall utföras: KRY_ITT_RSA1: Test av kryptering 1. Generera ett nyckelpar (kryptering) 2. Upprepa x ggr: 2.1 Skapa sessionsnyckel och krypterad sessionsnyckel (MakeSessionKey). 2.2 Kontrollera om någon av nycklarna har genererats tidigare. 2.3 Dekryptera krypteringsnyckeln och kontrollera att sessionsnycklarna stämmer överens. Testet upprepas med följande värden: 512bit nyckel: x=100, 10 000 iterationer 1024bit nyckel: x=100, 1000 iterationer 2048bit nyckel: x=500, 200 iterationer KRY_ITT_RSA2: Test av signering 1. Generera ett nyckepar (signering) 2. Upprepa x ggr: 2.1 Generera ett 256bit slumptal (för att simulera SHA-256 värde) 2.2 Signera värdet (SignData()). 2.3 Kontrollera om signaturen är unik och inte har förekommit tidigare. 2.4 Verifiera att signaturen är korrekt. 2.4 Ändra slumptalet och verifiera att signaturen blir fel. Testet upprepas med följande värden: 512bit nyckel: x=10, 10 000 iterationer 1024bit nyckel: x=10, 1000 iterationer 2048bit nyckel: x=7, 200 iterationer Dokument: Test av kryptobiblioteket 10

6.6 SHA-256 SHA-256 kontrolleras genom att testa att en ändring i data (ändring av slumpvis byte, förkortning och förläng) resulterar i en ändring av digest-värde. Algoritmen testas även genom att kontrollera att digest-värdet som genereras är unikt. Dessa iterativa tester skall utföras: KRY_ITT_SHA1: Kontroll att ändrad data ger nytt värde 1. Beräkna en mängd slumptal 2N, där N:s längd väljs slumpmässigt mellan 2-8192 bytes. 2. Beräkna SHA-värdet av slumptalen N (första halvan av slumptal). 2.1 Ändra ett slumpvis valt värde i N genom att invertera byten. Kontrollera att värdet ändras. 2.2 Gör datan mindre (krymp längden slumpmässigt till 0..N-1). Kontrollera att värdet ändras. 2.3 Lägg till data (öka längden slumpmässigt till N+1...2N). Kontrollera att värdet ändras. Upprepa testet med 1 000 000 iterationer. KRY_ITT_SHA2: Kontrollera att digest-värdet är unikt. 1. Skapa en slumpvis data med längden 64-8192 bytes. 2. Kontrollera att digest-värdet inte har genererats tidigare. Upprepa testet med 100 000 iterationer 6.7 HMAC-SHA256 Inga iterativa tester ska utföras av hmac, orsaken är att implementationen starkt bygger på SHA-256 som redan har testats med iterativa tester. Dokument: Test av kryptobiblioteket 11

7 Test av conformance Dessa tester går ut på att kontrollera att implementationen stämmer överens med den implementerade standarden (conformance). Detta är väldigt viktigt när det gäller kryptokod, en implementation kan vara fullt fungerande på så vis att data krypteras och dekrypteras utan fel, men trotts detta kan implementationen avvika från den tänkta standarden. Dessa typer av fel är också mycket vanliga. Det är därför viktigt att testa att implementationen stämmer exakt överens med de standarder som ska implementeras. Detta görs normalt via tester med testvektorer (black-box tester) från en referensimplementation. De tester som ska utföras av kryptobiblioteket är så långt det är möjligt hämtade från NIST:s valideringssystem Cryptographic Algorithm Validation System (CAVS). CAVS är grunden för validering av kryptomoduler enligt FIPS 140-2 och finns beskrivna i offentliga dokument som är tillgängliga på NIST:s hemsida. Där finns även de testvektorer som behövs för att utföra testerna. Alla tester enligt CAVS ska inte genomföras utan enbart de viktigaste testen. 7.1 Serpent och AES Hur AES ska testas enligt CAVP finns beskrivet i AES Algorithm Validation System (AESAVS) som inkluderar tre olika tester av krypteringsalgoritmen, Known Answer Tests (KAT), Monte Carlo Tests (MCT) och Multi-block Message Tests (MMT). Testvektorer för AES finns tillgängliga via NIST:s hemsida. Motsvarande testvektorer för Serpent finns tillgängliga via Serpent algoritmens hemsida, eftersom Serpent var en kandidat till AES så publicerades testvektorerna på detta format samtidigt som algoritmen offentliggjordes. Det går därför utmärkt att utföra de tester som beskrivs i AESAVS även på Serpent. Known Anser Tests (KAT) är tester där par av invärden och utvärden till kryptografiska primitiver testas för att kontrollera att implementationer stämmer överens med standarden. KAT finns i två serier, en med variabelt block och en med variabel nyckel. Det finns även olika serier för respektive nyckellängd och för AES även serier för S-boxar och andra interna värden. Monte Carlo Tests (MCT) är en variant på KAT-tester där algoritmen itereras i en stor serie av iterationer inkluderande både key-setup och kryptering/dekryptering. Det slutgiltiga resultatet ska sedan stämma överens med standarden. Multi-block Message Tests (MMT) är tester av längre meddelanden som testar att krypteringsläget har implementerats korrekt. Dessa tester är inte lika viktiga i detta fallet eftersom främst ECB (nycklar) och CBC (övrig data) används vilket är relativt enkla krypteringslägen. MMT är framförallt motiverat när mer avancerade krypteringslägen används. MMT behöver inte utföras av någon av algoritmerna. Dokument: Test av kryptobiblioteket 12

7.1.1 AES AES ska testas på samma vis som Serpent, skillnaden är att MCT utförs med lite färre iterationer för att sammanfalla med AESAVS testvektorer. AESAVS testvektorer för KAT inkluderar även dekryptering och andra krypteringslägen, dessa tester behöver inte utföras. Följande tester skall utföras: ID KRY_ALG_AES1 KRY_ALG_AES2 KRY_ALG_AES3 Genomförande KAT med variable key skall utföras på algoritmen för alla tre nyckellängder vid kryptering i ECB enligt AESAVS. KAT med variable text skall utföras på algoritmen för alla tre nyckellängder vid kryptering i ECB enligt AESAVS. MCT för kryptering och dekryptering skall utföras enligt AESAVS, slutvärdet efter sista iterationen jämförs med förväntat resultat. Alla tre nyckellängder för AES skall testas (totalt 6st MCT om vardera 100 000 iterationer). 7.1.2 Serpent Fullständiga KAT och MCT för ECB skall utföras av algoritmen för att kontrollera S-boxar och andra interna funktioner. MMT behöver inte utföras. Följande tester skall utföras: ID KRY_ALG_SER1 KRY_ALG_SER2 KRY_ALG_SER3 Genomförande KAT med variable key skall utföras på algoritmen för alla tre nyckellängder enligt AESAVS och testvektorer för Serpent. KAT med variable text skall utföras på algoritmen för alla tre nyckellängder enligt AESAVS och testvektorer för Serpent. MCT för kryptering och dekryptering skall utföras enligt AESAVS och testvektorer för Serpent, slutvärdet efter sista iterationen jämförs med förväntat resultat. Alla tre nyckellängder för Serpent skall testas (totalt 6st MCT om vardera 4 milj. iterationer). Dokument: Test av kryptobiblioteket 13

7.2 SHA-256 Hur SHA-2 (som inkluderar SHA-256) ska testas enligt CAVS finns beskrivet i SHAVS som inkluderar tre olika tester, The Short Message Test, The Selected Long Message Test och Te Random Message Test. Dessutom finns det enklare testvektorer i dokumentet FIPS 180-2 appendix B. Följande tester skall utföras: ID KRY_ALG_SHA1 KRY_ALG_SHA2 KRY_ALG_SHA3 KRY_ALG_SHA4 Genomförande De testvektorer som finns beskriva i FIPS-PUB-180-2 appendix B skall testas. The Short Message Test (byte-oriented) skall utföras enligt SHAVS. The Selected Long Message Test (byte-oriented) skall utföras enligt SHAVS. The Random Message Test skall utföras enligt SHAVS, det slutgiltiga värdet efter sista iterationen jämförs med det förväntade värdet (100 000 iterationer). 7.3 HMAC-SHA256 Inga tester av conformance behöver utföras på HMAC-SHA256 eftersom tester av den underliggande algoritmen (SHA-256) tillsammans med övriga tester anses tillräckliga. 7.4 RSA Inga tester av conformance behöver utföras av RSA utan de iterativa testerna som utförts anses tillräckliga för att visa att implementationen fungerar (eftersom det är en asymmetrisk algoritm och kryptering/dekryptering är helt olika). 8 Automatiserade tester Alla tester i detta dokument skall implementeras så att de utförs automatiskt av programmet krypto_test. Programmet kan sedan kompileras och köras efter att det gjorts ändringar i koden eller inför en ny version av klient/server eller hjälpprogram. Dokument: Test av kryptobiblioteket 14