92 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | Tech Note 0006 | ||
|  | PK Standards Compliance | ||
|  | Tom St Denis | ||
|  | 
 | ||
|  | RSA | ||
|  | ---- | ||
|  | 
 | ||
|  | PKCS #1 compliance. | ||
|  | 
 | ||
|  | Key Format:  RSAPublicKey and RSAPrivateKey as per PKCS #1 v2.1 | ||
|  | Encryption:  OAEP as per PKCS #1 | ||
|  | Signature :  PSS  as per PKCS #1 | ||
|  | 
 | ||
|  | DSA | ||
|  | ---- | ||
|  | 
 | ||
|  | The NIST DSA algorithm | ||
|  | 
 | ||
|  | Key Format:  HomeBrew [see below] | ||
|  | Signature :  ANSI X9.62 format [see below]. | ||
|  | 
 | ||
|  | Keys are stored as  | ||
|  | 
 | ||
|  | DSAPublicKey ::= SEQUENCE { | ||
|  |     publicFlags    BIT STRING(1), -- must be 0 | ||
|  |     g              INTEGER      , -- base generator, check that g^q mod p == 1 | ||
|  |                                   -- and that 1 < g < p - 1 | ||
|  |     p              INTEGER      , -- prime modulus  | ||
|  |     q              INTEGER      , -- order of sub-group (must be prime) | ||
|  |     y              INTEGER      , -- public key, specifically, g^x mod p,  | ||
|  |                                   -- check that y^q mod p == 1 | ||
|  |                                   -- and that 1 < y < p - 1 | ||
|  | } | ||
|  | 
 | ||
|  | DSAPrivateKey ::= SEQUENCE { | ||
|  |     publicFlags    BIT STRING(1), -- must be 1 | ||
|  |     g              INTEGER      , -- base generator, check that g^q mod p == 1 | ||
|  |                                   -- and that 1 < g < p - 1 | ||
|  |     p              INTEGER      , -- prime modulus  | ||
|  |     q              INTEGER      , -- order of sub-group (must be prime) | ||
|  |     y              INTEGER      , -- public key, specifically, g^x mod p,  | ||
|  |                                   -- check that y^q mod p == 1 | ||
|  |                                   -- and that 1 < y < p - 1 | ||
|  |     x              INTEGER        -- private key | ||
|  | } | ||
|  | 
 | ||
|  | Signatures are stored as  | ||
|  | 
 | ||
|  | DSASignature ::= SEQUENCE { | ||
|  |     r, s           INTEGER        -- signature parameters | ||
|  | } | ||
|  | 
 | ||
|  | ECC | ||
|  | ---- | ||
|  | 
 | ||
|  | The ANSI X9.62 and X9.63 algorithms [partial].  Supports all NIST GF(p) curves. | ||
|  | 
 | ||
|  | Key Format   :  Homebrew [see below, only GF(p) NIST curves supported] | ||
|  | Signature    :  X9.62 compliant | ||
|  | Encryption   :  Homebrew [based on X9.63, differs in that the public point is stored as an ECCPublicKey] | ||
|  | Shared Secret:  X9.63 compliant | ||
|  | 
 | ||
|  | ECCPublicKey ::= SEQUENCE { | ||
|  |     flags       BIT STRING(1), -- public/private flag (always zero),  | ||
|  |     keySize     INTEGER,       -- Curve size (in bits) divided by eight  | ||
|  |                                -- and rounded down, e.g. 521 => 65 | ||
|  |     pubkey.x    INTEGER,       -- The X co-ordinate of the public key point | ||
|  |     pubkey.y    INTEGER,       -- The Y co-ordinate of the public key point | ||
|  | } | ||
|  | 
 | ||
|  | ECCPrivateKey ::= SEQUENCE { | ||
|  |     flags       BIT STRING(1), -- public/private flag (always one),  | ||
|  |     keySize     INTEGER,       -- Curve size (in bits) divided by eight  | ||
|  |                                -- and rounded down, e.g. 521 => 65 | ||
|  |     pubkey.x    INTEGER,       -- The X co-ordinate of the public key point | ||
|  |     pubkey.y    INTEGER,       -- The Y co-ordinate of the public key point | ||
|  |     secret.k    INTEGER,       -- The secret key scalar | ||
|  | } | ||
|  | 
 | ||
|  | The encryption works by finding the X9.63 shared secret and hashing it.  The hash is then simply XOR'ed against the message [which must be at most the size | ||
|  | of the hash digest].  The format of the encrypted text is as follows | ||
|  | 
 | ||
|  | ECCEncrypted ::= SEQUENCE { | ||
|  |     hashOID     OBJECT IDENTIFIER,   -- The OID of the hash used | ||
|  |     pubkey      OCTET STRING     ,   -- Encapsulation of a random ECCPublicKey | ||
|  |     skey        OCTET STRING         -- The encrypted text (which the hash was XOR'ed against) | ||
|  | } | ||
|  | 
 | ||
|  | % $Source: /cvs/libtom/libtomcrypt/notes/tech0006.txt,v $    | ||
|  | % $Revision: 1.2 $    | ||
|  | % $Date: 2005/06/18 02:26:27 $  |