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 $ 
							 |