Skip to content

Commit e1514d0

Browse files
committed
Add OPEN SYMMETRIC KEY DECRYPTION BY clause parsing
- Update OpenSymmetricKeyStatement to use CryptoMechanism for DecryptionMechanism - Parse DECRYPTION BY with CERTIFICATE, ASYMMETRIC KEY, SYMMETRIC KEY, PASSWORD - Handle optional WITH PASSWORD clause for CERTIFICATE and ASYMMETRIC KEY - Support both regular strings and national strings (N'...') for passwords Enables: Baselines90_OpenSymmetricKeyStatementTests
1 parent a8a51c6 commit e1514d0

5 files changed

Lines changed: 85 additions & 9 deletions

File tree

ast/trivial_statements.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ func (s *OpenMasterKeyStatement) statement() {}
7777
// OpenSymmetricKeyStatement represents OPEN SYMMETRIC KEY statement
7878
type OpenSymmetricKeyStatement struct {
7979
Name *Identifier
80-
DecryptionMechanism string // "Key", "Certificate", "Password", "AsymmetricKey"
81-
DecryptionKey ScalarExpression
80+
DecryptionMechanism *CryptoMechanism
8281
}
8382

8483
func (s *OpenSymmetricKeyStatement) node() {}

parser/marshal.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4559,11 +4559,8 @@ func openSymmetricKeyStatementToJSON(s *ast.OpenSymmetricKeyStatement) jsonNode
45594559
if s.Name != nil {
45604560
node["Name"] = identifierToJSON(s.Name)
45614561
}
4562-
if s.DecryptionMechanism != "" {
4563-
node["DecryptionMechanism"] = s.DecryptionMechanism
4564-
}
4565-
if s.DecryptionKey != nil {
4566-
node["DecryptionKey"] = scalarExpressionToJSON(s.DecryptionKey)
4562+
if s.DecryptionMechanism != nil {
4563+
node["DecryptionMechanism"] = cryptoMechanismToJSON(s.DecryptionMechanism)
45674564
}
45684565
return node
45694566
}

parser/parse_statements.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4980,6 +4980,86 @@ func (p *Parser) parseOpenStatement() (ast.Statement, error) {
49804980
}
49814981
p.nextToken() // consume KEY
49824982
stmt := &ast.OpenSymmetricKeyStatement{Name: p.parseIdentifier()}
4983+
4984+
// Parse DECRYPTION BY <mechanism>
4985+
if p.curTok.Type == TokenDecryption {
4986+
p.nextToken() // consume DECRYPTION
4987+
if p.curTok.Type == TokenBy {
4988+
p.nextToken() // consume BY
4989+
}
4990+
mechanism := &ast.CryptoMechanism{}
4991+
upperLit := strings.ToUpper(p.curTok.Literal)
4992+
4993+
switch upperLit {
4994+
case "CERTIFICATE":
4995+
p.nextToken() // consume CERTIFICATE
4996+
mechanism.CryptoMechanismType = "Certificate"
4997+
mechanism.Identifier = p.parseIdentifier()
4998+
// Check for optional WITH PASSWORD
4999+
if p.curTok.Type == TokenWith {
5000+
p.nextToken() // consume WITH
5001+
if p.curTok.Type == TokenPassword {
5002+
p.nextToken() // consume PASSWORD
5003+
if p.curTok.Type == TokenEquals {
5004+
p.nextToken() // consume =
5005+
}
5006+
if p.curTok.Type == TokenNationalString {
5007+
str, _ := p.parseNationalStringFromToken()
5008+
mechanism.PasswordOrSignature = str
5009+
} else if p.curTok.Type == TokenString {
5010+
mechanism.PasswordOrSignature = p.parseStringLiteralValue()
5011+
p.nextToken()
5012+
}
5013+
}
5014+
}
5015+
case "ASYMMETRIC":
5016+
p.nextToken() // consume ASYMMETRIC
5017+
if p.curTok.Type == TokenKey {
5018+
p.nextToken() // consume KEY
5019+
}
5020+
mechanism.CryptoMechanismType = "AsymmetricKey"
5021+
mechanism.Identifier = p.parseIdentifier()
5022+
// Check for optional WITH PASSWORD
5023+
if p.curTok.Type == TokenWith {
5024+
p.nextToken() // consume WITH
5025+
if p.curTok.Type == TokenPassword {
5026+
p.nextToken() // consume PASSWORD
5027+
if p.curTok.Type == TokenEquals {
5028+
p.nextToken() // consume =
5029+
}
5030+
if p.curTok.Type == TokenNationalString {
5031+
str, _ := p.parseNationalStringFromToken()
5032+
mechanism.PasswordOrSignature = str
5033+
} else if p.curTok.Type == TokenString {
5034+
mechanism.PasswordOrSignature = p.parseStringLiteralValue()
5035+
p.nextToken()
5036+
}
5037+
}
5038+
}
5039+
case "SYMMETRIC":
5040+
p.nextToken() // consume SYMMETRIC
5041+
if p.curTok.Type == TokenKey {
5042+
p.nextToken() // consume KEY
5043+
}
5044+
mechanism.CryptoMechanismType = "SymmetricKey"
5045+
mechanism.Identifier = p.parseIdentifier()
5046+
case "PASSWORD":
5047+
p.nextToken() // consume PASSWORD
5048+
if p.curTok.Type == TokenEquals {
5049+
p.nextToken() // consume =
5050+
}
5051+
mechanism.CryptoMechanismType = "Password"
5052+
if p.curTok.Type == TokenNationalString {
5053+
str, _ := p.parseNationalStringFromToken()
5054+
mechanism.PasswordOrSignature = str
5055+
} else if p.curTok.Type == TokenString {
5056+
mechanism.PasswordOrSignature = p.parseStringLiteralValue()
5057+
p.nextToken()
5058+
}
5059+
}
5060+
stmt.DecryptionMechanism = mechanism
5061+
}
5062+
49835063
if p.curTok.Type == TokenSemicolon {
49845064
p.nextToken()
49855065
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)